createTask 创建任务
createTask 创建一个识别任务,在 task.type 里指定识别哪一种验证码。异步类型返回 taskId,之后用 getTaskResult 取结果;同步类型直接返回结果。任务创建成功时扣点,余额必须大于 10 点。
POST
https://api.yescaptcha.com/createTask国际节点POST
https://cn.yescaptcha.com/createTask国内节点| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
clientKey |
string | 是 | 账户密钥,在 yescaptcha.com 后台复制 |
task |
object | 是 | 任务对象,必须有 type;其他字段按任务类型填,见各任务类型页 |
softID |
integer | 否 | 开发者 ID。你开发的软件给别人用时带上它,可以得到分成,见 开发者分成 |
识别一张图片验证码(同步):
{ "clientKey": "YOUR_CLIENT_KEY", "task": { "type": "ImageToTextTaskOcrBase", "body": "BASE64_IMAGE" }}获取 reCAPTCHA v2 的 token(异步):
{ "clientKey": "YOUR_CLIENT_KEY", "task": { "type": "NoCaptchaTaskProxyless", "websiteURL": "https://www.google.com/recaptcha/api2/demo", "websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-" }}各任务类型的 task 字段见 任务类型与价格 下的各页。
异步类型:
{ "errorId": 0, "taskId": "61138bb6-19fb-11ec-a9c8-0242ac110006" }记下 taskId,5 秒后开始用 getTaskResult 查询。
同步类型:
{ "errorId": 0, "status": "ready", "taskId": "2376919c-1863-11ec-a012-94e6f7355a0b", "solution": { "text": "LMResm" }}失败:
{ "errorId": 1, "errorCode": "ERROR_TASK_NOT_SUPPORTED", "errorDescription": "任务类型不正确或不受支持" }服务端按这个顺序检查请求,遇到第一个问题就返回对应的错误码,不扣点:
- 请求体是合法的 JSON:
ERROR_REQUEST_FORMATS - 带了
clientKey:ERROR_REQUIRED_FIELDS clientKey存在:ERROR_KEY_DOES_NOT_EXIST- 没有被自动暂停:
ERROR_IP_BLOCKED_5MIN(见 并发限制与自动暂停) - 余额大于 10 点:
ERROR_ZERO_BALANCE - 带了
task:ERROR_TASK_ABSENT task.type存在:ERROR_TASK_NOT_SUPPORTED- 必填字段齐全:
ERROR_REQUIRED_FIELDS(errorDescription里写了缺哪个字段) - 图片类任务的图片合法:
ERROR_ZERO_CAPTCHA_FILESIZE、ERROR_IMAGE_TYPE_NOT_SUPPORTED等
创建任务并轮询结果(异步类型):
curl -s https://api.yescaptcha.com/createTask \ -H 'Content-Type: application/json' \ -d '{ "clientKey": "YOUR_CLIENT_KEY", "task": { "type": "NoCaptchaTaskProxyless", "websiteURL": "https://www.google.com/recaptcha/api2/demo", "websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-" }}'
# 返回 {"errorId":0,"taskId":"..."},然后每 5 秒查询一次结果:curl -s https://api.yescaptcha.com/getTaskResult \ -H 'Content-Type: application/json' \ -d '{"clientKey": "YOUR_CLIENT_KEY", "taskId": "TASK_ID"}'import osimport time
import requests
API = "https://api.yescaptcha.com"CLIENT_KEY = os.environ["YESCAPTCHA_CLIENT_KEY"] # 从环境变量读取 clientKey
def call(method, payload): r = requests.post(f"{API}/{method}", json={"clientKey": CLIENT_KEY, **payload}, timeout=30) data = r.json() if data.get("errorId"): raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}") return data
def solve(task): task_id = call("createTask", {"task": task})["taskId"] for _ in range(36): # 每 5 秒查询一次,最多等约 3 分钟 time.sleep(5) result = call("getTaskResult", {"taskId": task_id}) if result.get("status") == "ready": return result["solution"] raise TimeoutError(task_id)
solution = solve({ "type": "NoCaptchaTaskProxyless", "websiteURL": "https://www.google.com/recaptcha/api2/demo", "websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",})print(solution["gRecaptchaResponse"])const API = 'https://api.yescaptcha.com';const CLIENT_KEY = process.env.YESCAPTCHA_CLIENT_KEY; // 从环境变量读取 clientKey
async function call(method, payload) { const res = await fetch(`${API}/${method}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ clientKey: CLIENT_KEY, ...payload }), }); const data = await res.json(); if (data.errorId) throw new Error(`${data.errorCode}: ${data.errorDescription}`); return data;}
async function solve(task) { const { taskId } = await call('createTask', { task }); for (let i = 0; i < 36; i++) { // 每 5 秒查询一次,最多等约 3 分钟 await new Promise((r) => setTimeout(r, 5000)); const result = await call('getTaskResult', { taskId }); if (result.status === 'ready') return result.solution; } throw new Error(`timeout: ${taskId}`);}
const solution = await solve({ type: "NoCaptchaTaskProxyless", websiteURL: "https://www.google.com/recaptcha/api2/demo", websiteKey: "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",});console.log(solution.gRecaptchaResponse);