打码服务 / FunCaptcha 协议版
FunCaptcha 协议版
FunCaptcha(Arkose) ·
FunCaptchaTaskArkose Labs FunCaptcha 的协议解法:把页面下发的 blob 交给我们,换回可直接提交的 token。
Arkose 的建号门 / 登录门只认这里返回的 token,图像识别版的结果它不接受。你只要把页面已经拿到的那几样东西转过来,剩下的交互我们跑完。
必须自带代理,而且要和你会话用同一个出口。Arkose 的 token 与出口 IP 绑定:换一个 IP 打出来的 token,你拿回去提交是不认的。这也是为什么这一页的参数里除了站点信息还要填代理。
请求
POST /v1/captcha/solve?timeout=180
Authorization: Bearer arp_xxx
Content-Type: application/json请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
type | string | 是 | 固定填 FunCaptchaTask |
websiteURL | string | 是 | 承载验证码的页面地址(不是站点首页) |
websitePublicKey | string | 是 | Arkose 的 public key。页面里长这样:https://<apiJSSubdomain>/v2/<这一段>/… |
funcaptchaApiJSSubdomain | string | 否 | 上面那个 <apiJSSubdomain>。站点启用 vanity 域名时必须填,不填会回落默认域 |
data | string | 是 | 页面下发的 blob,包成 JSON 字符串:{"blob":"<原样密文>"} |
userAgent | string | 是 | 必填。且必须与你真发请求时声称的 UA 一致,否则 token 提交回去不认 |
proxyType | string | 是 | http / https / socks5 |
proxyAddress | string | 是 | 代理主机名或 IP |
proxyPort | integer | 是 | 代理端口 |
proxyLogin | string | 否 | 代理用户名(有认证才填) |
proxyPassword | string | 否 | 代理密码 |
只传上表列出的参数即可,认证由网关自动处理。
请求示例
{
"type": "FunCaptchaTask",
"websiteURL": "https://auth.example.com/en_US/deeplink.html?deeplink=signup",
"websitePublicKey": "436DD567-5435-4B14-89A6-2F1188E11334",
"funcaptchaApiJSSubdomain": "arks-client.example.com",
"data": "{\"blob\":\"eyJ2ZXJzaW9uIjoiMi4wLjAiLC...\"}",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"proxyType": "http",
"proxyAddress": "proxy.example.net",
"proxyPort": 3000,
"proxyLogin": "user-region-US-sid-abc123-t-30",
"proxyPassword": "secret"
}响应示例
{
"ok": true,
"task_id": "032bb4ca-c6d4-11f1-922f-b62687d51817",
"ready": true,
"took_ms": 63400,
"price": 15,
"balance": 985,
"solution": { "token": "0e5a3f...372" },
"token": "0e5a3f...372"
}怎么取结果:取
token,原样放进你提交表单时那个验证码字段。提交时必须还从这个代理出去 —— 换出口 token 就废了。完整调用
curl -X POST 'https://api.xiaobaicap.com/v1/captcha/solve?timeout=180' \
-H "Authorization: Bearer arp_xxx" \
-H 'Content-Type: application/json' \
-d '{
"type": "FunCaptchaTask",
"websiteURL": "https://auth.example.com/en_US/deeplink.html?deeplink=signup",
"websitePublicKey": "436DD567-5435-4B14-89A6-2F1188E11334",
"funcaptchaApiJSSubdomain": "arks-client.example.com",
"data": "{\"blob\":\"eyJ2ZXJzaW9uIjoiMi4wLjAiLC...\"}",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"proxyType": "http",
"proxyAddress": "proxy.example.net",
"proxyPort": 3000,
"proxyLogin": "user-region-US-sid-abc123-t-30",
"proxyPassword": "secret"
}'
import requests
r = requests.post(
"https://api.xiaobaicap.com/v1/captcha/solve",
headers={"Authorization": "Bearer arp_xxx"},
params={"timeout": 180},
json={
"type": "FunCaptchaTask",
"websiteURL": "https://auth.example.com/en_US/deeplink.html?deeplink=signup",
"websitePublicKey": "436DD567-5435-4B14-89A6-2F1188E11334",
"funcaptchaApiJSSubdomain": "arks-client.example.com",
"data": "{\"blob\":\"eyJ2ZXJzaW9uIjoiMi4wLjAiLC...\"}",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"proxyType": "http",
"proxyAddress": "proxy.example.net",
"proxyPort": 3000,
"proxyLogin": "user-region-US-sid-abc123-t-30",
"proxyPassword": "secret"
},
timeout=200,
)
d = r.json()
if not d.get("ok"):
raise SystemExit(d)
print(d.get("token") or d.get("text") or d.get("objects"))注意事项
- data 是字符串不是对象。写反了会收到参数错误。blob 原样贴,不要自己解 base64 或改编码。
- userAgent 必填,缺了直接回 ERROR_REQUIRED_FIELDS(提示检查 userAgent)。
- 出票通常 40~90 秒,比 reCAPTCHA 慢。客户端超时建议 ≥ 180 秒。
- 代理要粘性:出口在打码期间不能变(常见写法是在代理用户名里带 sid 和粘性时长)。代理用用户名 + 密码认证,不要用 IP 白名单。
- 粘性时长要覆盖到你把 token 提交回去那一刻,只覆盖打码这几秒是不够的。
错误
失败时返回 502,积分全额退回,可以安全重试:
{"error":"识别失败,已全额退回 10 积分:...","code":"mint_failed"}
| code | 含义 | 处理 |
|---|---|---|
insufficient_credits | 积分不足(402,未扣费) | 充值后重试 |
bad_request | 参数不合法或类型不支持(400) | 对照上方参数表改 |
mint_failed | 识别失败(502,已退回) | 退避 2~3 秒重试 |
rate_limited | 触发限流(429) | 按 Retry-After 退避 |