处理 CAPTCHA 事件

了解 解锁浏览器 如何捕获和处理 CAPTCHA 事件。

Oxylabs 提供两种方式来监控 CAPTCHA 解决过程。虽然目前可以使用控制台日志,但它 计划弃用。我们强烈建议在所有新项目中使用基于事件的方法,以确保长期兼容性和更可靠的自动化同步。

基于事件的方法(推荐)

此方法允许您的脚本监听直接从扩展发送的自定义消息。它比监视日志更健壮,因为它避免了控制台缓冲区限制或日志过滤带来的问题。

工作原理

扩展向浏览器的 window 对象发送消息。您可以通过添加一个 "message" 事件监听器来捕获这些消息。

oxylabs-captcha-solve-start

检测到 CAPTCHA 并开始解决。

oxylabs-captcha-solve-end

CAPTCHA 已成功解决。

oxylabs-captcha-solve-error

自动解决器未能绕过 CAPTCHA。

您可以订阅这些事件以暂停您的自动化,并仅在 CAPTCHA 成功处理后恢复。通常,CAPTCHA 解决最多需要 30 秒,取决于 CAPTCHA 的类型和复杂性,但在某些情况下可能需要更长时间,因此请为 CAPTCHA 解决预留足够时间。

示例代码

import sys
from playwright.sync_api import sync_playwright

# 配置
EXTENSION_NAME = 'oxylabs-runtime'
CAPTCHA_SOLVE_END = 'oxylabs-captcha-solve-end'
CAPTCHA_SOLVE_ERROR = 'oxylabs-captcha-solve-error'
UB_BROWSER_URL = 'wss://<username>:<password>@ubc.oxylabs.io'
CAPTCHA_CHECK_TIMEOUT_SEC = 60
TARGET_URL = 'https://www.indeed.com/cmp/Bank-of-the-West/reviews?lang=any&fcountry=ALL&sort=date'

def run():
    with sync_playwright() as p:
        print('正在打开浏览器页面...')
        # 使用 CDP 连接到远程浏览器
        browser = p.chromium.connect_over_cdp(UB_BROWSER_URL)
        
        # 获取默认上下文并创建新页面
        ctx = browser.contexts[0]
        page = ctx.new_page()

        # 这必须在导航之前完成。
        ctx.add_init_script(f"""
            window.addEventListener("message", (event) => {{
                if (event.data && event.data.source === "{EXTENSION_NAME}") {{
                    window.__extensionStatus = event.data.type;
                }}
            }});
        """)

        print('正在打开目标网站...')
        page.goto(TARGET_URL, wait_until='domcontentloaded')

        try:
            # 等待扩展状态发生变化
            page.wait_for_function(
                """
                ([solveEnd, solveError]) => {
                    const status = window.__extensionStatus;
                    if (status === solveError) {
                        throw new Error("CAPTCHA 解决失败");
                    }
                    return status === solveEnd;
                }
                """,
                arg=[CAPTCHA_SOLVE_END, CAPTCHA_SOLVE_ERROR],
                timeout=CAPTCHA_CHECK_TIMEOUT_SEC * 1000
            )
            print('CAPTCHA 已成功解决,继续抓取...')
            
        except Exception as err:
            print(f'CAPTCHA 解决期间出错: {err}')
            browser.close()
            sys.exit(1)

        page.wait_for_selector('h1[data-testid="PageHeader-title-reviews"]')
        page.screenshot(path='page_screenshot.jpg')

        page.close()
        browser.close()
        print('完成。')

if __name__ == "__main__":
    run()

控制台日志方法(传统)

triangle-exclamation

当检测到 CAPTCHA 并正在解决时,Oxylabs 会向控制台记录一条消息。以下消息可能会打印到控制台日志:

oxylabs-captcha-solve-start

在我们的系统检测到 CAPTCHA 并开始解决时触发。

oxylabs-captcha-solve-end

在自动解决器成功解决 CAPTCHA 时触发。

oxylabs-captcha-solve-error

在自动解决器未能解决 CAPTCHA 时触发。

您可以订阅这些事件以暂停您的自动化,并仅在 CAPTCHA 成功处理后恢复。通常 CAPTCHA 解决最多需要 30 秒,具体取决于 CAPTCHA 的类型和复杂性,但在某些情况下可能需要更长时间,因此请为 CAPTCHA 解决预留足够时间。

请查看下面的示例,了解如何处理这些事件。

最后更新于

这有帮助吗?