recipe box — import-by-URL recipe manager with a scalable cooking view (bunko.me/recipes)
  • Python 43.6%
  • HTML 40.2%
  • JavaScript 15.7%
  • Dockerfile 0.5%
Find a file
bunko a10d3622ca Fetch pages with a browser TLS fingerprint (curl_cffi) to beat Cloudflare
Serious Eats / Simply Recipes / Allrecipes / Food Network sit behind Cloudflare
Bot Management, which fingerprints the HTTP client (TLS/HTTP2) and returns a 403
"challenge" regardless of source IP — so neither a User-Agent tweak nor a
residential proxy gets through (confirmed: cf-mitigated: challenge on both the
datacenter IP and an ms-01-proxied residential IP). Switch scrape.py's fetch to
curl_cffi with browser impersonation, trying chrome124 then safari — the latest
Chrome fingerprint is itself challenged, while 124 and Safari pass. Unblocks all
four publishers for both paste-a-link import and the AI link verifier.

- scrape._fetch(): impersonation chain, configurable via RECIPES_IMPERSONATE.
- scrape.can_import(): shared verify path; the AI verifier now calls it
  (concurrently in threads) instead of a separate httpx fetch, so verification
  matches the real import exactly. Dropped the old "avoid these sites" steering
  in ai.py — they import fine now, so the model can recommend them again.
- curl_cffi==0.15.0 added to requirements.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 12:37:13 -05:00
app Fetch pages with a browser TLS fingerprint (curl_cffi) to beat Cloudflare 2026-06-18 12:37:13 -05:00
.env.example Fetch pages with a browser TLS fingerprint (curl_cffi) to beat Cloudflare 2026-06-18 12:37:13 -05:00
.gitignore Add recipe box: import-by-URL + scalable cooking view 2026-06-18 01:40:55 -05:00
docker-compose.yml Add "Ask AI" recipe finder (OpenRouter web search) 2026-06-18 12:22:40 -05:00