reCAPTCHA 依赖 cookie 进行会话跟踪、风险评分和挑战状态管理。丢失或错误处理 cookie 会导致解决失败、低分和重复挑战。本指南涵盖了 reCAPTCHA 使用的每个 cookie、会话如何影响评分以及用于自动化的实用 cookie 管理。
reCAPTCHA 的 Cookie 设置和使用
reCAPTCHA 特定 cookie
| 曲奇饼 | 领域 | 目的 | 寿命 |
|---|---|---|---|
_GRECAPTCHA |
.google.com |
跨站点 reCAPTCHA 状态 | 6个月 |
rc::a |
目标站点 | 风险分析数据(画布、鼠标行为哈希) | 会议 |
rc::b |
目标站点 | 风险分析数据(行为信号) | 会议 |
rc::c |
目标站点 | 风险分析数据(时间) | 会议 |
rc::d-15# |
目标站点 | 挑战状态持久性 | 会议 |
Google 帐户 cookie(影响分数)
| 曲奇饼 | 领域 | 目的 | 分数影响 |
|---|---|---|---|
SID |
.google.com |
谷歌会话 ID | +0.1 至 +0.3 |
HSID |
.google.com |
仅 HTTP 会话 ID | 会话信任的一部分 |
SSID |
.google.com |
安全会话 ID | 会话信任的一部分 |
NID |
.google.com |
Google 偏好/session | +0.05 至 +0.1 |
1P_JAR |
.google.com |
谷歌广告个性化 | 次要信任信号 |
reCAPTCHA 使用的第三方 cookie
| 曲奇饼 | 领域 | 目的 |
|---|---|---|
CONSENT |
.google.com |
Cookie 同意状态 |
AEC |
.google.com |
加密广告 cookie |
SOCS |
.google.com |
Cookie 同意设置 |
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)
自动化中的 Cookie 管理
策略 1:持久化 cookie jar
跨请求维护 cookie 以建立会话信任:
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())
策略2:Selenium中的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
Strategy 3: Cookie forwarding in Puppeteer
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();
})();
基于 API 的解决方案的会话要求
使用 CaptchaAI 时,求解器在其自己的环境中生成令牌。目标网站验证令牌而不检查浏览器的 cookie。然而,一些实现添加了额外的验证:
标准 reCAPTCHA(大多数站点)
无需 cookie 转发。 CaptchaAI 仅使用 sitekey 和 pageurl 生成有效令牌:
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 的实现
一些高安全性站点会验证提交令牌的会话是否与加载 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 上设置的并从第三方上下文中读取。
谷歌的回应:
- reCAPTCHA v3 和 Enterprise 使用第一方 JavaScript 执行
- Cookie 正在转换为
Partitioned(CHIPS) 存储 rc::cookie 已经是第一方(在目标站点的域上设置)
对自动化的影响:
- 最小。基于 API 的解决不受影响,因为 CaptchaAI 在服务器端生成令牌。
- 随着 Google 调整其 cookie 策略,基于浏览器的自动化可能会出现较小的分数变化。
Cookie 故障排除
| 问题 | 原因 | 解决方案 |
|---|---|---|
| reCAPTCHA v2总是表现出形象挑战 | 无会话cookie,信任度低 | 跨请求保留 cookie |
| reCAPTCHA v3 分数始终 < 0.3 | 每次都有新鲜的会话 | 维护 cookie 罐 |
| 令牌有效一次,重试时失败 | 会话 cookie 不匹配 | 使用同一会话进行页面加载和提交 |
| “Cookie/session 验证失败” | 站点检查 cookie 链 | 使用基于浏览器的token 提交 |
| reCAPTCHA 小部件未加载 | 第三方 cookie 被阻止 | 允许 google.com cookie |
常见问题
我需要将cookie传递给CaptchaAI吗?
不会。CaptchaAI 在自己优化的环境中生成令牌,不需要您的浏览器 cookie。您只需提供sitekey和pageurl即可。生成的令牌对于任何客户端提交都有效。
Cookie 会过期并需要刷新吗?
是的。 _GRECAPTCHA 持续 6 个月,但 rc:: 会话 cookie 在浏览器关闭时过期。 Google 帐户 cookie(SID、HSID)过去 2 年,但 Google 可能会使其失效。为了实现自动化,请将 cookie 保存到磁盘并通过访问目标站点定期刷新它们。
我可以在另一个浏览器中使用来自一个浏览器的 cookie 吗?
是的,有限制。 Cookie 可以导出(作为 JSON 或 Netscape 格式)并导入到请求、Selenium 或 Puppeteer 会话中。但是,浏览器特征会有所不同,reCAPTCHA 可能会检测到。 Cookie 提供了信任奖励,但新的浏览器环境可能会抵消它。
为什么清除 cookie 会使 reCAPTCHA 变得更加困难?
清除 cookie 会删除 _GRECAPTCHA 信任 cookie 和 rc:: 行为历史记录 cookie。 reCAPTCHA 将您视为没有历史记录的全新访客,从较低的基线开始风险评分。这就是为什么隐身 /private 浏览经常会引发更多验证码挑战的原因。
概括
reCAPTCHA 使用 cookie 进行会话跟踪(rc:: cookie)、跨站点信任(_GRECAPTCHA)和 Google 帐户链接(SID、HSID)。没有饼干的新会话会产生较低的分数和更难的挑战。对于基于 API 的求解CaptchaAI,不需要 cookie — 求解器仅使用 sitekey 和页面 URL 生成有效令牌。对于依赖于 cookie 的实现,请使用基于浏览器的方法:加载页面(建立 cookie),通过 CaptchaAI 求解,注入令牌,然后从同一浏览器会话提交。
相关文章
- 如何使用Api解决Recaptcha V2回调
- Recaptcha V2 Turnstile同一站点处理
- Recaptcha V2回调机制