Explainers

reCAPTCHA Cookie 和会话解决要求

reCAPTCHA v2 老弹图片验证码?大概率不是脚本写错了,而是浏览器里没有 cookie 可用。reCAPTCHA 靠 _GRECAPTCHArc:: 这类 cookie 判断你是不是老用户——没有历史记录的全新会话,风险分从一开始就低。

这篇文章按 cookie 类型、评分逻辑、报错自查、自动化管理、API 是否需要 cookie 五条线讲清楚。

一句话答案: 没有 cookie 的全新会话分数更低、更容易弹图片验证码;CaptchaAI API 识别通常不需要传 cookie。


这五个 cookie 只服务 reCAPTCHA 本身,跟 Google 账号无关:

Cookie 作用域 作用 有效期
_GRECAPTCHA .google.com 跨站 reCAPTCHA 状态 6 个月
rc::a 目标站点 风险分析数据(canvas、鼠标行为哈希) 会话期间
rc::b 目标站点 风险分析数据(行为信号) 会话期间
rc::c 目标站点 风险分析数据(时间特征) 会话期间
rc::d-15# 目标站点 验证码挑战状态持久化 会话期间

这组 cookie 绑定 Google 登录状态和同意选择,评分权重最大:

Cookie 作用域 作用 对分数的影响
SID .google.com Google 会话 ID +0.1 至 +0.3
HSID .google.com 仅限 HTTP 的会话 ID 计入会话信任
SSID .google.com 安全会话 ID 计入会话信任
NID .google.com Google 偏好设置/会话 +0.05 至 +0.1
1P_JAR .google.com Google 广告个性化 次要信任信号
CONSENT .google.com Cookie 同意状态 不直接影响分数
AEC .google.com 加密广告 cookie 不直接影响分数
SOCS .google.com Cookie 同意设置 不直接影响分数

reCAPTCHA 把无 cookie 会话当陌生访客,起始分数直接压低:

New browser session, all cookies cleared
    ↓
reCAPTCHA JavaScript loads
    ↓
No _GRECAPTCHA → First-time visitor signal
No SID/HSID → No Google account trust
No rc:: cookies → No behavioral history
    ↓
Starting risk score: lower baseline (0.3-0.5 for v3)
    ↓
Behavioral analysis must compensate for lack of history
    ↓
Result: More likely to receive visible challenge (v2)
         Lower score (v3)

反过来,带历史 cookie 回访时起始分数直接拉高:

Existing browser session with cookies
    ↓
reCAPTCHA JavaScript loads
    ↓
_GRECAPTCHA found → Returning visitor
SID/HSID found → Google account trust
rc:: cookies found → Previous behavioral data
    ↓
Starting risk score: higher baseline (0.5-0.7 for v3)
    ↓
Behavioral analysis reinforces cookie-based trust
    ↓
Result: More likely to auto-pass (v2)
         Higher score (v3)

先对照这张表自查,再决定要不要动手改自动化脚本:

现象 原因 解决办法
reCAPTCHA v2 总是弹图片验证码 没有会话 cookie,信任度低 让 cookie 跨请求保留
reCAPTCHA v3 分数一直 < 0.3 每次都是全新会话 维护持久化的 cookie jar
token 第一次能用,重试就失败 会话 cookie 对不上 页面加载和提交用同一个会话
报错 "Cookie/session 验证失败" 目标站点校验 cookie 链 改用浏览器路径注入 token
reCAPTCHA 组件加载不出来 第三方 cookie 被拦截 放行 google.com 的 cookie

跨请求保持会话信任,得靠落盘持久化的 cookie jar:

import requests
import pickle
import os

class CookieManager:
    """Manage cookies for reCAPTCHA sessions."""

    def __init__(self, cookie_file="cookies.pkl"):
        self.cookie_file = cookie_file
        self.session = requests.Session()
        self.load_cookies()

    def load_cookies(self):
        """Load cookies from disk if they exist."""
        if os.path.exists(self.cookie_file):
            with open(self.cookie_file, "rb") as f:
                self.session.cookies = pickle.load(f)

    def save_cookies(self):
        """Save cookies to disk for next session."""
        with open(self.cookie_file, "wb") as f:
            pickle.dump(self.session.cookies, f)

    def visit_page(self, url):
        """Visit a page to collect cookies."""
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                          "AppleWebKit/537.36 (KHTML, like Gecko) "
                          "Chrome/120.0.0.0 Safari/537.36",
        }
        response = self.session.get(url, headers=headers, timeout=15)
        self.save_cookies()
        return response

    def get_recaptcha_cookies(self):
        """Get cookies relevant to reCAPTCHA."""
        relevant = {}
        for cookie in self.session.cookies:
            if cookie.name in ["_GRECAPTCHA", "SID", "HSID", "SSID", "NID"]:
                relevant[cookie.name] = {
                    "value": cookie.value[:20] + "...",
                    "domain": cookie.domain,
                    "expires": cookie.expires,
                }
            if cookie.name.startswith("rc::"):
                relevant[cookie.name] = {
                    "value": cookie.value[:20] + "...",
                    "domain": cookie.domain,
                }
        return relevant


# Usage
cm = CookieManager("recaptcha_session.pkl")
cm.visit_page("https://staging.example.com/qa-login")  # Build cookies
print(cm.get_recaptcha_cookies())

思路一致,cookie 手动搬运:

from selenium import webdriver
import json

def setup_cookies(driver, cookie_file="selenium_cookies.json"):
    """Load and apply saved cookies to a Selenium session."""
    if not os.path.exists(cookie_file):
        return

    with open(cookie_file, "r") as f:
        cookies = json.load(f)

    for cookie in cookies:
        # Selenium requires the domain to match current page
        try:
            driver.add_cookie(cookie)
        except Exception:
            pass  # Skip cookies for different domains

def save_cookies(driver, cookie_file="selenium_cookies.json"):
    """Save current cookies for future sessions."""
    cookies = driver.get_cookies()
    with open(cookie_file, "w") as f:
        json.dump(cookies, f)

# Usage
driver = webdriver.Chrome()
driver.get("https://example.com")
setup_cookies(driver)  # Apply saved cookies
driver.refresh()       # Reload with cookies

# After CAPTCHA solving...
save_cookies(driver)   # Save for next run

同样先加载 cookie,结束后存回磁盘:

const puppeteer = require("puppeteer");
const fs = require("fs");

async function manageCookies(page, cookieFile = "cookies.json") {
    // Load cookies if file exists
    if (fs.existsSync(cookieFile)) {
        const cookies = JSON.parse(fs.readFileSync(cookieFile));
        await page.setCookie(...cookies);
    }

    // Save cookies after page interaction
    const saveCookies = async () => {
        const cookies = await page.cookies();
        fs.writeFileSync(cookieFile, JSON.stringify(cookies, null, 2));
    };

    return { saveCookies };
}

(async () => {
    const browser = await puppeteer.launch({ headless: false });
    const page = await browser.newPage();

    const { saveCookies } = await manageCookies(page);

    await page.goto("https://staging.example.com/qa-login");

    // ... solve CAPTCHA ...

    await saveCookies();
    await browser.close();
})();

批量跑脚本容易踩一个坑:用 CaptchaAI 的 ADVANCE 套餐($90/月,50 线程)并发提交任务时,一定要给每个线程分配独立的 cookie 文件,否则会互相覆盖会话状态,导致 rc:: 系列 cookie 频繁失效、v3 分数忽高忽低。做法很简单:文件名绑定线程编号,比如 cookies_thread_{i}.pkl


用 CaptchaAI 的 API 识别 reCAPTCHA 时,token 是在 CaptchaAI 自己的环境里生成的,目标网站校验的是 token 本身,不会检查你浏览器的 cookie。不过少数实现会额外校验会话,这时候才需要走浏览器路径。

标准场景不需要转发任何 cookie,CaptchaAI 只用 sitekeypageurl 就能生成有效 token:

import requests
import time

API_KEY = "YOUR_API_KEY"

# Standard solve — no cookies needed
submit = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "userrecaptcha",
    "googlekey": "SITE_KEY",
    "pageurl": "https://staging.example.com/qa-login",
    "json": 1,
})

部分安全要求较高的站点,会核对提交 token 的会话和加载 reCAPTCHA 组件时的会话是不是同一个。遇到这种情况,走浏览器路径:

  1. 用真实浏览器打开页面,建立 cookie
  2. 从页面里取出 sitekey
  3. 把 sitekey 和 pageurl 提交给 CaptchaAI
  4. 把拿到的 token 写回同一个浏览器会话
  5. 在同一个浏览器会话里提交表单(保持 cookie 链不断)
from selenium import webdriver
from selenium.webdriver.common.by import By
import requests
import time

API_KEY = "YOUR_API_KEY"

# Step 1: Load page in real browser (establishes cookies)
driver = webdriver.Chrome()
driver.get("https://secure-site.com/login")

# Step 2: Extract sitekey
widget = driver.find_element(By.CSS_SELECTOR, "[data-sitekey]")
sitekey = widget.get_attribute("data-sitekey")

# Step 3: Solve via CaptchaAI
submit = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "userrecaptcha",
    "googlekey": sitekey,
    "pageurl": driver.current_url,
    "json": 1,
})
task_id = submit.json()["request"]

for _ in range(60):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY,
        "action": "get",
        "id": task_id,
        "json": 1,
    }).json()

    if result.get("status") == 1:
        token = result["request"]
        break

# Step 4: Inject token into browser session (same cookies)
driver.execute_script(
    f'document.getElementById("g-recaptcha-response").value = "{token}";'
)

# Step 5: Submit form from same browser session
driver.find_element(By.CSS_SELECTOR, "form").submit()

Chrome 在逐步淘汰第三方 cookie,这会牵连到 reCAPTCHA——_GRECAPTCHA 是在 .google.com 上设置的,属于从第三方上下文读取的 cookie。

Google 的应对: reCAPTCHA v3 和 Enterprise 已经改用第一方 JavaScript 执行,cookie 也在迁移到 Partitioned(CHIPS)存储;rc:: 系列 cookie 本来就写在目标站点自己的域名下,不受影响。

对自动化脚本的影响: 影响很小——基于 API 的识别不受影响,因为 CaptchaAI 是在服务端生成 token 的;基于浏览器的自动化可能会随着 Google 调整 cookie 策略出现小幅分数波动。


常见问题

不需要。CaptchaAI 在自己的环境里生成 token,不依赖你浏览器的 cookie,只要提供 sitekeypageurl 就够了。生成出来的 token,换任何客户端提交都有效。

会。_GRECAPTCHA 撑 6 个月,rc:: 会话 cookie 一关浏览器就失效,Google 账号 cookie(SIDHSID)理论上能撑 2 年但随时可能作废。自动化建议把 cookie 存盘,定期访问目标站点刷新。

国内网络环境下,reCAPTCHA 是不是特别容易弹图片验证码?

是的。reCAPTCHA 依赖 google.com 资源,国内到 Google 的连通性本身不稳定,加上多数访问是"全新会话"(没有历史 _GRECAPTCHA/rc:: cookie),风险分从起点就偏低,更容易触发图片验证码——这是网络可达性叠加会话历史的结果,不是识别能力问题。

要。多个线程共用一份 cookie 文件,rc:: 系列 cookie 会互相覆盖,v3 分数忽高忽低。按线程编号拆分 cookie 文件是最简单的解法。


总结

reCAPTCHA 靠 cookie 做三件事:会话跟踪(rc::)、跨站信任(_GRECAPTCHA)、Google 账号关联(SIDHSID)。全新会话没有 cookie,分数天然更低。用 CaptchaAI 的 API 识别不需要 cookie,遇到会校验 cookie 链的站点才走浏览器路径:建立 cookie、CaptchaAI 识别、把 token 写回同一会话再提交。

相关文章

该文章已禁用评论。