Comparisons

基于令牌与基于 Cookie 的验证码解决

验证码识别接口最终只给你两种东西:一串只能用一次、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 方案:随表单提交的一次性凭证

处理流程

  1. 从页面源码提取 sitekey
  2. 把 sitekey 和页面 URL 提交给 CaptchaAI
  3. 轮询拿到 token 字符串
  4. 把 token 写进隐藏表单字段
  5. 提交表单

哪些验证码走 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 后端核验,本地拼假值无效。

处理流程

  1. 站点返回挑战页(Cloudflare 挑战、JS 挑战)
  2. 浏览器把挑战跑完(内部可能用到 Turnstile)
  3. 服务端下发会话 cookie(如 qa_session_cookie
  4. 之后带这枚 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.phpres.php 用例。采集范围也要先划清:只采集你有权采集的公开数据,守住《网络安全法》《数据安全法》与个人信息保护法的边界。

常见问题

token 还没提交就过期了会怎样?

站点校验直接判失败,页面退回验证码状态或接口报错。正确顺序是先备好表单其他字段,最后才解验证码,拿到就立刻 POST。

不能,它同时绑定出口 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。

相关阅读

该文章已禁用评论。