代理 2026 年 10 月 28 日

YesCaptcha 验证码识别平台:任务类型、真实成本和接入步骤

YesCaptcha 验证码识别平台:任务类型、真实成本和接入步骤 YesCaptcha 是一个按点数扣费的验证码识别服务。1 元换 1000 点,识别失败和超时自动退点,充值没有月费也没有套餐绑定。写爬虫、跑自动注册脚本、搭号池的人,终点基本都会碰到它。 这篇不讲"验证码是什么

YesCaptcha 验证码识别平台:任务类型、真实成本和接入步骤

YesCaptcha 是一个按点数扣费的验证码识别服务。1 元换 1000 点,识别失败和超时自动退点,充值没有月费也没有套餐绑定。写爬虫、跑自动注册脚本、搭号池的人,终点基本都会碰到它。
这篇不讲”验证码是什么”这种常识。重点说三件事:你遇到的验证码该选哪个任务类型,一次识别到底花多少钱,代码怎么接才不会一上手就卡在轮询上。

先确认你要解决的是不是验证码问题

很多人第一次找打码平台,其实问题不在验证码。
页面直接 403、返回 Cloudflare 的拦截页,那是 IP 或 User-Agent 的问题,买多少点数都没用。页面能打开但抓不到数据,那是选择器和渲染时机的问题。只有在页面上真的看到了勾选框、“我是人类”按钮、九宫格图片,或者那个右下角自动打勾的小方框,才轮到打码平台出场。
这里有个高频误判。整页被 Cloudflare 拦下、显示”请稍候…正在检查您的浏览器”,那是 5 秒盾,属于另一个任务类型,返回的是 Cookie 而不是 token。把 5 秒盾的参数填进 Turnstile 的任务里,websiteKey 抄得再准也过不了。

按页面现象选任务类型

下表按”你在页面上看到什么”组织,比按产品名记更实用。
页面上看到什么实际类型任务类型单价
”我不是机器人”复选框,点开是九宫格reCAPTCHA v2NoCaptchaTaskProxyless15 点
没有复选框,点提交才弹图片reCAPTCHA v2 隐形版同上,加 "isInvisible": true15 点
页面加载 recaptcha/enterprise.jsreCAPTCHA v2 企业版RecaptchaV2EnterpriseTaskProxyless20 点
无感验证,不弹任何东西,只要分数reCAPTCHA v3RecaptchaV3TaskProxyless20 点
九宫格加”我是人类”标题hCaptchaHCaptchaTaskProxyless30 点
右下角小框”确认您是真人”Cloudflare TurnstileTurnstileTaskProxyless25 点
整页”请稍候…""正在检查您的浏览器”Cloudflare 5 秒盾CloudFlareTaskS2 / CloudFlareTaskS325 / 20 点
扭曲的英文字母数字图片验证码ImageToTextTaskMuggle2 点
只想让程序告诉你该点哪几张图图像识别ReCaptchaV2Classification / HCaptchaClassification6 / 8 点
几个选择上的判断。
名字里带 Proxyless 的,是用 YesCaptcha 自己的网络去加载验证码,你不需要准备代理。名字里没有的,比如 NoCaptchaTask、HCaptchaTask、TurnstileTask、CloudFlareTaskS2,全部要你自己传 proxyType、proxyAddress、proxyPort。
什么时候必须用自己的代理?两种情况。目标网站对访问来源 IP 敏感,换了 IP 之后 token 直接作废。或者你拿到 token 之后,要在同一个 IP 上继续完成后续操作。这两个场景用 Proxyless 版本,成功率会明显掉。
带 M1 后缀的是另一条线路,参数一样,价格多数比普通版贵 5 点,hCaptcha 是例外,两个版本都是 30 点。正式跑之前同一套参数两个都试一遍,谁过率高用谁,或者干脆做成互备。reCAPTCHA v3 还有 M1S7、M1S9 两个变体,强制返回 0.7 和 0.9 的分数,30 点和 35 点一次,网站分数门槛卡得死的时候才有意义。

YesCaptcha 一次识别多少钱

计费规则本身不复杂,但细节决定了你的实际成本。
异步类型(返回 token 的那几类)在任务创建成功时扣点,之后如果识别失败报 ERROR_CAPTCHA_UNSOLVABLE,或者超过 110 秒左右超时报 ERROR_TASK_TIMEOUT,点数自动退回。同步类型(图像识别、图片英数字)是返回结果时才扣。参数错了、余额不够、超过并发上限这类在 createTask 就报错的请求,一分不扣。
也就是说,失败不花钱,但失败会烧时间。批量跑的时候真正拖慢你的是重试和排队,不是点数。
按 1 元 = 1000 点折算:
任务点数折合每千次
图片英数字2约 2 元
reCAPTCHA v2 token15约 15 元
Turnstile token25约 25 元
hCaptcha token30约 30 元
一个号池项目注册 200 个账号,每次注册吃一次 Turnstile,成本是 5 元左右的点数。这个数字通常远小于代理、邮箱域名和你能省下的人工时间。真正该算的是成功率:如果通过率只有五成,你会花掉两倍的任务量,还要赔上重试的时间。
余额有个硬门槛,必须大于 10 点才能创建任务,不够直接返回 ERROR_ZERO_BALANCE。
充值支持微信、支付宝、PayPal、加密货币(Cryptomus,走 BTC / ETH / USDT)、对公转账。累计充值到门槛自动升 VIP,之后每次充值按等级比例额外赠点,最高 VIP 10,累计 48000 元,赠送 40%。
等级累计充值每次充值赠送
VIP 110 元2%
VIP 2100 元5%
VIP 3500 元8%
VIP 41000 元10%
VIP 52000 元15%
VIP 63000 元20%
VIP 76000 元25%
VIP 812000 元30%
VIP 924000 元35%
VIP 1048000 元40%
累计制,不要求一次充完。第一次直接充 1000 元,这次就按 VIP 4 的 10% 送。用邀请链接注册的账号会直接拿到一个初始 VIP 等级,规则是邀请人等级减 1,最低 VIP 1、最高 VIP 6,具体以后台显示为准。
第一次不要充太多。先把链路跑通,确认你的场景通过率能接受,再决定充多少。

接入:先查余额,再测一张图

API 只有两个节点,接口和参数完全一样:
  • 国际节点 https://api.yescaptcha.com
  • 国内节点 https://cn.yescaptcha.com
服务器在中国大陆的走 cn,其他地区走国际节点。所有方法都是 HTTPS POST JSON,clientKey 放在请求体里鉴权。有一个坑必须记住:在哪个节点创建的任务,就只能到哪个节点查结果,混用会一直查不到。
先确认密钥能用。getBalance 不扣点:
curl -s https://api.yescaptcha.com/getBalance \
  -H 'Content-Type: application/json' \
  -d '{"clientKey": "YOUR_CLIENT_KEY"}'
返回 {"errorId": 0, "balance": 12345, ...} 就通了。返回 ERROR_KEY_DOES_NOT_EXIST 说明密钥复制不全。
下面是一个能直接跑的完整脚本。它处理了同步和异步两种返回方式、超时、失败重试和并发限流,任务类型和参数从命令行传。
# Python 3.9+ | 依赖: pip install requests
# 运行: YESCAPTCHA_CLIENT_KEY=你的key python solve.py turnstile https://example.com/login 0x4AAAAAAA_SITE_KEY

import os
import sys
import time

import requests

CLIENT_KEY = os.environ["YESCAPTCHA_CLIENT_KEY"]
REGION = os.environ.get("YESCAPTCHA_REGION", "intl")

ENDPOINTS = {
    "intl": "https://api.yescaptcha.com",
    "cn": "https://cn.yescaptcha.com",
}
BASE = ENDPOINTS[REGION]

# 任务类型映射,用哪个填哪个
TASK_TYPES = {
    "turnstile": "TurnstileTaskProxyless",
    "recaptcha_v2": "NoCaptchaTaskProxyless",
    "hcaptcha": "HCaptchaTaskProxyless",
}


def call(method, payload):
    body = {"clientKey": CLIENT_KEY}
    body.update(payload)
    resp = requests.post(f"{BASE}/{method}", json=body, timeout=30)
    resp.raise_for_status()
    return resp.json()


def get_balance():
    return call("getBalance", {}).get("balance")


def solve(task_type, website_url, website_key, timeout=180, interval=5):
    created = call("createTask", {
        "task": {
            "type": task_type,
            "websiteURL": website_url,
            "websiteKey": website_key,
        }
    })

    if created.get("errorId") != 0:
        raise RuntimeError(
            f"createTask 失败: {created.get('errorCode')} {created.get('errorDescription')}"
        )

    # 同步类型(图片识别、图像分类)在这里就直接有结果了
    if "solution" in created:
        return created["solution"]

    task_id = created["taskId"]
    deadline = time.time() + timeout

    while time.time() < deadline:
        time.sleep(interval)
        result = call("getTaskResult", {"taskId": task_id})

        if result.get("errorId") != 0:
            raise RuntimeError(
                f"getTaskResult 失败: {result.get('errorCode')} {result.get('errorDescription')}"
            )

        status = result.get("status")
        if status == "ready":
            return result["solution"]
        # status == "processing" 时继续等,不要改参数重发

    # 超时:任务会由平台判定并退点,本地直接放弃这一次
    raise TimeoutError(f"taskId {task_id} 在 {timeout} 秒内没有返回结果")


def solve_with_fallback(task_type, website_url, website_key, fallbacks=()):
    """主类型失败时按顺序换备用线路,每次都重新建任务。"""
    candidates = [task_type, *fallbacks]
    last_error = None

    for candidate in candidates:
        try:
            return candidate, solve(candidate, website_url, website_key)
        except (RuntimeError, TimeoutError) as exc:
            # 并发超限不要立刻重试,先让已发出的请求回来
            if "ERROR_THREADS_MAXIMUM" in str(exc):
                time.sleep(2)
            last_error = exc

    raise RuntimeError(f"全部任务类型均失败,最后一个错误: {last_error}")


if __name__ == "__main__":
    if len(sys.argv) != 4 or sys.argv[1] not in TASK_TYPES:
        print("用法: solve.py <turnstile|recaptcha_v2|hcaptcha> <页面URL> <sitekey>")
        sys.exit(1)

    kind, url, sitekey = sys.argv[1], sys.argv[2], sys.argv[3]
    task_type = TASK_TYPES[kind]

    print("余额:", get_balance(), "点")

    fallbacks = {
        "turnstile": ["TurnstileTaskProxylessM1"],
        "recaptcha_v2": ["RecaptchaV2TaskProxyless"],
        "hcaptcha": ["HCaptchaTaskProxylessM1"],
    }[kind]

    used, solution = solve_with_fallback(task_type, url, sitekey, fallbacks)
    print("任务类型:", used)
    print("token:", solution.get("token"))
    # 返回里带了 userAgent 时,提交 token 必须用它,否则大概率被判定为无效
    print("userAgent:", solution.get("userAgent"))
跑 Turnstile 时,websiteKey 就是页面里 turnstile.render 那个 sitekey,一般以 0x 开头。绝大多数情况传 websiteURL 和 websiteKey 就够了。如果确定这两个都对还是过不了,再看网页调用时有没有传 action 和 cData,有的话原样填进 pageAction 和 data。这两个字段是最后手段,不是默认要填。

不会写代码的那条路

YesCaptcha 还有一个浏览器插件,叫 YesCaptcha 人机助手,Chrome 和 Firefox 都有,插件本身免费,识别时按用到的 API 从同一个账户余额扣点。
装上之后在插件图标里填 clientKey,遇到 reCAPTCHA v2、hCaptcha、FunCaptcha、AWS WAF 的图片题会自动识别并点。普通字符验证码不带自动识别,需要在图片上右键”标记为验证码”、在输入框上右键”输入验证码”,插件识别后帮你填进去。
适合的人群很明确:用比特浏览器、AdsPower 这类指纹浏览器做多账号操作,或者跑 Kiwi Browser 的手机场景。不适合的也很明确:插件靠 DOM 定位,网站改版就失效,不是所有站都能过,批量无人值守也不该指望它。

几个会浪费钱和时间的地方

两个节点混用。 在 api.yescaptcha.com 建的任务,去 cn.yescaptcha.com 查 getTaskResult,永远查不到结果,一直等到超时。全局统一一个 BASE,别在代码里散着写域名。
token 拿到不当场用。 token 是一次性的。reCAPTCHA 的有效期大约 120 秒,实操上拿到之后 60 秒内就得提交。中途去跑别的逻辑,token 就废了,白扣点。
并发超限后死循环重试。 平台按账号、按任务类型限制同时处理中的任务数,超了返回 ERROR_THREADS_MAXIMUM,响应里带 limit 字段告诉你当前上限。这类请求不扣点,也不计入自动暂停,但立即循环重发只会继续报错。正确做法是控制”同时在等结果的请求数”,用信号量或固定大小线程池,收到错误后等已有请求回来再发。
错误刷得太密。 同一个 clientKey 一分钟内出现 100 次错误,账号会被暂停创建任务 5 分钟,返回 ERROR_IP_BLOCKED_5MIN。参数类错误(ERROR_TASK_ABSENT、ERROR_TASK_NOT_SUPPORTED、ERROR_REQUEST_FORMATS)都算在内。上线前先单线程跑通,别拿生产并发去试错。
拿到 token 却被目标站拒绝。 这种情况按成功计费,因为平台无法知道网站的判定结果。原因通常在环境不在识别:IP 和注册时不一致、User-Agent 没对上、浏览器指纹太假、行为轨迹不像人。可以换成自带代理的任务类型并在提交时走同一个代理,或者干脆改用图像识别,让程序告诉你在真浏览器里点哪几张图。
图像识别点错了。 只有 5 类支持上报返点:FunCaptchaClassification、HCaptchaClassification、ReCaptchaV2Classification、AwsClassification、bCaptchaClassification。要在任务创建后 1 小时内调 report,同一个任务只算一次,大约 24 小时后结算。结算时会和同期、同题的其他用户比较,上报失败率明显高于水平的,按同期失败率返还,不是报了就全退。返回 token 的类型上报不返点。

它在整条链路里的位置

打码只解决”过验证码”这一环。邮箱能不能收到验证码、代理 IP 干不干净、账号注册后能活多久,这些都不在它的责任范围内。把打码当成万能药的项目,最后都栽在后面几环上。
站内已经把两条常见链路写完了,需要的话直接看:
这两篇里的打码环节都是同一个账户,一个 clientKey 可以在多个程序、多个浏览器里同时用,共享余额和并发额度。

常见问题

识别失败扣钱吗

不扣。识别失败(ERROR_CAPTCHA_UNSOLVABLE)和超时(ERROR_TASK_TIMEOUT)的任务自动退点,创建任务时就报错的请求也不扣。只有拿到了 token 但目标网站不接受的情况按成功计费。

是人工打码还是机器识别

机器识别,基于机器学习模型。所以速度是秒级到几十秒级,不是等人工接单。

识别一次要多久

异步任务通常几秒到几十秒,最长约 110 秒,少数类型会到 180 到 220 秒。超时自动退点。图像识别和图片英数字是同步的,一次请求直接返回。

国内服务器该用哪个节点

cn.yescaptcha.com。国际节点从大陆访问会有延迟和掉线,成功率和速度都差一截。

用打码平台会导致目标网站封号吗

平台只返回识别结果,不接触你在目标网站上的账号。封不封号由目标网站自己的规则判定,跟用不用打码没有直接因果。但自动化注册、批量操作本身在多数平台的服务条款里是不允许的,这部分风险得自己评估。

怎么开始

想先确认服务能用,最省的做法是注册后充最小的额度,用 getBalance 确认到账,再跑一次 ImageToTextTaskMuggle 识别一张图。这个类型 2 点一次、同步返回、不依赖任何第三方网站,是验证账户和代码是否正常的成本最低的测试。
确认链路通了,再换成你实际要处理的验证码类型,单线程跑十次,记下成功率和平均耗时。通过率低于七成的话,先别扩量,去查 IP 和参数,不要用充值和并发去掩盖环境问题。
本文基于 2026-10-28 的 YesCaptcha 官方文档、后台公开价格页和任务类型页整理。任务类型、价格、赠送比例、并发额度和节点地址都可能调整,充值前请以后台和官方文档的实时页面为准。