本机测试服务 · 版本 1.0 · 2026 年 11 月 10 日

CloakBrowser 本地 Yes 兼容接口

服务地址:http://127.0.0.1:8191。提供 YesCaptcha 风格的创建任务和轮询接口,在本机 CloakBrowser 的网石官方页面执行 reCAPTCHA,返回 Google 实际生成的响应 token。服务不调用 YesCaptcha,不提交网石登录、发邮件或解除请求,也不收取网石账号密码。

获取 token 不等于网石已接受它,也不代表评分达到某个值。当前 Windows 本地发信流程曾成功;Linux、远程服务器与客户端不同出口的接受情况仍需实测。此实现是受限兼容适配,不是 YesCaptcha 官方服务,也不是其全部任务类型的替代。

Linux 服务器部署

此实例运行于 45.197.147.108,后台服务名 cloak-yesapi.service,工作目录 /opt/cloak-yesapi。当前仅监听 127.0.0.1:8191,等待域名配置 HTTPS。config.json 中 clientKey 为远程接口密钥;licenseKey 是 CloakBrowser 官方授权;proxyUser、proxyPassword 为服务器侧代理配置,不随接口响应返回。

本实例不依赖 Manager。每个任务启动独立的无头浏览器,通过 SOCKS5 香港入口和台湾出口获取 token,结束后关闭浏览器。每个新任务生成新的三分钟粘性会话。队列一次处理一个任务。浏览器启动与下载可能增加冷启动时间,单个工作进程最长 150 秒。

POST /createTask

请求头:Content-Type: application/json。clientKey 必填;task 必填;顶层可选 softID 为兼容字段,不参与计费或令牌生成。

会员登录 token

{
  "clientKey": "YOUR_LOCAL_CLIENT_KEY",
  "task": {
    "type": "RecaptchaV3EnterpriseTask",
    "websiteURL": "https://members.netmarble.com",
    "websiteKey": "6LfgeeIpAAAAAOrOkTCxC6y48Wgkadk9auxcwE58",
    "pageAction": "members_signin"
  },
  "softID": 53174
}

邮箱发信 token

{
  "clientKey": "YOUR_LOCAL_CLIENT_KEY",
  "task": {
    "type": "RecaptchaV3TaskProxylessM1S7",
    "websiteURL": "https://profile-auth-view.netmarble.com/",
    "websiteKey": "6LeuUwAsAAAAACYjbmwf05gr60X0Oq1r8RpJloTd",
    "pageAction": "restriction_email"
  }
}

两组域名、公钥、动作和类型必须匹配。URL 仅支持对应域名根路径,可带末尾斜杠;不接受自定义路径、查询参数或其他站点。任务内仅允许以上四个字段。不支持 minScore、代理覆盖、短信、图片或其他挑战,未支持的参数会报错,不会悄悄忽略。

成功响应

{"errorId":0,"taskId":"83f705c2-6a8c-4568-a9d2-67fda729ebec"}

创建成功只表示任务已入队。等待约 3 秒后开始轮询。

POST /getTaskResult

{
  "clientKey": "YOUR_LOCAL_CLIENT_KEY",
  "taskId": "createTask 返回的 taskId"
}

尚未完成

{"errorId":0,"status":"processing"}

已完成

{
  "errorId": 0,
  "status": "ready",
  "solution": {"gRecaptchaResponse": "Google 实际返回的 token"}
}

返回 ready 后停止轮询并立即提交给网石。接口不会提供评分、伪造 0.9 分、回传 Cookie、游戏令牌或账号信息。对同一任务重复查询会返回同一 token,不会刷新有效期;不能把它用于第二次业务提交。登录和发信必须分别创建任务。

Python 完整调用示例

以下脚本不依赖第三方 Python 包。把 KEY 换成 config.json 中的值。示例仅获取 token,不会发邮件。

import json, time
from urllib.request import Request, urlopen

BASE = "http://127.0.0.1:8191"
KEY = "YOUR_LOCAL_CLIENT_KEY"

def post(path, payload):
    req = Request(BASE + path,
        data=json.dumps({"clientKey": KEY, **payload}).encode(),
        headers={"Content-Type": "application/json"})
    with urlopen(req, timeout=15) as response:
        value = json.load(response)
    if value.get("errorId") != 0:
        raise RuntimeError(value)
    return value

created = post("/createTask", {"task": {
    "type": "RecaptchaV3TaskProxylessM1S7",
    "websiteURL": "https://profile-auth-view.netmarble.com/",
    "websiteKey": "6LeuUwAsAAAAACYjbmwf05gr60X0Oq1r8RpJloTd",
    "pageAction": "restriction_email"
}})
deadline = time.monotonic() + 180
while time.monotonic() < deadline:
    time.sleep(3)
    result = post("/getTaskResult", {"taskId": created["taskId"]})
    if result["status"] == "ready":
        token = result["solution"]["gRecaptchaResponse"]
        # 在客户端立即将 token 填入发信正文 reCAPTCHA_SCORE_Token。
        # 不要将 token 写入日志,也不要复用。
        print("取得 token,长度:", len(token))
        break
else:
    raise TimeoutError("本地任务等待超时")

服务器验证范围

服务器的 token 生成与网石业务接受情况需要分别验证;下方接口格式与 Windows 本地适配一致,后台实现采用 Linux 独立浏览器。

与你现有客户端对接

保持原来的两步调用和 solution.gRecaptchaResponse 读取方式,把服务地址换成本机地址,clientKey 换成本地密钥。会员登录的 token 放入 reCaptchaScoreToken;邮件动作的 token 放入 reCAPTCHA_SCORE_Token。

现有 chuanqi-client 的 yescaptcha 分支把服务地址写死为官方地址,chuanqi 分支又要求 HTTPS。因此目前不能只在已有配置中填入本地 HTTP 地址就接通;需要另加本地测试服务配置,或为此服务提供可信 HTTPS。本次没有修改该客户端项目。

错误与 HTTP 状态

{
  "errorId": 1,
  "errorCode": "ERROR_KEY_DOES_NOT_EXIST",
  "errorDescription": "Invalid local clientKey"
}

业务错误沿用 HTTP 200 加 errorId=1。JSON、长度或 Content-Type 错误使用 HTTP 400;未知地址使用 HTTP 404。收到错误后停止轮询此任务。生成任务和轮询请求均不自动重试。

有效期、并发与运行边界

响应格式参考:YesCaptcha createTask、getTaskResult。本站的任务范围、排队、保留时间、错误码及运行限制以上述本地实现为准。Google token 验证规则见 官方文档。