Coverage for packages / hrnz_scraper / proxy.py: 14%
28 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-05-08 08:37 +1200
« prev ^ index » next coverage.py v7.13.5, created at 2026-05-08 08:37 +1200
1"""Decodo proxy helpers for HRNZ scraping."""
3from __future__ import annotations
5import os
6import secrets
9def build_decodo_proxy() -> dict[str, str] | None:
10 """Build a Decodo proxy config for Playwright, rotating session per request."""
11 server = os.getenv("HRNZ_DECODO_PROXY_SERVER", "").strip()
12 username = os.getenv("HRNZ_DECODO_PROXY_USERNAME", "").strip()
13 password = os.getenv("HRNZ_DECODO_PROXY_PASSWORD", "").strip()
15 if not server:
16 host = os.getenv("HRNZ_DECODO_PROXY_HOST", "").strip()
17 port = os.getenv("HRNZ_DECODO_PROXY_PORT", "").strip()
18 scheme = os.getenv("HRNZ_DECODO_PROXY_SCHEME", "http").strip() or "http"
19 if host and port:
20 server = f"{scheme}://{host}:{port}"
22 if not (server and username and password):
23 return None
25 rotate_raw = os.getenv("HRNZ_DECODO_ROTATE_EACH_REQUEST", "true").strip()
26 rotate = rotate_raw.lower() not in ("0", "false", "no", "n")
27 session_param = (
28 os.getenv("HRNZ_DECODO_SESSION_PARAM", "session").strip() or "session"
29 )
30 session_id = ""
32 if rotate:
33 session_id = secrets.token_hex(8)
34 else:
35 session_id = os.getenv("HRNZ_DECODO_SESSION_ID", "").strip()
37 template = os.getenv("HRNZ_DECODO_USERNAME_TEMPLATE", "").strip()
38 if template and session_id:
39 username = template.format(username=username, session=session_id)
40 elif session_id:
41 username = f"{username}-{session_param}-{session_id}"
43 return {"server": server, "username": username, "password": password}