You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用CapSolver的ReCaptchaV2Classification无法解决ReCAPTCHA v2,响应始终返回False(Python)

CapSolver的ReCaptchaV2Classification无法解决ReCAPTCHA v2,响应始终返回False(Python)

我完全懂你现在的困扰——用CapSolver的ReCaptchaV2Classification任务处理reCAPTCHA v2时,不管怎么调用API,返回的hasObject始终是False,图片根本没被选中,验证一直卡着过不了。我帮你排查了代码和可能的问题点,核心问题和解决思路如下:

1. 最可能的核心问题:Question参数传错了!

你当前的代码里,把Google知识图谱的MID(比如/m/01bjv)传给了CapSolver的question参数,但ReCaptchaV2Classification任务需要的是英文的问题关键词,不是MID编码

CapSolver的API无法识别这些MID字符串,自然找不到对应对象,所以一直返回hasObject: False

解决方法:

把你的术语映射字典改成英文关键词,而不是MID:

WORD_TRANSLATOR = {
    "ônibus": "bus",                # 替换为英文关键词
    "ônibus escolar": "school bus",
    "semáforos": "traffic lights",
    "faixas de pedestre": "crosswalks",
    "carros": "cars",
    "motocicletas": "motorcycles",
    "hidrante": "fire hydrant",
    "placas de trânsito": "parking meters",
    "escadas": "stairs",
    "bicicletas": "bicycles",
    "tratores": "tractors",
    "táxis": "taxis",
    "cruzamentos": "bridges",
    "barcos": "boats",
    "palmeiras": "palm trees",
    "montanhas": "mountains or hills",
    "chaminés": "chimneys",
}

同时修改capture_question函数里的返回值,把MID换成英文:

def capture_question(driver):
    try:
        driver.switch_to.default_content()
        WebDriverWait(driver, 10).until(
            EC.frame_to_be_available_and_switch_to_it((By.XPATH, "//iframe[contains(@src, 'bframe')]"))
        )

        strong = WebDriverWait(driver, 5).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, ".rc-imageselect-desc-wrapper strong"))
        )
        text = strong.text.strip().lower()
        print(f"易 Captured question: {text}")

        if "ônibus" in text:
            if "escolar" in text:
                return "school bus"  # 替换为英文
            else:
                return "bus"  # 替换为英文

        for pt, en_term in WORD_TRANSLATOR.items():
            if pt in text:
                print(f" Matched term: '{pt}' → '{en_term}'")
                return en_term

        print("⚠️ No matching term found.")
        return ""

    except Exception as e:
        print("❌ Error capturing question:", e)
        return ""

2. 截图完整性问题:确保网格图片清晰且完整

如果截图的网格有截断、模糊,或者图片还没完全加载就截图,CapSolver也无法正确识别对象。

优化截图函数:

修改take_grid_screenshot,等待网格和内部图片完全可见后再截图:

def take_grid_screenshot(driver, path='grid.png'):
    try:
        driver.switch_to.default_content()
        WebDriverWait(driver, 10).until(
            EC.frame_to_be_available_and_switch_to_it((By.XPATH, "//iframe[contains(@src, 'bframe')]"))
        )

        # 等待网格容器可见
        grid_container = WebDriverWait(driver, 10).until(
            EC.visibility_of_element_located((By.ID, "rc-imageselect-target"))
        )
        # 等待所有小图加载完成
        WebDriverWait(driver, 5).until(
            EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#rc-imageselect-target img"))
        )
        time.sleep(0.5)  # 加一点缓冲时间,确保图片渲染完成
        grid_container.screenshot(path)
        print(f" Screenshot saved: {path}")

    except Exception as e:
        print(f"❌ Error taking grid screenshot: {e}")
        raise

3. 其他需要确认的点

  • API Key有效性:确保你替换了CAPSOLVER_API_KEY = 'CAP-0000'为CapSolver平台的真实有效密钥,且账户有可用余额(如果是付费套餐)。
  • 术语匹配准确性:检查问题文本和你的字典术语是否完全匹配,比如是否有单复数、拼写差异(你已经转成小写,大部分情况都能覆盖)。

测试修改后的代码

改完以上两点后,再运行代码,CapSolver的响应应该会返回hasObject: True和正确的图片索引,你就能正常选中图片完成验证了。比如修改后,CapSolver的响应类似:

 CapSolver response: {'errorId': 0, 'status': 'ready', 'solution': {'hasObject': True, 'objects': [0, 3, 5], 'size': 9, 'type': '3x3'}, 'taskId': '<task_id>'}

备注:内容来源于stack exchange,提问作者Franco Motta

火山引擎 最新活动