From 9d447b9ff1422ab7dba1f52d8965dd189b50aa96 Mon Sep 17 00:00:00 2001 From: Marius Mutu Date: Fri, 3 Apr 2026 17:06:00 +0000 Subject: [PATCH] fix(newsletter): use follow_redirects=False to avoid false positive on 404 redirect Beehiiv redirects non-existent newsletters to /?404=... with HTTP 302. With follow_redirects=True, the final 200 was misread as "newsletter exists". Fix: disable redirect following so only a direct HTTP 200 = newsletter real. Also reset state back to last_sent=13 (real). Co-Authored-By: Claude Sonnet 4.6 --- cron/newsletter-cercetasi-state.json | 6 +----- src/newsletter_cercetasi.py | 8 ++++++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cron/newsletter-cercetasi-state.json b/cron/newsletter-cercetasi-state.json index 0c82c80..7177e0a 100644 --- a/cron/newsletter-cercetasi-state.json +++ b/cron/newsletter-cercetasi-state.json @@ -1,5 +1 @@ -{ - "last_sent": 13, - "year": 2026, - "last_sent_at": "2026-04-02T18:59:37.878273+00:00" -} +{"last_sent": 13, "year": 2026, "last_sent_at": "2026-04-02T18:18:46.000000+00:00"} diff --git a/src/newsletter_cercetasi.py b/src/newsletter_cercetasi.py index 0729f02..c113623 100644 --- a/src/newsletter_cercetasi.py +++ b/src/newsletter_cercetasi.py @@ -35,10 +35,14 @@ def _write_state(state: dict) -> None: async def _newsletter_exists(n: int, year: int) -> bool: - """Return True if newsletter #{n}/{year} returns HTTP 200.""" + """Return True if newsletter #{n}/{year} exists (HTTP 200, no redirect to 404 page). + + Beehiiv redirects non-existent newsletters: /p/newsletter-N-din-YEAR → /?404=... (302) + A real newsletter returns 200 directly without redirect. + """ url = NEWSLETTER_BASE_URL.format(n=n, year=year) try: - async with httpx.AsyncClient(follow_redirects=True) as client: + async with httpx.AsyncClient(follow_redirects=False) as client: resp = await client.get(url, timeout=10) return resp.status_code == 200 except Exception as e: