reCAPTCHA v2 老弹图片验证码?大概率不是脚本写错了,而是浏览器里没有 cookie 可用。reCAPTCHA 靠 _GRECAPTCHA、rc:: 这类 cookie 判断你是不是老用户——没有历史记录的全新会话,风险分从一开始就低。
这篇文章按 cookie 类型、评分逻辑、报错自查、自动化管理、API 是否需要 cookie 五条线讲清楚。
一句话答案: 没有 cookie 的全新会话分数更低、更容易弹图片验证码;CaptchaAI API 识别通常不需要传 cookie。
reCAPTCHA 都用哪些 cookie
reCAPTCHA 专属 cookie
这五个 cookie 只服务 reCAPTCHA 本身,跟 Google 账号无关:
| Cookie | 作用域 | 作用 | 有效期 |
|---|---|---|---|
_GRECAPTCHA |
.google.com |
跨站 reCAPTCHA 状态 | 6 个月 |
rc::a |
目标站点 | 风险分析数据(canvas、鼠标行为哈希) | 会话期间 |
rc::b |
目标站点 | 风险分析数据(行为信号) | 会话期间 |
rc::c |
目标站点 | 风险分析数据(时间特征) | 会话期间 |
rc::d-15# |
目标站点 | 验证码挑战状态持久化 | 会话期间 |
Google 账号与同意类 cookie(决定分数与许可状态)
这组 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 同意设置 | 不直接影响分数 |
没有 cookie,reCAPTCHA 分数为什么更低
全新会话:一个 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 回来
反过来,带历史 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)
常见 cookie 报错怎么排查
先对照这张表自查,再决定要不要动手改自动化脚本:
| 现象 | 原因 | 解决办法 |
|---|---|---|
| reCAPTCHA v2 总是弹图片验证码 | 没有会话 cookie,信任度低 | 让 cookie 跨请求保留 |
| reCAPTCHA v3 分数一直 < 0.3 | 每次都是全新会话 | 维护持久化的 cookie jar |
| token 第一次能用,重试就失败 | 会话 cookie 对不上 | 页面加载和提交用同一个会话 |
| 报错 "Cookie/session 验证失败" | 目标站点校验 cookie 链 | 改用浏览器路径注入 token |
| reCAPTCHA 组件加载不出来 | 第三方 cookie 被拦截 | 放行 google.com 的 cookie |
自动化脚本怎么管理 cookie
跨请求保持会话信任,得靠落盘持久化的 cookie jar:
方案一:把 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())
方案二:Selenium 里转发 cookie
思路一致,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
方案三:在 Puppeteer 里转发 cookie
同样先加载 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。
API 方式识别 reCAPTCHA,还需要 cookie 吗
用 CaptchaAI 的 API 识别 reCAPTCHA 时,token 是在 CaptchaAI 自己的环境里生成的,目标网站校验的是 token 本身,不会检查你浏览器的 cookie。不过少数实现会额外校验会话,这时候才需要走浏览器路径。
大多数站点:只要 sitekey 和 pageurl,不用管 cookie
标准场景不需要转发任何 cookie,CaptchaAI 只用 sitekey 和 pageurl 就能生成有效 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,
})
少数高安全站点:会校验 cookie 链
部分安全要求较高的站点,会核对提交 token 的会话和加载 reCAPTCHA 组件时的会话是不是同一个。遇到这种情况,走浏览器路径:
- 用真实浏览器打开页面,建立 cookie
- 从页面里取出 sitekey
- 把 sitekey 和 pageurl 提交给 CaptchaAI
- 把拿到的 token 写回同一个浏览器会话
- 在同一个浏览器会话里提交表单(保持 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()
第三方 cookie 被拦截,会影响识别吗
Chrome 正在淘汰第三方 cookie
Chrome 在逐步淘汰第三方 cookie,这会牵连到 reCAPTCHA——_GRECAPTCHA 是在 .google.com 上设置的,属于从第三方上下文读取的 cookie。
Google 的应对: reCAPTCHA v3 和 Enterprise 已经改用第一方 JavaScript 执行,cookie 也在迁移到
Partitioned(CHIPS)存储;rc::系列 cookie 本来就写在目标站点自己的域名下,不受影响。对自动化脚本的影响: 影响很小——基于 API 的识别不受影响,因为 CaptchaAI 是在服务端生成 token 的;基于浏览器的自动化可能会随着 Google 调整 cookie 策略出现小幅分数波动。
常见问题
需要把浏览器 cookie 传给 CaptchaAI 吗?
不需要。CaptchaAI 在自己的环境里生成 token,不依赖你浏览器的 cookie,只要提供 sitekey 和 pageurl 就够了。生成出来的 token,换任何客户端提交都有效。
reCAPTCHA 的 cookie 会过期吗,多久要刷新一次?
会。_GRECAPTCHA 撑 6 个月,rc:: 会话 cookie 一关浏览器就失效,Google 账号 cookie(SID、HSID)理论上能撑 2 年但随时可能作废。自动化建议把 cookie 存盘,定期访问目标站点刷新。
国内网络环境下,reCAPTCHA 是不是特别容易弹图片验证码?
是的。reCAPTCHA 依赖 google.com 资源,国内到 Google 的连通性本身不稳定,加上多数访问是"全新会话"(没有历史 _GRECAPTCHA/rc:: cookie),风险分从起点就偏低,更容易触发图片验证码——这是网络可达性叠加会话历史的结果,不是识别能力问题。
多线程批量跑脚本,要不要给每个线程单独的 cookie jar?
要。多个线程共用一份 cookie 文件,rc:: 系列 cookie 会互相覆盖,v3 分数忽高忽低。按线程编号拆分 cookie 文件是最简单的解法。
总结
reCAPTCHA 靠 cookie 做三件事:会话跟踪(rc::)、跨站信任(_GRECAPTCHA)、Google 账号关联(SID、HSID)。全新会话没有 cookie,分数天然更低。用 CaptchaAI 的 API 识别不需要 cookie,遇到会校验 cookie 链的站点才走浏览器路径:建立 cookie、CaptchaAI 识别、把 token 写回同一会话再提交。
相关文章
- 如何用 API 识别 reCAPTCHA v2 回调
- reCAPTCHA v2 和 Turnstile 同站处理
- reCAPTCHA v2 回调机制解析