验证码类型 · funcaptcha
Arkose Labs FunCaptcha 识别 API:获取 FunCaptcha Token
通过 SolveHub API 解决 Arkose Labs FunCaptcha:公钥、站点 URL、挑战上下文(blob)、浏览器信息与代理。请求字段、cURL 示例、结果 token 与故障排查。
适用于授权自动化测试、风控 QA 与浏览器集成。请仅在有权测试的站点和业务流程中使用。
POST /v1/tasks 发送下方 JSON,附带 Authorization: Bearer <API_KEY>、Content-Type: application/json 与 Idempotency-Key。先在实时价格确认该类型可用;完整创建与查询流程见快速开始。可用性说明:Arkose FunCaptcha 的检测机制与挑战更新非常频繁,求解成功率可能随时下降,也可能出现短期内完全无法求解的情况。本类型不保证可用性与成功率,请勿用于对可用性有强依赖的业务。失败的任务不扣费、预占金额全额退还;建议在接入侧做好失败重试与降级处理。
Arkose Labs FunCaptcha 完整求解:需要你提供代理,以及从同一次真实挑战采集的 challengeInfo(页面与挑战配置)和 browserInfo(要模拟的浏览器)。平台把这三项原样转交求解服务,求解成功后返回 Arkose token。所有字段都应来自你的真实页面和浏览器,凭空编造通常会被识别或直接失败。
请求字段
外层 type 和 task 必填;以下 task.* 路径均位于 task 对象内。字段名区分大小写。长度限制按 UTF-8 字节计算。
| 字段 | 类型 | 必填 | 限制 | 说明 |
|---|---|---|---|---|
type |
字符串 | 是 | 固定为 funcaptcha |
平台任务类型。 |
task |
JSON 对象 | 是 | ≤ 7 MiB | 此类型的任务参数。 |
task.proxy |
带端口的代理 URL | 是 | ≤ 2048 字节 | 求解时使用的代理,格式 protocol://user:pass@host:port 或 protocol://ip:port,protocol 为 http、https 或 socks5,端口 1–65535。 |
task.challengeInfo |
对象 | 是 | 见下表 | 验证码与指纹配置。 |
task.browserInfo |
对象 | 是 | 见下表 | 要模拟的浏览器设置。 |
challengeInfo 字段
共 41 个字段,其中 12 个必填。可选字段不传即使用默认行为;传入时必须是表中类型,否则创建请求返回 400 INVALID_TASK。表中未列出的字段会被拒绝。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
challengeInfo.publicKey |
非空字符串 | 是 | 站点的 Arkose 公钥(页面中 data-pkey 或 public_key 的值)。 |
challengeInfo.site |
非空字符串 | 是 | 出现验证码的站点地址。 |
challengeInfo.surl |
非空字符串 | 是 | 该站点的 Arkose 服务地址(service URL),例如 https://xxx.arkoselabs.com。 |
challengeInfo.apiUrl |
非空字符串 | 否 | 验证码 api.js 的完整地址。 |
challengeInfo.capiMode |
非空字符串 | 是 | 验证码模式,如 lightbox、inline。 |
challengeInfo.styleTheme |
非空字符串 | 是 | 验证码样式主题,通常为 default。 |
challengeInfo.locationHref |
非空字符串 | 是 | 验证码所在页面(iframe)的 location.href。 |
challengeInfo.documentReferrer |
非空字符串 | 是 | 该页面的 document.referrer。 |
challengeInfo.documentTitle |
非空字符串 | 否 | 该页面的 document.title。 |
challengeInfo.iframeUrl |
非空字符串 | 否 | 验证码 iframe 的地址。 |
challengeInfo.ancestorOrigins |
字符串数组 | 是 | location.ancestorOrigins 列表,可以为空数组。 |
challengeInfo.treeIndex |
整数数组 | 是 | 当前框架在页面框架树中的位置,如 [0];可以为空数组。 |
challengeInfo.treeStructure |
非空字符串 | 是 | 页面框架树结构字符串,如 "[[]]"。 |
challengeInfo.languageEnabled |
布尔值 | 是 | 是否启用了自定义语言。 |
challengeInfo.jsfEnabled |
布尔值 | 是 | 是否启用了 JavaScript 字体。 |
challengeInfo.appMode |
布尔值 | 否 | 验证码运行在非浏览器的应用内时设为 true。 |
challengeInfo.uniqueFingerprint |
布尔值 | 否 | 每次使用全新指纹,而不是默认的指纹算法。 |
challengeInfo.oldFingerprint |
布尔值 | 否 | 使用较旧的指纹以增加随机性。 |
challengeInfo.overrideFingerprint |
布尔值 | 否 | 用传入的 Sec-Ch-Ua 与 User-Agent 覆盖指纹中的对应值。 |
challengeInfo.syntheticFingerprint |
布尔值 | 否 | 在指纹中合成部分数据。 |
challengeInfo.randomProtoChain |
布尔值 | 否 | 使用随机的原型链哈希。 |
challengeInfo.randomVideoExtended |
布尔值 | 否 | 使用随机的扩展视频编解码器信息。 |
challengeInfo.staticSpeechData |
布尔值 | 否 | 使用默认的语音合成数据。 |
challengeInfo.customTimezoneOffset |
整数 | 否 | 时区偏移(分钟),与 JavaScript getTimezoneOffset() 一致。 |
challengeInfo.historyLength |
整数 | 否 | 附带的浏览历史长度(history.length)。 |
challengeInfo.noIframe |
布尔值 | 否 | 验证码不通过独立 iframe 加载时设为 true。 |
challengeInfo.lowBandwidthMode |
布尔值 | 否 | 低带宽模式:使用最新的 capi 信息并减少非必要请求;可能导致被识别或使用错误的 capi 信息。 |
challengeInfo.storageAccess |
布尔值 | 否 | 是否带 Sec-Fetch-Storage-Access 请求头。 |
challengeInfo.solvePOW |
布尔值 | 否 | 遇到工作量证明(PoW)挑战时一并求解。 |
challengeInfo.cookieTimestamp |
布尔值 | 否 | 是否附带时间戳 Cookie。 |
challengeInfo.disableArid |
布尔值 | 否 | 关闭 ARID Cookie 和 X-Ark-Arid 请求头。 |
challengeInfo.disableAridCookie |
布尔值 | 否 | 只关闭 ARID Cookie。 |
challengeInfo.disableCookies |
布尔值 | 否 | 关闭全部 Cookie。 |
challengeInfo.disableCookiesAnalytics |
布尔值 | 否 | 关闭分析类 Cookie。 |
challengeInfo.disableGT2Cookies |
布尔值 | 否 | 关闭 gt2/public_key 接口的 Cookie。 |
challengeInfo.disableNavigatorCookies |
布尔值 | 否 | 关闭 navigator Cookie(即 navigator.cookieEnabled)。 |
challengeInfo.powPause |
布尔值 | 否 | 模拟 CPU 求解 PoW 的真实停顿。 |
challengeInfo.exploitMode |
布尔值 | 否 | 使用加速方式求解,不使用代理。 |
challengeInfo.skipHighWaves |
布尔值 | 否 | 遇到 6 波及以上的挑战时直接放弃并返回失败,而不是继续求解。 |
challengeInfo.submitAnswerPause |
布尔值 | 否 | 提交答案时加入真实的停顿。 |
challengeInfo.extraData |
对象 | 否 | 附加数据,会以 data[<键名>] 的形式随请求发给 FunCaptcha,例如 Roblox 的 {"blob": "..."}。 |
browserInfo 字段
共 16 个字段,其中 5 个必填(User-Agent、Linux、Mac、Mobile、Safari)。User-Agent、Sec-Ch-Ua、Accept-Language 等应来自同一个真实浏览器,并与平台标志保持一致。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
browserInfo.Accept-Language |
非空字符串 | 否 | Accept-Language 请求头,如 en-US,en;q=0.9。 |
browserInfo.Cache |
布尔值 | 否 | 是否使用浏览器缓存。 |
browserInfo.Cookie |
非空字符串 | 否 | 求解时使用的 Cookie。 |
browserInfo.DNT |
布尔值 | 否 | 是否添加 Do Not Track 请求头(适合 Brave 等浏览器)。 |
browserInfo.HTTP3 |
布尔值 | 否 | 是否使用 HTTP/3 协议,所用代理必须支持 HTTP/3。 |
browserInfo.Linux |
布尔值 | 是 | 是否模拟 Linux 设备。 |
browserInfo.Mac |
布尔值 | 是 | 是否模拟 Mac 设备。 |
browserInfo.Mobile |
布尔值 | 是 | 是否模拟移动设备。 |
browserInfo.Safari |
布尔值 | 是 | 是否模拟 Safari 浏览器。 |
browserInfo.Sec-Ch-Ua |
非空字符串 | 否 | Sec-Ch-Ua 请求头。 |
browserInfo.Sec-Ch-Ua-Platform |
非空字符串 | 否 | Sec-Ch-Ua-Platform 请求头,如 "Windows"。 |
browserInfo.User-Agent |
非空字符串 | 是 | User-Agent 请求头,应与 Linux/Mac/Mobile/Safari 的设置一致。 |
browserInfo.dataBrands |
非空字符串 | 否 | 指纹中使用的 data brands。 |
browserInfo.languages |
非空字符串 | 否 | 使用的语言,一般应与 Accept-Language 一致。 |
browserInfo.randomTLS |
布尔值 | 否 | 使用随机 TLS 指纹;开启后无法使用 HTTP/3。 |
browserInfo.userbrowser |
非空字符串 | 否 | 指定 userbrowser,有时与 User-Agent 略有不同。 |
创建请求示例
以下示例只包含必填字段和常用请求头,所有值都是占位符,必须替换为你页面中的真实值。
{
"type": "funcaptcha",
"task": {
"proxy": "http://user:pass@203.0.113.10:8080",
"challengeInfo": {
"publicKey": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"site": "https://example.com",
"surl": "https://example.arkoselabs.com",
"capiMode": "lightbox",
"styleTheme": "default",
"locationHref": "https://example.com",
"documentReferrer": "https://example.com",
"ancestorOrigins": [
"https://example.com"
],
"treeIndex": [
0
],
"treeStructure": "[[]]",
"languageEnabled": true,
"jsfEnabled": true
},
"browserInfo": {
"Accept-Language": "en-US,en;q=0.9",
"Linux": false,
"Mac": false,
"Mobile": false,
"Safari": false,
"Sec-Ch-Ua": "\"Chromium\";v=\"152\", \"Not?A_Brand\";v=\"24\", \"Google Chrome\";v=\"152\"",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36"
}
}
}
cURL 调用
把示例中的 Key、站点信息与代理替换为你的实际值;Idempotency-Key 对同一次业务请求保持不变。
curl -sS -X POST 'https://www.tiam.codes/v1/tasks' \
-H 'Authorization: Bearer sh_REPLACE_ME' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: example-funcaptcha-0001' \
--data-binary @- <<'JSON'
{
"type": "funcaptcha",
"task": {
"proxy": "http://user:pass@203.0.113.10:8080",
"challengeInfo": {
"publicKey": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"site": "https://example.com",
"surl": "https://example.arkoselabs.com",
"capiMode": "lightbox",
"styleTheme": "default",
"locationHref": "https://example.com",
"documentReferrer": "https://example.com",
"ancestorOrigins": [
"https://example.com"
],
"treeIndex": [
0
],
"treeStructure": "[[]]",
"languageEnabled": true,
"jsfEnabled": true
},
"browserInfo": {
"Accept-Language": "en-US,en;q=0.9",
"Linux": false,
"Mac": false,
"Mobile": false,
"Safari": false,
"Sec-Ch-Ua": "\"Chromium\";v=\"152\", \"Not?A_Brand\";v=\"24\", \"Google Chrome\";v=\"152\"",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36"
}
}
}
JSON
创建响应与查询
创建成功返回 HTTP 202,status 初始通常为 queued。保存 taskId,每约 2–3 秒调用 GET /v1/tasks/{taskId} 查询。本类型处理软时限为 180 秒。求解中状态为 dispatching 或 processing;结束后为 completed 或 failed。超过时限仍未拿到结果的任务进入 uncertain,请继续查询原任务,不要用新的幂等键重建。
结果字段
status=completed 时,solution 是一个对象:
| 字段 | 类型 | 读取方式 |
|---|---|---|
solution.solution |
字符串 | Arkose token,提交给目标站点(通常填入 fc-token / verification-token 等字段)。以 ` |
solution.gameInfo.gameType |
整数 | 本次挑战的游戏类型。 |
solution.gameInfo.variant |
字符串 | 挑战变体;silent_pass 表示无需答题直接通过。 |
solution.gameInfo.waves |
整数 | 答题的波数,0 表示静默通过。 |
solution.gameInfo.solveTime |
数字 | 求解耗时(秒)。 |
成功响应示例:
{
"taskId": "5a1c6c55-7f3b-4c5d-9a7e-2f0d8e1b9c21",
"type": "funcaptcha",
"status": "completed",
"priceMicros": 2000,
"traceId": "0f3b2d7e-91a4-4c62-8a51-7d2e9c4b1f08",
"solution": {
"gameInfo": {
"gameType": 4,
"solveTime": 0.32,
"variant": "silent_pass",
"waves": 0
},
"solution": "XXXXXXXXXXXXXXXXX.XXXXXXXXXX|r=eu-west-1|meta=3|metabgclr=transparent|metaiconclr=%23757575|maintxtclr=%23b8b8b8|guitextcolor=%23474747|pk=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX|at=40|sup=1|rid=1|ag=101|cdn_url=https%3A%2F%2Fexample.arkoselabs.com%2Fcdn%2Ffc|surl=https%3A%2F%2Fexample.arkoselabs.com|smurl=https%3A%2F%2Fexample.arkoselabs.com%2Fcdn%2Ffc%2Fassets%2Fstyle-manager"
},
"createdAt": "2026-10-13T08:00:00Z",
"finishedAt": "2026-10-13T08:00:06Z"
}
失败响应示例:
{
"taskId": "5a1c6c55-7f3b-4c5d-9a7e-2f0d8e1b9c21",
"type": "funcaptcha",
"status": "failed",
"priceMicros": 2000,
"traceId": "0f3b2d7e-91a4-4c62-8a51-7d2e9c4b1f08",
"errorCode": "TASK_FAILED",
"failureReason": "Too many waves to solve, make skipHighWaves false in challengeInfo to solve anyway",
"createdAt": "2026-10-13T08:00:00Z",
"finishedAt": "2026-10-13T08:00:04Z"
}
失败与排查
任务失败(status=failed)时不扣费,预占金额全额退还;failureReason 给出求解服务返回的具体原因。常见原因与处理:
| failureReason(示例) | 原因 | 处理 |
|---|---|---|
Too many waves to solve, make skipHighWaves false in challengeInfo to solve anyway |
挑战达到 6 波或以上,且 challengeInfo.skipHighWaves 为 true。 |
把 skipHighWaves 设为 false(或不传)后重新创建任务。 |
Failed to get proxy / IP information |
代理无法连接或无法获取出口 IP。 | 检查代理地址、端口、账号密码以及代理是否可用。 |
Incorrect proxy format. Please use protocol://user:pass@host:port or protocol://ip:port |
代理格式不被求解服务接受。 | 按 protocol://user:pass@host:port 填写。 |
HTTP/3 proxies must be used on Roblox right now |
求解服务当前要求 Roblox 必须使用 HTTP/3 代理,所用代理不符合。 | 更换支持 HTTP/3 的代理后重试。 |
Unsupported surl |
该 surl 暂不受支持。 |
确认 surl 取自真实页面;仍不支持时请联系平台客服。 |
重新提交时请使用新的 Idempotency-Key(同一个键会返回原失败任务)。字段类型或必填项不符合时,创建请求直接返回 400 INVALID_TASK,不会产生任务或扣费。
创建请求常见错误为 400 INVALID_TASK、402 INSUFFICIENT_BALANCE、429 TASK_LIMIT_EXCEEDED 和 503 TYPE_UNAVAILABLE。已创建任务失败时公开错误码为 TASK_FAILED 或 TASK_TIMEOUT;uncertain 对应 TASK_UNCERTAIN。详见 平台 API 参考。
相关文档
最近更新: