本机测试服务 · 版本 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"
}
ERROR_KEY_DOES_NOT_EXIST:本地密钥错误。ERROR_INVALID_TASK_DATA:任务字段、类型、动作、公钥或域名不匹配。ERROR_NO_SLOT_AVAILABLE:任务队列或内存容量已满。ERROR_TASKID_INVALID:任务不存在、结果已过期或服务已重启。ERROR_BROWSER_UNAVAILABLE:Manager 不可达、指定配置没运行或 CDP 无法连接。ERROR_BROWSER_COMMAND:浏览器命令执行失败。ERROR_UPSTREAM_NETWORK:官方网页未能正常加载。ERROR_CAPTCHA_UNSOLVABLE:Google 脚本执行失败或未取得 token。ERROR_TASK_TIMEOUT:任务工作进程或浏览器操作超时。ERROR_BROWSER_CLEANUP:任务页关闭失败,请检查浏览器后再试。ERROR_BAD_REQUEST:请求格式不合法或有未支持字段。
业务错误沿用 HTTP 200 加 errorId=1。JSON、长度或 Content-Type 错误使用 HTTP 400;未知地址使用 HTTP 404。收到错误后停止轮询此任务。生成任务和轮询请求均不自动重试。
有效期、并发与运行边界
- 一次只运行一个任务;最多 8 个排队任务,总计最多保留 64 个任务。队列等待不消耗 token 有效期,但客户端应设置总等待时限。
- 成功结果从生成后保留约 90 秒,过期后查询返回 ERROR_TASKID_INVALID;失败结果保留 10 分钟。过期记录在后续请求时清理。
- Google 的 token 通常只有约两分钟验证窗口,且只能验证一次。本地 90 秒保留窗口不会延长 Google 有效期。
- 浏览器工作预算约 85 秒;单条 CDP 命令最多 20 秒,子进程最终最多等待 105 秒。每个任务创建自己的标签页,正常完成或失败后关闭;不会关闭整个用户浏览器。强制结束服务时请检查是否遗留任务页。
- 监听地址固定为 127.0.0.1,仅供本机调用。无 CORS,不提供公网访问、负载均衡、远程浏览器连接或代理轮换。
- 浏览器生成 token 与客户端提交业务请求的网络环境可能影响网石接受结果。当前不承诺特定评分、不同出口可用或每个账号必定成功。
- 本地服务使用已有配置,不额外启动浏览器,因此符合当前单浏览器测试方式。CloakBrowser 的授权与条款仍需遵守。
响应格式参考:YesCaptcha createTask、getTaskResult。本站的任务范围、排队、保留时间、错误码及运行限制以上述本地实现为准。Google token 验证规则见 官方文档。