CaptchaAI 的 API 就一个核心流程:提交任务 → 轮询结果 → 拿到 token。跑通它,其余类型只是换参数——reCAPTCHA、Turnstile、GeeTest、图片验证码都一样。分四步:
- 提交 —— 把验证码参数发到
in.php - 拿任务 ID —— 从响应里保存任务 ID
- 轮询 —— 每 5 秒查询一次
res.php,直到结果就绪 - 用 token —— 把识别出的 token 填回目标页面或请求
第 0 步:注册并获取 API Key
- 在 captchaai.com 注册账号
- 打开 控制台
- 复制 32 位 API Key
账户必须有可用线程才能提交任务。CaptchaAI 按并发线程计费(BASIC $15/月、5 线程起),评估阶段可联系客服申请试用线程。
第 1 步:向 in.php 提交验证码任务
下面用 Cloudflare Turnstile 演示——国际站点上最常见的类型之一。提交前从目标页面取两个值:
- sitekey —— Turnstile 控件的公开密钥,在
data-sitekey属性或脚本参数里,以0x开头 - pageurl —— 加载该控件的完整页面 URL
四种语言任选其一,参数一致:
cURL
curl -X POST "https://ocr.captchaai.com/in.php" \
-d "key=YOUR_API_KEY" \
-d "method=turnstile" \
-d "sitekey=0x4AAAAAAAC3DHQFLr1GavNl" \
-d "pageurl=https://staging.example.com/qa-login" \
-d "json=1"
Python
import requests
response = requests.post("https://ocr.captchaai.com/in.php", data={
"key": "YOUR_API_KEY",
"method": "turnstile",
"sitekey": "0x4AAAAAAAC3DHQFLr1GavNl",
"pageurl": "https://staging.example.com/qa-login",
"json": 1,
})
print(response.json())
Node.js
const response = await fetch("https://ocr.captchaai.com/in.php", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
key: "YOUR_API_KEY",
method: "turnstile",
sitekey: "0x4AAAAAAAC3DHQFLr1GavNl",
pageurl: "https://staging.example.com/qa-login",
json: "1",
}),
});
console.log(await response.json());
PHP
<?php
$response = file_get_contents("https://ocr.captchaai.com/in.php?" . http_build_query([
"key" => "YOUR_API_KEY",
"method" => "turnstile",
"sitekey" => "0x4AAAAAAAC3DHQFLr1GavNl",
"pageurl" => "https://staging.example.com/qa-login",
"json" => 1,
]));
echo $response;
第 2 步:从响应中保存任务 ID
提交成功会返回:
{
"status": 1,
"request": "71823469"
}
request 就是任务 ID,第 3 步轮询要用它。
status 为 0 表示出错,错误码在 request 里,对照下表:
| 错误码 | 含义 | 处理方式 |
|---|---|---|
ERROR_WRONG_USER_KEY |
API Key 格式错误 | 确认 32 位 Key 没拼错 |
ERROR_KEY_DOES_NOT_EXIST |
API Key 不存在 | 在控制台核对 Key |
ERROR_ZERO_BALANCE |
没有可用线程 | 充值或等待线程释放 |
ERROR_PAGEURL |
缺少 pageurl 参数 | 补上完整页面 URL |
ERROR_WRONG_GOOGLEKEY |
sitekey 为空或格式错误 | 重新提取 sitekey(Turnstile 以 0x 开头) |
第 3 步:轮询 res.php 获取结果
首次轮询前先等 15 秒,之后每 5 秒查一次,直到结果就绪。
Python
import time
time.sleep(15)
while True:
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY",
"action": "get",
"id": "71823469",
"json": 1,
}).json()
if result.get("request") == "CAPCHA_NOT_READY":
time.sleep(5)
continue
if result.get("status") == 1:
token = result["request"]
print(f"Solved! Token: {token[:60]}...")
break
raise RuntimeError(result)
Node.js
await new Promise((r) => setTimeout(r, 15000));
while (true) {
const r = await fetch(
`https://ocr.captchaai.com/res.php?key=YOUR_API_KEY&action=get&id=71823469&json=1`,
);
const data = await r.json();
if (data.request === "CAPCHA_NOT_READY") {
await new Promise((r) => setTimeout(r, 5000));
continue;
}
if (data.status === 1) {
console.log("Solved:", data.request.slice(0, 60));
break;
}
throw new Error(JSON.stringify(data));
}
status 为 1 时,request 里就是 token。
第 4 步:把 token 用到目标页面
按验证码类型把 token 填回对应位置:
| 验证码类型 | 回填位置 |
|---|---|
| Turnstile | 写入 cf-turnstile-response 文本域,或触发页面回调 |
| reCAPTCHA | 写入 g-recaptcha-response 文本域 |
| 图片 / OCR | 填进答案输入框 |
| GeeTest v3 | 把返回的多个字段按页面要求拼装后提交 |
以 Turnstile 为例:
document.querySelector('[name="cf-turnstile-response"]').value = token;
document.querySelector("form").submit();
token 是一次性的,约 120 秒后过期:提交 → 使用 → 丢弃,切勿缓存或复用。
新手最容易踩的坑
- API Key 带空格 —— 前后空格删干净再用。
- pageurl 漏协议头 —— 必须是
https://开头的完整地址。 - 没加
json=1—— 不加时接口返回纯文本OK|71823469,.json()会报错。 - 线程已用完 —— 对照 常见错误码 和套餐线程数确认并发上限。
常见问题
为什么第一次轮询要先等 15 秒?
这类 token 型验证码要在服务端识别,通常十几秒。t=0 就查询只会一直拿到 CAPCHA_NOT_READY,还白占一个并发线程。
一直返回 CAPCHA_NOT_READY 怎么办?
正常 15–30 秒完成。同一任务超过 60 秒仍未就绪,多半卡住了,取消重提,并确认 sitekey、pageurl 与目标页面一致。
CaptchaAI 能识别 hCaptcha 吗?
暂不支持。目前覆盖 reCAPTCHA v2/v3、Turnstile 与 Cloudflare Challenge、GeeTest v3、图片/OCR、九宫格及 BLS;hCaptcha 与 FunCaptcha 暂未支持,GeeTest v4 官方标注即将支持。
下一步该学什么
按你最常遇到的类型深入:
立即在 captchaai.com/api.php 获取你的 API Key,5 分钟内完成第一次成功识别。