Skip to content

Cloudflare Turnstile

Pydoll 可以帮你点击 Cloudflare Turnstile 的复选框,就和真人在这个控件上的点击一样。它不会解决图片或拼图类挑战,而且这次点击是否被接受,取决于你的 IP 信誉和 fingerprint,而不取决于 Pydoll。请把它当作是自动化这次点击,而不是攻破 captcha。

在导航时处理 Turnstile

这个上下文管理器会在代码块执行期间等待 Turnstile 控件出现,点击它的复选框,并在完成操作后让你的代码继续运行。把触发挑战的导航放进这个代码块里。

import asyncio

from pydoll.browser.chromium import Chrome


async def main():
    async with Chrome() as browser:
        tab = await browser.start()

        async with tab.expect_and_bypass_cloudflare_captcha():
            await tab.go_to('https://a-site-behind-turnstile.com')

        content = await tab.find(id='protected-content', timeout=10, raise_exc=False)
        print(await content.text if content else 'Still challenged.')

asyncio.run(main())

把 URL 替换成你正在自动化的网站。目前没有公开、稳定的 Turnstile 页面可供指向。

在后台处理 Turnstile

当你不想包裹某一次具体的导航时,可以启用后台处理:Pydoll 会在控件每次出现时点击它,直到你将其禁用。

import asyncio

from pydoll.browser.chromium import Chrome


async def main():
    async with Chrome() as browser:
        tab = await browser.start()

        await tab.enable_auto_solve_cloudflare_captcha()
        await tab.go_to('https://a-site-behind-turnstile.com')
        await asyncio.sleep(5)   # 给控件出现并被点击的时间

        await tab.disable_auto_solve_cloudflare_captcha()

asyncio.run(main())

它如何找到复选框

Pydoll 通过轮询页面的 shadow DOM 来检测 Cloudflare 控件:它会查找承载 challenges.cloudflare.com 的 shadow root,进入其跨源 iframe,找到内部的 shadow root,并在复选框一出现就点击它。你不需要配置选择器,也没有需要调整的点击延迟。

给控件出现的时间

有些网站会在初始加载之后才渲染 Turnstile。time_to_wait_captcha(默认 5 秒)是 Pydoll 在放弃之前等待控件出现的时长。对于较慢的网站,可以把它调大。

async with tab.expect_and_bypass_cloudflare_captcha(time_to_wait_captcha=15):
    await tab.go_to('https://a-site-behind-turnstile.com')

time_to_wait_captcha 是唯一的时序参数。如果控件在这个时间窗口内始终没有出现,这次交互就会被跳过。

从旧版本迁移

custom_selectortime_before_click 在这些方法上仍然存在,但已被弃用并忽略。现在检测是自动的,所以请把它们从旧代码中移除。

哪些因素决定点击是否被接受

点击复选框只是其中一部分。Turnstile 会根据 Pydoll 无法控制的信号来决定是否接受它:

  • IP 信誉。 干净的住宅或移动 IP 通常会被接受;数据中心 IP 往往会被挑战或封锁。没有任何浏览器配置能弥补一个被标记的 IP。参见 Proxy
  • Fingerprint 一致性。 你的浏览器所呈现的身份必须与自身一致,也要与你的 IP 一致。一个常见的失败原因是 Chrome 版本不匹配:如果你把它和 Fingerprint 注入 结合使用,profile 所声明的版本必须与真实的二进制文件一致,否则 Turnstile 会一直停留在 "Just a moment..." 上。请让它与 await browser.get_version() 对齐。
  • Headful 与 headless。 Headless 会泄露降低信任分的渲染信号。对于 Turnstile,优先使用 headful,或者先把 headless 信号中和掉(参见 Fingerprint 注入)。

如果复选框被点击了,但接着出现拼图或图片挑战,说明信任分太低了。Pydoll 无法解决那种挑战;应该改善 IP 和 fingerprint。

它不做什么

  • 它不会解决图片选择或拼图类挑战。
  • 它不处理 reCAPTCHA 或 hCaptcha。这个功能不支持它们。
  • 它不会改变你的 IP 或 fingerprint。请把它与一个好的 proxy 和一致的 fingerprint 搭配使用,这次点击才能生效。

尊重网站的条款

自动化 captcha 可能违反网站的服务条款。请仅在你获得授权的场景下使用:测试你自己的应用、监控你所控制的服务,或经许可的研究。

下一步