很多出海团队第一次接入 reCAPTCHA 都会踩坑:同一段脚本,本地跑一次就过,换到 CI 或全新会话里却连续弹出好几轮图片验证。差别往往不在脚本逻辑,而在 cookie —— reCAPTCHA 用它判断"这台浏览器像不像真实用户"。搞清楚 reCAPTCHA 读写哪些 cookie,才能在自动化里稳定保留会话、提高识别成功率。
Cookie 状态如何决定 reCAPTCHA 挑战难度
reCAPTCHA 的风险引擎把 cookie 当作信号之一,但权重很高——同一个 sitekey,cookie 状态不同,挑战完全不同:
| Cookie 状态 | 挑战难度 | 原因 |
|---|---|---|
| 已登录 Google 账号 | 最低 | 身份信号最强 |
| 有 Google cookie,但未登录 | 低到中 | 显示出正常浏览历史 |
| 全新浏览器,没有 Google cookie | 中到高 | 没有历史可供评估 |
| Cookie 被拦截或清空 | 高 | 行为可疑——正常浏览器都会带 cookie |
| 无痕 / 隐私模式 | 高 | 没有持久身份 |
Cookie 打分机制
把上面的表格拆开看,reCAPTCHA 的判断大致分三档:
- 最佳情况: 浏览器带着已登录 Google 账号的
SID、HSID、NIDcookie → 往往点一下复选框就通过。 - 较好情况: 浏览器有正常浏览积累下的
NID和1P_JAR→ 图片挑战更简单,或者直接复选框通过。 - 最差情况: 全新会话,没有任何 Google cookie → 大概率遇到多轮图片挑战。
reCAPTCHA 用到哪些 Cookie
再看 reCAPTCHA 具体读写哪些 cookie,方便对症保留。
Google 域下的 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 年 |
reCAPTCHA 专属 Cookie
这些 cookie 和 localStorage 键是 reCAPTCHA 自己写入的,专门服务于挑战流程:
| 名称 | 存储位置 | 作用 | 有效期 |
|---|---|---|---|
_GRECAPTCHA |
.google.com / .recaptcha.net |
reCAPTCHA 会话跟踪 | 会话级 |
rc::a |
localStorage | 风险分析数据 | 持久 |
rc::b |
localStorage | 时间戳数据 | 会话级 |
rc::c |
localStorage | 当前挑战数据 | 会话级 |
rc::d-<id> |
localStorage | 每个 widget 各自的数据 | 会话级 |
目标站点自身的 Cookie
站点本身也可能用 cookie 做会话和 CSRF 跟踪,这部分和 Google 无关,但同样影响流程是否顺畅:
| Cookie 类型 | 例子 | 关联 |
|---|---|---|
| 会话 ID | PHPSESSID、session_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作为备用域名; - 用
localStorage(rc::*系列键)保存客户端状态,降低对第三方 cookie 的依赖; - 给企业客户提供第一方脚本加载方案。
国内团队测试时的坑:google.com / recaptcha.net 在大陆网络下并非始终可达,先排查连通性,再怀疑脚本逻辑。
自动化流程中如何处理 Cookie
接入方式不同,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 吗?
不需要。CaptchaAI 用自己的基础设施独立识别 reCAPTCHA,不依赖你浏览器里的 cookie,需要时可选传过去作为上下文。
NID、1P_JAR 这些 cookie 会过期吗?多久需要刷新一次?
会过期。NID 大约 6 个月有效,1P_JAR 只有约 1 个月。定期用同一个浏览器 profile 访问 Google 页面,能让这些 cookie 保持新鲜,避免每次都重新积累信任。
GeeTest(极验)和 reCAPTCHA 的 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 管理方式用到你的自动化流程里。