def capture(url, locale, zone):
taken = datetime.now(timezone.utc)
folder = OUT / f"{urlsplit(url).hostname}-{taken:%Y%m%dT%H%M%SZ}"
folder.mkdir(parents=True)
proxy = os.environ.get("APOSTATE_PROXY")
# Behind a proxy, the package sets locale and timezone from the proxy's exit.
region = {} if proxy else {"locale": locale, "timezone": zone, "geoip": False}
with launch(fingerprint=SEED, fingerprint_platform=PERSONA, proxy=proxy, **region,
record_har_path=folder / "page.har") as browser:
page = browser.new_page()
response = page.goto(url, wait_until="networkidle")
page.screenshot(path=folder / "screenshot.png", full_page=True)
# page.pdf() works only in a headless browser, which is the default.
page.pdf(path=folder / "page.pdf", format="A4", print_background=True)
(folder / "page.html").write_text(page.content(), encoding="utf-8")
seen = page.evaluate("""() => ({
userAgent: navigator.userAgent,
language: navigator.language,
timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
})""")
details = {"final_url": page.url, "status": response.status, "title": page.title(),
"browser": browser.version}
# The HAR file is complete once the browser has closed.
manifest = {
"url": url,
**details,
"captured_at": taken.isoformat(timespec="seconds"),
"persona": PERSONA,
"seed": SEED,
"apostate": version("apostate"),
"proxy": bool(proxy),
**seen,
"files": {path.name: {"bytes": path.stat().st_size, "sha256": sha256(path)}
for path in sorted(folder.iterdir())},
}
(folder / "manifest.json").write_text(json.dumps(manifest, indent=2) + "\n")
return folder, manifest