Explainers

reCAPTCHA Cookie 要求:设置内容及其重要性

很多出海团队第一次接入 reCAPTCHA 都会踩坑:同一段脚本,本地跑一次就过,换到 CI 或全新会话里却连续弹出好几轮图片验证。差别往往不在脚本逻辑,而在 cookie —— reCAPTCHA 用它判断"这台浏览器像不像真实用户"。搞清楚 reCAPTCHA 读写哪些 cookie,才能在自动化里稳定保留会话、提高识别成功率。

reCAPTCHA 的风险引擎把 cookie 当作信号之一,但权重很高——同一个 sitekey,cookie 状态不同,挑战完全不同:

Cookie 状态 挑战难度 原因
已登录 Google 账号 最低 身份信号最强
有 Google cookie,但未登录 低到中 显示出正常浏览历史
全新浏览器,没有 Google cookie 中到高 没有历史可供评估
Cookie 被拦截或清空 行为可疑——正常浏览器都会带 cookie
无痕 / 隐私模式 没有持久身份

把上面的表格拆开看,reCAPTCHA 的判断大致分三档:

  1. 最佳情况: 浏览器带着已登录 Google 账号的 SIDHSIDNID cookie → 往往点一下复选框就通过。
  2. 较好情况: 浏览器有正常浏览积累下的 NID1P_JAR → 图片挑战更简单,或者直接复选框通过。
  3. 最差情况: 全新会话,没有任何 Google cookie → 大概率遇到多轮图片挑战。

再看 reCAPTCHA 具体读写哪些 cookie,方便对症保留。

以下 cookie 设置在 .google.com,由 reCAPTCHA 的 iframe 读取:

Cookie 作用 有效期
NID .google.com Google 偏好设置和唯一 ID 约 6 个月
SID / HSID / SSID .google.com Google 账号会话(已登录时) 2 年
APISID / SAPISID .google.com Google API 身份验证 2 年
1P_JAR .google.com Google 广告个性化 约 1 个月
CONSENT .google.com Cookie 同意偏好 17 年

这些 cookie 和 localStorage 键是 reCAPTCHA 自己写入的,专门服务于挑战流程:

名称 存储位置 作用 有效期
_GRECAPTCHA .google.com / .recaptcha.net reCAPTCHA 会话跟踪 会话级
rc::a localStorage 风险分析数据 持久
rc::b localStorage 时间戳数据 会话级
rc::c localStorage 当前挑战数据 会话级
rc::d-<id> localStorage 每个 widget 各自的数据 会话级

站点本身也可能用 cookie 做会话和 CSRF 跟踪,这部分和 Google 无关,但同样影响流程是否顺畅:

Cookie 类型 例子 关联
会话 ID PHPSESSIDsession_id 把验证码结果和用户会话绑定
CSRF token csrf_token_token 提交表单时校验
自定义追踪 站点各自定义 可能影响验证码何时触发

跨域限制与 Google 的应对方式

reCAPTCHA 是从 google.com 加载进 iframe 的,而现代浏览器对第三方 cookie 越来越严格:

浏览器策略 对 reCAPTCHA 的影响
SameSite=Lax(默认) 默认情况下,Google 的 cookie 不会带进 reCAPTCHA 的 iframe
拦截第三方 cookie reCAPTCHA 会切换到 recaptcha.net 或第一方模式
ITP(Safari) Google cookie 失效更快,遇到高难度挑战的概率更高

Google 主要有三种应对方式:

  • recaptcha.net 作为备用域名;
  • localStoragerc::* 系列键)保存客户端状态,降低对第三方 cookie 的依赖;
  • 给企业客户提供第一方脚本加载方案。

国内团队测试时的坑:google.com / recaptcha.net 在大陆网络下并非始终可达,先排查连通性,再怀疑脚本逻辑。

接入方式不同,cookie 处理方式也不同,主要分两种。

浏览器自动化(Playwright / Puppeteer)

用 Playwright 或 Puppeteer 跑浏览器时,cookie 会被自动管理,你只需要在会话之间把它保存下来:

# Save cookies after session
cookies = page.context.cookies()
import json
with open("cookies.json", "w") as f:
    json.dump(cookies, f)

# Restore cookies in next session
with open("cookies.json") as f:
    cookies = json.load(f)
page.context.add_cookies(cookies)

只用 CaptchaAI API(不跑浏览器)

直接用 CaptchaAI API 识别、不经过真实浏览器时,cookie 不影响 CaptchaAI 这一侧——它用自己的求解环境处理挑战。但目标站点需要 cookie 维持会话时,可以一并传过去:

POST https://ocr.captchaai.com/in.php

key=YOUR_API_KEY
&method=userrecaptcha
&googlekey=SITE_KEY
&pageurl=https://staging.example.com/qa-login
&cookies=NID=12345;1P_JAR=2026-04-04-12

cookies 参数可选,用于把上下文传给 CaptchaAI 辅助识别。

localStorage:reCAPTCHA 的第二层状态

除了 cookie,reCAPTCHA 还把风险评估数据存进 localStorage 的 rc:: 前缀键里,这层状态不受第三方 cookie 策略影响:

键名规律 存的数据
rc::a 编码后的风险分析数据
rc::b 上一次挑战的时间戳
rc::c 当前挑战的会话数据
rc::d-<hash> 每个 widget 各自的实例数据

这些数据帮 reCAPTCHA 在页面刷新之间保持状态,不依赖第三方 cookie。自动化流程里保留 localStorage,同样能降低挑战难度:

# Save localStorage
storage = page.evaluate("() => JSON.stringify(localStorage)")
with open("localstorage.json", "w") as f:
    f.write(storage)

# Restore localStorage
with open("localstorage.json") as f:
    storage = f.read()
page.evaluate(f"Object.entries(JSON.parse('{storage}')).forEach(([k,v]) => localStorage.setItem(k,v))")

最佳实践

  • 在多次运行之间保留浏览器 profile——积累浏览历史,挑战更容易。
  • 任务之间不要清空 cookie——保持 Google 风险评估的连续性。
  • google.com 被拦截时改用 recaptcha.net——服务一样,换个域名而已。
  • 保留 localStorage 里的 rc:: 系列键——维持 reCAPTCHA 的会话状态。
  • 偶尔访问一下 Google 的产品页面——刷新 cookie 的有效性。

常见问题排查

现象 原因 处理方式
总是遇到高难度图片挑战 没有 cookie,或用的是全新 profile 用带 Google cookie 的浏览器 profile 先跑几轮,积累历史
reCAPTCHA 提示需要 cookie 第三方 cookie 被拦截 google.com 放行 cookie,或改用 recaptcha.net
token 有效但会话对不上 站点自己的 cookie(如 PHPSESSID)没保留 保存和恢复全部 cookie,不要只存 Google 那部分
挑战反复循环,一直要求更多图片 localStorage 在多次尝试之间被清空 保留 rc::* 这些 localStorage 键

常见问题

不需要。CaptchaAI 用自己的基础设施独立识别 reCAPTCHA,不依赖你浏览器里的 cookie,需要时可选传过去作为上下文。

会过期。NID 大约 6 个月有效,1P_JAR 只有约 1 个月。定期用同一个浏览器 profile 访问 Google 页面,能让这些 cookie 保持新鲜,避免每次都重新积累信任。

不完全一样。国内更常见的 GeeTest(极验)主要靠滑动轨迹、行为特征判断风险,对 cookie 依赖没有 reCAPTCHA 重;reCAPTCHA 把 Google 生态里的登录状态、历史 cookie 当作核心信号之一。这是出海团队容易忽略的差异点。

全新账号、全新浏览器第一次跑自动化,为什么总是遇到最难的挑战?

因为 reCAPTCHA 没有历史可参考——没有 Google cookie,也没有 rc:: 系列的 localStorage 记录,风险引擎只能按最谨慎的方式处理,通常给出多轮图片挑战。先让浏览器 profile 正常使用一段时间、积累 Google cookie,再跑自动化。

延伸阅读

相关主题可以接着看:如何用 API 识别 reCAPTCHA v2 回调型挑战、reCAPTCHA v2 与 Turnstile 同站点处理指南、reCAPTCHA v2 回调机制详解。

下一步

想提升 reCAPTCHA 的识别成功率?获取你的 CaptchaAI API Key,把上面这些 cookie 管理方式用到你的自动化流程里。

该文章已禁用评论。