打码服务 / FunCaptcha 协议版

FunCaptcha 协议版

FunCaptcha(Arkose)  ·  FunCaptchaTask

Arkose Labs FunCaptcha 的协议解法:把页面下发的 blob 交给我们,换回可直接提交的 token。

Arkose 的建号门 / 登录门只认这里返回的 token,图像识别版的结果它不接受。你只要把页面已经拿到的那几样东西转过来,剩下的交互我们跑完。

必须自带代理,而且要和你会话用同一个出口。Arkose 的 token 与出口 IP 绑定:换一个 IP 打出来的 token,你拿回去提交是不认的。这也是为什么这一页的参数里除了站点信息还要填代理。

? 参考图 提交 旋转到与参考图一致的角度
协议版的界面和上面一模一样,区别在你怎么用:不用自己看图,把页面下发的 blob 连出口一起交过来,换回可直接提交的 token。

请求

POST /v1/captcha/solve?timeout=180
Authorization: Bearer arp_xxx
Content-Type: application/json

请求参数

参数类型必填说明
typestring是固定填 FunCaptchaTask
websiteURLstring是承载验证码的页面地址(不是站点首页)
websitePublicKeystring是Arkose 的 public key。页面里长这样:https://<apiJSSubdomain>/v2/<这一段>/…
funcaptchaApiJSSubdomainstring否上面那个 <apiJSSubdomain>。站点启用 vanity 域名时必须填,不填会回落默认域
datastring是页面下发的 blob,包成 JSON 字符串:{"blob":"<原样密文>"}
userAgentstring是必填。且必须与你真发请求时声称的 UA 一致,否则 token 提交回去不认
proxyTypestring是http / https / socks5
proxyAddressstring是代理主机名或 IP
proxyPortinteger是代理端口
proxyLoginstring否代理用户名(有认证才填)
proxyPasswordstring否代理密码

只传上表列出的参数即可,认证由网关自动处理。

请求示例

{
  "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"))

注意事项

错误

失败时返回 502,积分全额退回,可以安全重试:

{"error":"识别失败,已全额退回 10 积分:...","code":"mint_failed"}
code含义处理
insufficient_credits积分不足(402,未扣费)充值后重试
bad_request参数不合法或类型不支持(400)对照上方参数表改
mint_failed识别失败(502,已退回)退避 2~3 秒重试
rate_limited触发限流(429)按 Retry-After 退避