Skip to main content

Automatic Safeway coupon clipper

PyPI PyPI - Python Version Build codecov GitHub stars

safeway-coupons is a script that will log in to an account on safeway.com, and attempt to select all of the "Safeway for U" electronic coupons on the site so they don't have to each be clicked manually.

Design notes

Safeway's sign in page is protected by a web application firewall (WAF). safeway-coupons performs authentication using a headless instance of Google Chrome. Authentication may fail based on your IP's reputation, either by presenting a CAPTCHA or denying sign in attempts altogether. safeway-coupons currently does not have support for prompting the user to solve CAPTCHAs.

Once a signed in session is established, coupon clipping is performed using HTTP requests via requests.

Installation and usage with Docker

A Docker container is provided which runs safeway-coupons with cron. The cron schedule and your Safeway account details may be configured using environment variables, or with an accounts file.

Example docker-compose.yaml with configuration via environment variables:

version: "3.7"

services:
  safeway-coupons:
    image: ghcr.io/smkent/safeway-coupons:latest
    environment:
      CRON_SCHEDULE: "0 2 * * *"  # Run at 2:00 AM UTC each day
      # TZ: Antarctica/McMurdo  # Optional time zone to use instead of UTC
      SMTPHOST: your.smtp.host
      SAFEWAY_ACCOUNT_USERNAME: your.safeway.account.email@example.com
      SAFEWAY_ACCOUNT_PASSWORD: very_secret
      SAFEWAY_ACCOUNT_MAIL_FROM: your.email@example.com
      SAFEWAY_ACCOUNT_MAIL_TO: your.email@example.com
      # EXTRA_ARGS: --debug  # Optional
    restart: unless-stopped

Example docker-compose.yaml with configuration via accounts file:

version: "3.7"

services:
  safeway-coupons:
    image: ghcr.io/smkent/safeway-coupons:latest
    environment:
      CRON_SCHEDULE: "0 2 * * *"  # Run at 2:00 AM UTC each day
      # TZ: Antarctica/McMurdo  # Optional time zone to use instead of UTC
      SMTPHOST: your.smtp.host
      SAFEWAY_ACCOUNTS_FILE: /accounts_file
      # EXTRA_ARGS: --debug  # Optional
    restart: unless-stopped
    volumes:
      - path/to/safeway_accounts_file:/accounts_file:ro

Start the container by running:

docker-compose up -d

Debugging information can be viewed in the container log:

docker-compose logs -f

Installation from PyPI

Prerequisites

  • Google Chrome (for authentication performed via Selenium).
  • Optional: sendmail (for email support)

Installation

safeway-coupons is available on PyPI:

pip install safeway-coupons

Usage

For best results, run this program once a day or so with a cron daemon.

For full usage options, run

safeway-coupons --help

Configuration

safeway-coupons can clip coupons for one or more Safeway accounts in a single run, depending on the configuration method used.

If a sender email address is configured, a summary email will be sent for each Safeway account via sendmail. The email recipient defaults to the Safeway account email address, but can be overridden for each account.

Accounts are searched via the following methods in the listed order. Only one account configuration method may be used at a time.

With environment variables

A single Safeway account can be configured with environment variables:

  • SAFEWAY_ACCOUNT_USERNAME: Account email address (required)
  • SAFEWAY_ACCOUNT_PASSWORD: Account password (required)
  • SAFEWAY_ACCOUNT_MAIL_FROM: Sender address for email summary
  • SAFEWAY_ACCOUNT_MAIL_TO: Recipient address for email summary

With config file

Multiple Safeway accounts can be provided in an ini-style config file, with a section for each account. For example:

email_sender = sender@example.com   ; optional

[safeway.account@example.com]       ; required
password = 12345                    ; required
notify = your.email@example.com     ; optional

Provide the path to your config file using the -c or --accounts-config option:

safeway-coupons -c path/to/config/file

Development

Poetry installation

Via pipx:

pip install pipx
pipx install poetry
pipx inject poetry poetry-pre-commit-plugin

Via pip:

pip install poetry
poetry self add poetry-pre-commit-plugin

Invocation with docker-compose

safeway-coupons can be executed within a Docker container using docker-compose.dev.yaml.

To use, first create an accounts file in the same directory with your safeway-coupons accounts configuration. Then, execute safeway-coupons within a container using docker-compose:

docker-compose -f docker-compose.dev.yaml up --build

The container will run safeway-coupons once, attempt to clip one coupon, and then stop.

To change the safeway-coupons arguments, modify the command value in docker-compose.dev.yaml.

When finished with development tasks, the docker-compose state can be cleaned up with:

docker-compose -f docker-compose.dev.yaml down

Development tasks

  • Setup: poetry install
  • Run static checks: poetry run poe lint or poetry run pre-commit run --all-files
  • Run static checks and tests: poetry run poe test

Created from smkent/cookie-python using cookiecutter

Metadata

Release files for safeway-coupons 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for safeway-coupons 0.3.0
File Size Uploaded
safeway_coupons-0.3.0.tar.gz 25.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for safeway-coupons 0.3.0
File Interpreter ABI Platform
safeway_coupons-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 53.0 kB

Release files / safeway_coupons-0.3.0.tar.gz

Download URL safeway_coupons-0.3.0.tar.gz
Size 25.5 kB
Tags Source
SHA-256 checksum
How to use checksums
c00263662e313f40831a3dede4457df5cd4f1651667212a8c588c7fd81a5daf7
BLAKE2b-256 checksum
How to use checksums
c007c0dc75041e4f2d5a060f88c5cbd3458a575e576b65861cf265ee62c2639f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.0.1 CPython/3.12.8

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jan 15, 2025.

Transparency log

Release files / safeway_coupons-0.3.0-py3-none-any.whl

Download URL safeway_coupons-0.3.0-py3-none-any.whl
Size 27.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
407fd506f569b498e5bfa8ad3e4db70d46a960395249fd03aeec45f4773a3709
BLAKE2b-256 checksum
How to use checksums
7ecdea2ea90c0e7b899b1a0c7212e697d0c1ca8d93ec7e7167a1029320a780ec
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.0.1 CPython/3.12.8

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jan 15, 2025.

Transparency log

Release history Release notifications | RSS feed

This release

0.3.0 This release

2 release files

0.2.11

2 release files

0.2.10

2 release files

0.2.9

2 release files

0.2.8

2 release files

0.2.7

2 release files

0.2.6

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.15

2 release files

0.1.14

2 release files

0.1.13

2 release files

0.1.12

2 release files

0.1.11

2 release files

0.1.10

2 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page