验证码识别接口最终只给你两种东西:一串只能用一次、60–120 秒就过期的 token,或者一枚能撑 30 分钟到 24 小时的会话 cookie。token 用纯 HTTP 请求就能提交,cookie 必须先有完整浏览器把挑战跑完。选错方向,轻则每个请求多付一次识别成本,重则在一个不下发 cookie 的表单上空耗半天。
先按场景选
| 场景 | 该用 | 原因 |
|---|---|---|
| 带 reCAPTCHA 的登录表单 | token | 跟表单字段一起 POST |
| 抓 Cloudflare 挑战页后的内容 | cookie | 解一次,几百个请求复用 |
| 带 Turnstile 的表单提交 | token | 填入 cf-turnstile-response |
| 访问 Cloudflare 后的 JSON 接口 | cookie | 一个 session 打所有接口 |
| 同域名大批量采集 | cookie | 解一次,抓到过期为止 |
一句话:提交走 token,读取走 cookie。
两条路线的完整对比
| 维度 | token 方案 | cookie 方案 |
|---|---|---|
| 产物 | 字符串 token(500+ 个字符) | 浏览器 cookie(如 qa_session_cookie) |
| 适用类型 | reCAPTCHA v2/v3、Turnstile | Cloudflare 挑战页、JS 挑战 |
| 使用方式 | 填入表单字段或 POST 正文 | 随后续 HTTP 请求发送 |
| 有效期 | 60–120 秒 | 30 分钟到 24 小时 |
| 能否复用 | 不能,一次性 | 能,会话期内有效 |
| 单次识别覆盖请求数 | 1 | 很多,直到 cookie 过期 |
hCaptcha 也是 token 类验证码,但 CaptchaAI 不支持 hCaptcha 和 FunCaptcha(Arkose Labs),GeeTest v4 只是即将支持。
token 方案:随表单提交的一次性凭证
处理流程
- 从页面源码提取 sitekey
- 把 sitekey 和页面 URL 提交给 CaptchaAI
- 轮询拿到 token 字符串
- 把 token 写进隐藏表单字段
- 提交表单
哪些验证码走 token
| 类型 | token 填入的字段 | 备注 |
|---|---|---|
| reCAPTCHA v2 | g-recaptcha-response |
文本域 |
| reCAPTCHA v3 | g-recaptcha-response |
另需 action;Enterprise sitekey 加 enterprise=1 |
| Cloudflare Turnstile | cf-turnstile-response |
隐藏域 |
| hCaptcha | h-captcha-response |
CaptchaAI 暂不支持 |
代码实现
import requests
import time
API_KEY = "YOUR_API_KEY"
# 1. Solve
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": "6Le-wvkSAAAAAPBMR...",
"pageurl": "https://staging.example.com/qa-login",
"json": "1",
}).json()
task_id = resp["request"]
# 2. Poll
token = None
for _ in range(24):
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["status"] == 1:
token = result["request"]
break
# 3. Submit form with token (no browser needed)
form_response = requests.post("https://staging.example.com/qa-login", data={
"email": "[email protected]",
"password": "password",
"g-recaptcha-response": token,
})
要盯住的三点
提交阶段不需要浏览器,token 放进 POST 表单数据,用 requests 就够;拿到立刻用掉,只有 60–120 秒的窗口,别让它在队列里排队;校验发生在服务端,站点把 token 交给 Google 或 Cloudflare 后端核验,本地拼假值无效。
cookie 方案:一次通过,整段会话复用
处理流程
- 站点返回挑战页(Cloudflare 挑战、JS 挑战)
- 浏览器把挑战跑完(内部可能用到 Turnstile)
- 服务端下发会话 cookie(如
qa_session_cookie) - 之后带这枚 cookie 的请求不再触发挑战
哪些场景走 cookie
Cloudflare 挑战页、纯 JavaScript 挑战,以及部分 WAF 拦截页都走这条路:通过之后由服务端下发会话 cookie。
代码实现
from selenium import webdriver
import requests
import time
# 1. Solve the challenge in a browser
driver = webdriver.Chrome()
driver.get("https://example.com/protected")
# Wait for challenge to complete (manually or with CaptchaAI)
time.sleep(10) # Or use CaptchaAI token 提交
# 2. Extract cookies from browser
cookies = driver.get_cookies()
qa_session_cookie = next(
(c for c in cookies if c["name"] == "qa_session_cookie"), None
)
user_agent = driver.execute_script("return navigator.userAgent")
driver.quit()
# 3. Use cookies for subsequent requests (no browser needed)
session = requests.Session()
session.headers.update({"User-Agent": user_agent})
for cookie in cookies:
session.cookies.set(cookie["name"], cookie["value"])
# All requests now pass the challenge
for page in range(1, 50):
resp = session.get(f"https://example.com/api/data?page={page}")
print(f"Page {page}: {resp.status_code}")
三条硬约束
- 解挑战必须有浏览器:挑战页要执行 JavaScript
- 同时绑 IP 和 User-Agent:后续请求两项都得对上
- 寿命 30 分钟到 24 小时:一次覆盖成百上千个请求
第二条最容易翻车:本地解完把 cookie 搬到另一台服务器,请求立刻被打回挑战页——解挑战和抓取必须共用一个出口 IP。
混合场景:挑战页套着表单验证码
不少站点两种都用:外层是 Cloudflare 挑战页(cookie),里层表单挂着 reCAPTCHA(token)。
# Step 1: Get past Cloudflare (cookie)
session = get_qa_session_cookie_session("https://example.com")
# Step 2: Load the form (using the cookie session)
html = session.get("https://example.com/submit").text
sitekey = extract_sitekey(html)
# Step 3: Solve reCAPTCHA (token)
token = solve_recaptcha(sitekey, "https://example.com/submit")
# Step 4: Submit form (cookie + token)
resp = session.post("https://example.com/submit", data={
"data": "value",
"g-recaptcha-response": token,
})
顺序不能颠倒:先拿 cookie 才能加载表单页读出 sitekey;反过来做,cookie 到手时 token 早过期了。
成本怎么摊
CaptchaAI 按并发线程计费,不按次计费:BASIC($15/月,5 线程)、STANDARD($30/月,15 线程)、ADVANCE($90/月,50 线程),线程内识别次数不设上限。单次识别耗时按类型不同,Turnstile 在 10 秒内,reCAPTCHA v2 最长 60 秒。成本差距其实在频次:token 路线的瓶颈就是线程数,提交越密集越吃线程;cookie 路线只在建立会话时占一个线程,之后的抓取不再消耗识别资源。
国内团队常撞上的组合场景
境内站点的人机验证以 GeeTest(极验)、网易易盾、腾讯防水墙为主,境外站点大多是 reCAPTCHA 和 Cloudflare。做跨境比价或海外供应商数据采集,一天里两套都会撞上:列表页是 Cloudflare 挑战(cookie),询价表单里又是 reCAPTCHA(token)。另一个现实约束:reCAPTCHA 的脚本托管在 Google 域名下,境内加载不稳定,需要真实渲染的联调放到境外测试机,本地只跑 in.php、res.php 用例。采集范围也要先划清:只采集你有权采集的公开数据,守住《网络安全法》《数据安全法》与个人信息保护法的边界。
常见问题
token 还没提交就过期了会怎样?
站点校验直接判失败,页面退回验证码状态或接口报错。正确顺序是先备好表单其他字段,最后才解验证码,拿到就立刻 POST。
会话 cookie 能换机器或换 IP 继续用吗?
不能,它同时绑定出口 IP 和 User-Agent。横向扩展时让每个 worker 各自解挑战、各自维护会话,别在集群里共享同一份 cookie。
hCaptcha 能用 CaptchaAI 识别吗?
不支持。正式支持的是 12 种类型:reCAPTCHA v2 全系、v3 与 v3 Enterprise、Turnstile、Cloudflare Challenge、GeeTest v3、图片 OCR、九宫格、BLS,另有 CaptchaFox、Friendly Captcha、Lemin 三种,均为测试版(beta)。hCaptcha 与 FunCaptcha(Arkose Labs)不在范围内。
用 CaptchaAI 跑通两条路径
在 CaptchaAI 官网 注册并获取你的 API Key。