SolveHub

验证码类型 · 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 参考。

相关文档

从 cURL 开始接入注册账户

最近更新: