///
如何在 2026 年解决 reCAPTCHA v2:可行方法
Vladlen Vlasov
Vladlen Vlasov
技术撰稿人
June 19, 2026
15 分钟
请查看本网站所提供内容的使用条款。

如何在 2026 年解决 reCAPTCHA v2:可行方法

9ee9109a-e9da-470a-bea5-6c6b314235b8.png

十多年来,reCAPTCHA v2 一直在保护网站免受机器人攻击——而到了 2026 年,它依然无处不在。从结账页面和登录门户,到联系表单和评论区,数以百万计的网站仍然依赖 Google 的复选框挑战及其图片网格谜题,来区分真实用户与自动化流量。

对开发者、QA 工程师和网页抓取人员来说,这是一项日常障碍。你需要自动化一个工作流、运行集成测试,或大规模收集数据——但 reCAPTCHA v2 挑战会阻挡每一步。手动解决并不可持续,而浏览器指纹识别也让简单的变通方法失去效果。

本指南将介绍如何解决 reCAPTCHA v2,涵盖 2026 年可用的最可靠现代方法:基于 API 的求解器、Python 自动化、Node.js 集成、浏览器扩展,以及人工支持的备用服务。针对每种方法,你都会看到清晰的说明、可运行的代码示例,以及关于何时应使用哪种方案的实用指导。

无论你是在构建抓取器、自动化测试套件,还是将 reCAPTCHA 绕过集成到现有流水线中,这篇文章都能为你提供快速上手所需的一切。

robots
立即开始自动化您的工作流 reCAPTCHA v2

什么是 reCAPTCHA v2,以及它为何在 2026 年仍然重要

reCAPTCHA v2 是 Google 开发的一种机器人检测挑战。它会向用户呈现以下其中一种形式:

  • 复选框(“我不是机器人”) —— 用户单击一次即可触发后台行为分析;如果风险评分较低,就不会出现图片挑战。
  • Invisible reCAPTCHA v2 —— 完全在后台运行,只有在风险评分较高时才会显示挑战。
  • reCAPTCHA Enterprise —— 一种单独的付费 Google Cloud 产品,会给出数值化风险评分(0.0–1.0),提供原因代码,并支持可配置阈值以及 Account Defender 和 MFA(多因素身份验证)等功能。

尽管像 reCAPTCHA v3 这样的新版本以及 Cloudflare Turnstile 这类替代方案正逐步普及,但 v2 仍被广泛部署,因为它更为人熟悉,而且免费额度较为宽松(每个站点每月最多 10,000 次评估)。开发者通常不会迁移,除非有明确理由,因此这种复选框挑战短期内不会消失。


reCAPTCHA v2 的工作原理(底层机制)

理解其工作机制有助于你更可靠地解决 reCAPTCHA v2。整个流程包含三个关键组成部分:

  1. Sitekey —— 嵌入在页面 HTML 中的公钥,用于向 Google 服务器标识网站。你可以在 reCAPTCHA 小部件 <div>data-sitekey 属性中找到它。 
  2. 挑战 + 用户交互 —— Google 会评估浏览器信号(鼠标移动、Cookie、IP、浏览器指纹),并可选择呈现图片网格(例如“选择所有交通信号灯”)。
  3. g-recaptcha-response token —— 成功完成挑战后,Google 会签发一个短时有效的 token;该 token 有效期为两分钟,并且只能验证一次。小部件会将其注入隐藏的 <textarea id="g-recaptcha-response"> 中,表单会连同其他字段一起提交它。服务器随后使用 secret key 通过 Google 的 siteverify API 验证该 token。

自动化中的关键洞察:你并不需要模拟像素级精确的鼠标移动。你真正需要的是一个有效的 g-recaptcha-response token。基于 API 的求解服务负责处理挑战并返回该 token——而你唯一需要做的,就是在提交表单前将它注入进去。


解决 reCAPTCHA v2 的现代方法——概览

在深入介绍每种方法之前,下面是一个快速对比,帮助你选择合适的方案:

方法速度所需代码最适合成本
API 求解器(CapMonster Cloud)通常 1–30 秒很少(API 调用)自动化、抓取、CI/CD每 1,000 个 token 收费 $0.60,每 1,000 张图片收费 $0.04(当前价格请参见定价页面
Python + Selenium + API 求解器*通常 1–30 秒中等(Python)脚本化浏览器自动化与上相同**
Node.js + Playwright + API 求解器*通常 1–30 秒中等(JS/TS)基于 Node 的流水线与上相同
浏览器扩展通常 1–30 秒手动测试、一次性任务与上相同*
人工服务通常 25–60 秒无 / 极少低量级使用因服务商和使用量而异

* 你可以按自己的需要自由组合编程语言(Python、JS、C#)和自动化框架(Playwright、Selenium、Puppeteer)。这里仅是这类技术栈的示例。

如果在该技术栈中使用 CapMonster Cloud 作为 API 求解器,则适用。

* 如果使用的是 CapMonster Cloud Browser Extensions,则适用。


方法 1 —— 使用 CapMonster Cloud 进行基于 API 的求解

CapMonster Cloud 是一项基于 AI 的 CAPTCHA 求解服务,提供简单的 REST API。它支持 reCAPTCHA v2(标准版、Invisible 版和 Enterprise 版),并返回可直接使用的 g-recaptcha-response token。

工作原理:

  1. 你向 CapMonster Cloud API 发送一个任务,其中包含 sitekey 和 CAPTCHA 页面 URL。
  2. CapMonster Cloud 的求解器处理该挑战。
  3. 你轮询结果端点并接收 token。
  4. 你将 token 注入页面并提交表单。

步骤 1 —— 创建任务

POST https://api.capmonster.cloud/createTask
Content-Type: application/json
{
  "clientKey": "YOUR_API_KEY",
  "task": {
    "type": "RecaptchaV2Task",
    "websiteURL": "https://example.com/login",
    "websiteKey": "YOUR_SITEKEY"
  }
}

可用的任务类型(当前的 CapMonster Cloud 命名):

  • RecaptchaV2Task —— 无代理(CapMonster Cloud 使用其自有代理),或使用你自己的代理(HTTP/HTTPS/SOCKS4/SOCKS5)
  • RecaptchaV2EnterpriseTask —— 用于 Enterprise 变体

响应:

{
  "errorId": 0,
  "taskId": 7654321
}

步骤 2 —— 轮询结果

POST https://api.capmonster.cloud/getTaskResult
Content-Type: application/json
{
  "clientKey": "YOUR_API_KEY",
  "taskId": 7654321
}

响应(准备就绪时):

{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "gRecaptchaResponse": "03AGdBq24PBCbwiDRaS_MJ..."
  }
}

步骤 3 —— 注入 Token

一旦你收到 token,

可以在 HTTP 请求中发送它

POST /api/login
Content-Type: application/json
{
  "email": "user@example.com",
  "password": "password123",
  "g-recaptcha-response": "03AGdBq24PBC..."
}

或者将其注入页面

// Browser console, Selenium execute_script, or Playwright evaluate
const token = '03AGdBq24PBCbwiDRaS_MJ...';
const ta = document.getElementById('g-recaptcha-response');
ta.value = token;          // canonical for <textarea>
ta.innerHTML = token;      // equivalent fallback some integrations rely on
document.querySelector('#login-form')?.requestSubmit();

有关更详细的注入示例,请参见下一节。

试用 CapMonster Cloud reCAPTCHA v2 求解器 →


方法 2 —— 在 Python 中解决 reCAPTCHA v2(Selenium + CapMonster Cloud)

这种方法非常适合 reCAPTCHA v2 Python 自动化工作流:你通过 Selenium 控制真实浏览器,并需要在会话中途解决挑战。

先决条件

  1. 在你的控制台/终端中运行以下命令:

    pip install selenium capmonstercloudclient python-dotenv

  2. 创建一个 .env 文件,并填入你当前的数据:

    API_KEY=your_capmonster_cloud_api_key   
    WEBSITE_URL=https://example.com/login   
    WEBSITE_KEY=website_key_of_the_page_with_captcha

完整 Python 示例

import asyncio
import os
from dotenv import load_dotenv
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import RecaptchaV2Request
load_dotenv()
API_KEY = os.getenv("API_KEY")
WEBSITE_URL = os.getenv("WEBSITE_URL")
WEBSITE_KEY = os.getenv("WEBSITE_KEY")  # sitekey from the page
client_options = ClientOptions(api_key=API_KEY)
cap_monster_client = CapMonsterClient(options=client_options)
async def solve_captcha() -> str:
    recaptcha_request = RecaptchaV2Request(
        websiteUrl=WEBSITE_URL,
        websiteKey=WEBSITE_KEY,
    )
    result = await cap_monster_client.solve_captcha(recaptcha_request)
    return result["gRecaptchaResponse"]
async def main():
    browser = None
    try:
        options = webdriver.ChromeOptions()
        # 可选:隐藏“Chrome is being controlled by automated software”信息栏
        options.add_experimental_option("excludeSwitches", ["enable-automation"])
        options.add_experimental_option("useAutomationExtension", False)
        browser = webdriver.Chrome(options=options)
        browser.get(WEBSITE_URL)
        print("Page opened, waiting for reCAPTCHA widget...")
        # 等待小部件容器出现
        WebDriverWait(browser, 15).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, ".g-recaptcha"))
        )
        print("reCAPTCHA widget found.")
        # 通过 CapMonster Cloud 解决 CAPTCHA
        token = await solve_captcha()
        print("Token received:", token[:40] + "...")
        # 1) 让 textarea 可见(某些页面会通过内联样式隐藏它)
        #    并注入 token 值
        browser.execute_script(
            """
            const ta = document.getElementById('g-recaptcha-response');
            if (ta) {
                ta.style.display    = 'block';
                ta.style.visibility = 'visible';
                ta.value     = arguments;
                ta.innerHTML = arguments;
            }
            """,
            token,
        )
        # 2) 如果在 data-callback 属性中定义了 reCAPTCHA 回调,则触发它
        browser.execute_script(
            """
            const widget = document.querySelector('.g-recaptcha');
            const callbackName = widget ? widget.getAttribute('data-callback') : null;
            if (callbackName && typeof window[callbackName] === 'function') {
                window[callbackName](arguments);
            }
            """,
            token,
        )
        print("Token injected and callback triggered.")
        # 3) 定位提交按钮——尝试多个可能的选择器,或者设置当前页面实际存在的选择器
        submit_selectors = [
            (By.CSS_SELECTOR, "input[type='submit']"),
            (By.CSS_SELECTOR, "button[type='submit']"),
            (By.CSS_SELECTOR, "form button"),
            (By.XPATH, "//input[@type='submit']"),
            (
                By.XPATH,
                "//button[contains(text(),'Submit') or contains(text(),'Check')]",
            ),
        ]
        submit_btn = None
        for by, selector in submit_selectors:
            try:
                submit_btn = WebDriverWait(browser, 3).until(
                    EC.element_to_be_clickable((by, selector))
                )
                print(f"Submit button found via: {selector}")
                break
            except Exception:
                continue
        if submit_btn is None:
            raise RuntimeError(
                "Submit button not found! Check the page structure manually."
            )
        submit_btn.click()
        print("Form submitted.")
        # 等待页面响应
        await asyncio.sleep(3)
        # 输出提交后的 URL(成功时可能会发生重定向)
        print("Current URL after submit:", browser.current_url)
        # 在页面中查找成功消息
        try:
            success = browser.find_element(
                By.XPATH,
                "//*[contains(text(),'success') or contains(text(),'Success') or contains(text(),'correct')]",
            )
            print("Success message found:", success.text)
        except Exception:
            print("No explicit success message found on page.")
    except Exception as e:
        print("Error:", e)
    finally:
        if browser is not None:
            input("Press ENTER to close browser...")  # 暂停以便手动检查
            browser.quit()
if __name__ == "__main__":
    asyncio.run(main())

关键点说明:

  • RecaptchaV2Request(不带代理字段)是无代理流程的标准导入方式。如果你需要通过自己的 IP 路由求解请求,请创建一个 ProxyInfo 对象(包含 proxyType、proxyAddress 等),并通过 RecaptchaV2Request 中的 proxy 参数传入(更多细节参见文档)。
  • solve_captcha() 会向 CapMonster Cloud 发送异步任务,并从 result["gRecaptchaResponse"] 返回已求解的 token 字符串。
  • 该 token 通过 arguments 传递给 execute_script,这种方式比使用 f-string 构造 JS 字面量更安全。
  • 隐藏的 textarea 同时通过 .value.innerHTML 进行更新——同时设置这两个值可以最大程度兼容不同版本的 reCAPTCHA 小部件。
  • WebDriverWait 替代了简单粗暴的 sleep,使脚本在页面加载较慢时也更稳健。
  • browsertry 外部被初始化为 None,因此即使 webdriver.Chrome() 本身失败,finally 代码块也不会因为 NameError 而报错。

⚠️ Token 过期时间:token 自签发起仅在两分钟内有效,且只能验证一次。请在提交表单前立即请求 token,并且不要在注入与提交之间拖延。

robots
立即开始自动化您的工作流 reCAPTCHA v2

方法 3 —— 在 Node.js 中解决 reCAPTCHA v2(Playwright + CapMonster Cloud)

对于基于 Node.js 的流水线,将 Playwright 与 CapMonster Cloud 客户端库结合使用,是一种简洁、现代的方法,可用于自动绕过 reCAPTCHA v2

前置条件

  1. 在你的控制台/终端中运行以下命令:

    npm install playwright @zennolab_com/capmonstercloud-client dotenv

    npx playwright install chromium

  2. 创建一个 .env 文件,并填入你当前的数据:

    API_KEY=your_capmonster_cloud_api_key   
    WEBSITE_URL=https://example.com/login   
    WEBSITE_KEY=website_key_of_the_page_with_captcha

完整 Node.js 示例

require("dotenv").config();
const { chromium } = require("playwright");
const {
  CapMonsterCloudClientFactory,
  ClientOptions,
  RecaptchaV2Request,
} = require("@zennolab_com/capmonstercloud-client");
const CMC_API_KEY = process.env.API_KEY;
const TARGET_URL = process.env.WEBSITE_URL;
const WEBSITE_KEY = process.env.WEBSITE_KEY;
(async () => {
  const browser = await chromium.launch({ headless: false });
  const context = await browser.newContext();
  const page = await context.newPage();
  try {
    await page.goto(TARGET_URL, { waitUntil: "domcontentloaded" });
    // 等待 reCAPTCHA 小部件渲染完成
    await page.waitForSelector(".g-recaptcha", { timeout: 15_000 });
    console.log("[*] Fetching token from CapMonster Cloud...");
    const cmc = CapMonsterCloudClientFactory.Create(
      new ClientOptions({ clientKey: CMC_API_KEY }),
    );
    const solution = await cmc.Solve(
      new RecaptchaV2Request({
        websiteURL: TARGET_URL,
        websiteKey: WEBSITE_KEY,
      }),
    );
    if (!solution?.solution?.gRecaptchaResponse) {
      throw new Error("CapMonster Cloud did not return a token.");
    }
    const token = solution.solution.gRecaptchaResponse;
    console.log("[+] Token received:", token.slice(0, 40) + "...");
    // 注入 token 并触发事件,使 reCAPTCHA 库
    // 认为该挑战已经被解决
    await page.evaluate((t) => {
      const ta = document.querySelector("textarea#g-recaptcha-response");
      if (ta) {
        // 移除 display:none,以便表单可以读取该字段
        ta.style.display = "block";
        ta.value = t;
        ta.innerHTML = t;
        // 触发 input/change 事件——某些校验器会在提交前监听这些事件
        ta.dispatchEvent(new Event("input", { bubbles: true }));
        ta.dispatchEvent(new Event("change", { bubbles: true }));
      }
      // 如果 g-recaptcha 回调已注册,则直接调用它
      if (typeof window.___grecaptcha_cfg !== "undefined") {
        const clients = window.___grecaptcha_cfg.clients;
        for (const key of Object.keys(clients)) {
          const client = clients[key];
          for (const prop of Object.values(client)) {
            if (prop && typeof prop.callback === "function") {
              try {
                prop.callback(t);
              } catch (_) {}
            }
          }
        }
      }
    }, token);
    // 检测可用的提交选择器。如有需要,请改为你的具体场景。
    const submitSelector = await page.evaluate(() => {
      if (document.querySelector('button[type="submit"]'))
        return 'button[type="submit"]';
      if (document.querySelector('input[type="submit"]'))
        return 'input[type="submit"]';
      // 回退方案:表单中的任意按钮
      if (document.querySelector("form button")) return "form button";
      return null;
    });
    if (!submitSelector) {
      throw new Error("Submit button not found on the page.");
    }
    console.log(`[*] Using submit selector: ${submitSelector}`);
    // 点击提交按钮并等待结果页面加载完成
    await Promise.all([
      page.waitForLoadState("load"),
      page.click(submitSelector),
    ]);
    await page.waitForTimeout(5000);
    console.log("[+] Page after submit:", page.url());
  } catch (err) {
    console.error("[!] Error:", err);
    process.exitCode = 1;
  } finally {
    await browser.close();
  }
})();

关键点说明:

  • RecaptchaV2Request(不带代理字段)是无代理流程的标准导入方式。如果你需要通过自己的 IP 路由求解请求,可以传入 proxyType、proxyAddress 等字段,但它们必须被包装在一个嵌套的 proxy 对象中,并传递给 RecaptchaV2Request(更多细节请参见文档)。
  • solution.solution.gRecaptchaResponse 是客户端响应中 token 的路径。
  • 在当前版本的 Playwright 中,page.waitForNavigation() 已被弃用,这里改为在 Promise.all 中使用 page.waitForLoadState('load'),以避免竞争条件。
  • try/finally 可确保即使任一步骤失败,浏览器也会被关闭。

使用 CapMonster Cloud 自动解决 reCAPTCHA v2 →


方法 4 —— 浏览器扩展(无代码选项)

CapMonster Cloud 提供 Chrome 和 Firefox 扩展,可拦截任意页面上的 reCAPTCHA v2 挑战,并自动完成求解——无需编写代码。

适用场景:

  • 你不想编写自动化脚本的手动 QA 测试
  • 你在真实浏览器中访问页面时执行的一次性任务
  • 在部署基于 API 的自动化之前,先验证你的 reCAPTCHA 是否可以被 CapMonster Cloud 解决

设置步骤:

  1. Chrome Web StoreFirefox Add-ons 安装 CapMonster Cloud 扩展。
  2. 点击浏览器工具栏中的扩展图标并输入你的 API key。
  3. 启用“Auto-solve reCAPTCHA v2”。
  4. 打开任意带有 reCAPTCHA v2 的页面——该扩展会在后台自动完成求解。

该扩展使用与程序化方法相同的 reCAPTCHA v2 API 基础设施,因此准确率和速度保持一致。


方法 5 —— 人工求解服务

人工 CAPTCHA 平台会将你的挑战转发给真实人员,由其进行视觉求解并返回响应 token。

工作方式:

  1. 你将 sitekey 和 URL 发送到该服务的 API(其结构与 CapMonster Cloud 的 API 类似)。
  2. 一名人工操作员查看并解决图片挑战。
  3. 你收到 g-recaptcha-response token。

权衡点:

因素人工方式基于 AI 的方式(CapMonster Cloud)
速度25–60 秒通常 1–30 秒
准确率高(人工)高(经 AI 训练)
扩展性有限(依赖人工)高吞吐量
可用性通常 24/7,但也可能主要集中在工作时间24/7
大规模使用时的成本因情况而异因情况而异

适合使用的情况:

  • 使用量较低
  • 当 AI 求解器遇到异常或罕见图片集时,作为备用方案
  • 没有可用的编码资源,且可以接受人工求解

对于大多数自动化使用场景而言,像 CapMonster Cloud 这样的基于 AI 的 reCAPTCHA v2 solver 更快、扩展性更强,并且可以全天候使用。


实施清单

在任何自动化的 reCAPTCHA v2 求解集成上线之前,请先检查以下清单:

  • 定位 sitekey —— 在页面源码中检查 reCAPTCHA <div> 里的 data-sitekey="..."
  • 确认 reCAPTCHA 变体 —— 标准复选框、Invisible,还是 Enterprise —— 并使用匹配的任务类型(RecaptchaV2TaskRecaptchaV2EnterpriseTask)。
  • 安全存储凭据 —— 绝不要硬编码你的 CapMonster API key;请使用环境变量或 secrets manager。
  • 处理 token 过期 —— 尽可能在接近提交表单时再请求 token(远短于 Google 的 2 分钟有效窗口),并将每个 token 视为一次性使用。
  • 使用退避机制实现轮询 —— 每隔 3–5 秒轮询一次 getTaskResult;避免对 API 发起过于频繁的请求。
  • 检查每个响应中的 errorId —— 非零值表示任务失败;请实现重试逻辑(最多尝试 2–3 次,然后优雅地失败)。
  • 正确注入 —— 通过 .value 设置隐藏的 <textarea#g-recaptcha-response>(这是 <textarea> 的标准方式);同时设置 innerHTML 也是一种安全的等效回退方案。
  • 先在预发布环境中测试 —— 确认注入的 token 能通过服务端的 siteverify 验证,然后再用于生产环境。
  • 监控你的余额 —— 在 CapMonster Cloud 仪表板中设置低余额提醒,以避免意外停机。
  • 遵守法律和 ToS 边界 —— 仅对你有权访问的网站和服务自动化工作流。

FAQ

问:reCAPTCHA v2 token 的有效期是多久?   
答:Token 自签发起有效期为两分钟,并且只能验证一次(Google 官方规范)。请在需要提交表单前立即请求 token,并在注入后不要延迟。

问:reCAPTCHA v2 标准版与 Enterprise 有什么区别?   
答:reCAPTCHA Enterprise 是 Google Cloud 的一个独立产品,会返回数值化风险评分(0.0–1.0)以及原因代码,并支持可配置阈值、Account Defender 和 MFA。它需要付费的 Google Cloud 账户,并在 CapMonster Cloud 的 API 中使用 RecaptchaV2EnterpriseTask 这一任务类型。

问:使用 CapMonster Cloud 需要代理吗?   
答:基本上不需要。CapMonster Cloud 会通过其自有基础设施路由流量。如果你需要让求解请求来自特定 IP 地址,也可以使用基于代理的任务。

问:这是否适用于 reCAPTCHA v2 Invisible?   
答:是的。CapMonster Cloud 支持 Invisible 变体——请在 RecaptchaV2Task 负载中传入 "isInvisible": true

问:如果求解器返回错误,我该怎么办?   
答:请对照 Error Description 页面检查 errorIderrorDescription 字段,并相应调整你的自动化流程。同时我们建议你实现一个最多 2–3 次尝试的重试循环,之后再优雅地失败。


结论

到了 2026 年,reCAPTCHA v2 仍然是合法自动化、测试和数据采集工作流中的一个现实障碍。而解决它的工具已经显著成熟。基于 API 的服务承担了最核心的工作,将其集成到 Python 或 Node.js 中所需的代码不到 100 行。浏览器扩展覆盖了无代码场景,而人工服务则为边缘情况提供了可靠的备用方案。

对大多数团队来说,通往可用且可扩展解决方案的最快路径,是采用带有简洁 API 的 AI 驱动型 reCAPTCHA v2 solver——无需人工劳动,无需浏览器开销,并且吞吐量可预测。

准备好集成了吗? 试试 CapMonster Cloud reCAPTCHA v2 Solver——几分钟内开始求解 →


NB: 请注意,本产品仅用于对您自身的网站以及您依法拥有访问权限的资源进行自动化测试
ItGuy
geear
面向软件开发者的联盟计划
通过用户识别验证码的消费获取高达 30% 的返佣。
✅ 请求已发送
感谢您对我们的合作伙伴计划感兴趣!我们将在 7 个工作日内与您联系。
请求加入
填写表格以提交申请加入合作伙伴计划。
更多文章