From 52e2139ff49c72b4e218953874a62ffb014c2c86 Mon Sep 17 00:00:00 2001 From: Franklin-F Date: Wed, 4 Jun 2025 21:35:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20CapSolver=20?= =?UTF-8?q?=E5=A4=84=E7=90=86=20Cloudflare=20Turnstile=20=E7=9A=84?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- report_video.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/report_video.py b/report_video.py index a7cc481..6d1b844 100644 --- a/report_video.py +++ b/report_video.py @@ -8,13 +8,14 @@ from playwright.sync_api import ( Browser, ) + def solve_turnstile_capsolver(page: Page, timeout: int = 120) -> bool: """ 使用 CapSolver 自动完成当前 Page 上的 Cloudflare Turnstile。 成功返回 True,失败/超时返回 False。 """ - cap_key="CAP-A76C932D4C6CCB3CA748F77FDC07D996" + cap_key = "CAP-A76C932D4C6CCB3CA748F77FDC07D996" widget = page.query_selector("div.cf-turnstile[data-sitekey]") if not widget: return False @@ -38,7 +39,6 @@ def solve_turnstile_capsolver(page: Page, return False task_id = create_resp["taskId"] - poll_payload = {"clientKey": cap_key, "taskId": task_id} token = None elapsed, step = 0, 3 @@ -60,7 +60,6 @@ def solve_turnstile_capsolver(page: Page, print("[CapSolver] 超时未取到 token") return False - page.evaluate( """(tk) => { const ta = document.querySelector('textarea[name="cf-turnstile-response"]'); @@ -72,6 +71,8 @@ def solve_turnstile_capsolver(page: Page, ) page.wait_for_timeout(1500) return True + + def require_login(func): @functools.wraps(func) def wrapper(self, *args, **kwargs): @@ -107,6 +108,11 @@ class DailymotionClient: self.page.goto(self.url, timeout=30000) self.page.wait_for_load_state("networkidle", timeout=30000) + if self.page.query_selector("div.cf-turnstile[data-sitekey]"): + ok = solve_turnstile_capsolver(self.page) + if not ok: + raise RuntimeError("CapSolver 处理 Turnstile 失败") + logbtn = self.page.locator("//a[@class='login button']") if logbtn.count() > 0: logbtn.nth(0).click() @@ -148,12 +154,10 @@ class DailymotionClient: return self.page.locator("//a[@class='login button']").count() == 0 def is_logged_in(self) -> bool: - """带本地缓存,避免每几秒都访问一次页面。""" now = time.time() if now - self._last_check_ts < self.check_interval: return self._last_check_result - # 重新检测 try: ok = self._detect_login() except Exception: @@ -173,6 +177,10 @@ class DailymotionClient: 1) please help remove these videos 2) The drama series titles are {} """.format(title) + if self.page.query_selector("div.cf-turnstile[data-sitekey]"): + ok = solve_turnstile_capsolver(self.page) + if not ok: + raise RuntimeError("CapSolver 处理 Turnstile 失败") file_path = f'screenshots/{str(int(time.time()))}_{title}_{link.split("/")[-1]}.png' self.page.screenshot(path=file_path) resports = self.page.locator('li.blocks-item:nth-child(8)')