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

1"""Decodo proxy helpers for HRNZ scraping.""" 

2 

3from __future__ import annotations 

4 

5import os 

6import secrets 

7 

8 

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() 

14 

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}" 

21 

22 if not (server and username and password): 

23 return None 

24 

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 = "" 

31 

32 if rotate: 

33 session_id = secrets.token_hex(8) 

34 else: 

35 session_id = os.getenv("HRNZ_DECODO_SESSION_ID", "").strip() 

36 

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}" 

42 

43 return {"server": server, "username": username, "password": password}