文档中心 / 易盾

易盾对接示例

分组易盾 入口返回首页

易盾对接示例支持直接在线查看、复制和下载源码,无需再下载压缩包。

对接示例

按语言环境展开查看代码,支持直接复制和下载源码。

Python

共 2 个示例,按接口动作拆分。

该语言注意事项

跟随当前语言展示
  • ============================================================== 易盾识别 对接示例 — Python版 使用说明 ============================================================== 【一、环境准备】 1. 安装 Python - 下载地址:https://www.python.org/downloads/ - 建议版本:Python 3.6 或以上(推荐 3.8+) - 安装时务必勾选 "Add Python to PATH"(添加到系统环境变量) - 安装完成后,打开命令行(cmd 或 PowerShell),输入以下命令验证: python --version 如果显示类似 "Python 3.x.x" 则安装成功 2. 安装依赖库 requests - 打开命令行,执行: pip install requests - 如果 pip 速度慢,可以使用国内镜像源: pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple - 安装完成后,可以用以下命令确认: pip show requests 看到版本号即表示安装成功 -------------------------------------------------------------- 【二、参数配置】 本Demo包含两个独立脚本: - query_points.py — 查询账户剩余点数 - recognize_yidun.py — 提交易盾验证码识别 请根据需要打开对应的脚本文件,找到顶部的"配置区域",修改以下参数: 1. APPKEY(必填) - 你的用户密钥,登录平台后在个人中心获取 - 示例:APPKEY = "abc123def456" 2. YIDUN_ID(必填) - 易盾验证码的 id 参数值 - 需要从目标网站通过浏览器开发者工具(F12)抓包获取 - 在网络请求中搜索与易盾相关的请求,找到 id 参数 - 示例:YIDUN_ID = "84e18cc9ea6a49c7845847d7518b8ddf" 3. YIDUN_REFERER(必填) - 易盾验证码请求中的 referer 值 - 同样需要从浏览器开发者工具(F12)抓包获取 - 注意:这个值不一定是你当前访问的页面URL,而是验证码请求头中的referer - 示例:YIDUN_REFERER = "https://example.com/captcha" 4. ITEM_ID(一般不需要改) - 易盾类型固定填写 500 - 特殊类型请联系客服确认 5. PROXY(可选) - 如果你需要通过代理IP访问,填写代理地址 - 支持的格式: * http://IP:端口 (普通HTTP代理,若需白名单支持请联系客服) * http://账号:密码@proxy.com:8080 (带认证的HTTP代理) * socks5://127.0.0.1:9888 (SOCKS5代理) - 不需要代理则留空:PROXY = "" 6. DEVKEY(可选) - 开发者密钥,如果你有的话填写,没有则留空 -------------------------------------------------------------- 【三、运行方式】 1. 打开命令行(cmd 或 PowerShell) 2. 切换到脚本所在目录: cd 易盾\python 查询点数: 3. 执行:python query_points.py - 仅查询账户剩余点数,确认APPKEY是否正确 易盾识别: 4. 执行:python recognize_yidun.py - 提交易盾验证码识别任务,等待服务器返回结果 5. 识别结果会在控制台中显示 -------------------------------------------------------------- 【四、常见问题】 Q1:运行时提示 "ModuleNotFoundError: No module named 'requests'" A1:说明 requests 库未安装,请执行 pip install requests Q2:运行时提示 "请先在脚本顶部的配置区域填写你的 APPKEY" A2:你还没有修改 APPKEY,请用你自己的密钥替换 "你的appkey" Q3:查询点数成功但识别失败 A3:请检查 YIDUN_ID 和 YIDUN_REFERER 是否正确,这两个值需要实时抓包获取 Q4:返回的 validate 无法通过目标网站验证 A4:尝试对返回的 validate 值进行 urlencode 编码后再使用 Q5:识别耗时较长(超过10秒) A5:这是正常现象,易盾验证码识别需要服务器端处理,耐心等待即可 Q6:提示网络请求出错 A6:请检查网络连接是否正常,或者尝试使用代理IP -------------------------------------------------------------- 【五、重要注意事项】 1. 查询点数接口有频率限制:不得超过1秒1次,否则会被拉黑24小时 2. 识别接口的超时时间设置为60秒,请耐心等待结果 3. 不要将你的 APPKEY 泄露给他人 4. 请确保你的账户有足够的点数余额 ==============================================================

查询点数

query_points.py

下载源码
query_points.py

Python

# -*- coding: utf-8 -*-
"""
=============================================================
  查询账户点数 Demo (Python版)

  功能说明:
  查询账户剩余点数(余额)

  使用方法:
  1. 安装依赖:pip install requests
  2. 将下方的 APPKEY 替换为你自己的用户密钥
  3. 运行脚本:python query_points.py
=============================================================
"""

import requests
import json
import sys

# ======================== 配置区域(请替换为你自己的参数)========================
# 用户密钥,登录平台后获取
APPKEY = "你的appkey"
# ===============================================================================

# API基础地址
API_BASE = "http://api.ttocr.com/api"


def query_points():
    """
    查询账户剩余点数
    接口地址:GET http://api.ttocr.com/api/points
    注意:查询点数不得超过1秒1次,否则会被拉黑24小时
    """
    print("=" * 50)
    print("[查询点数] 正在查询账户剩余点数...")
    print("=" * 50)
    url = f"{API_BASE}/points"
    params = {"appkey": APPKEY}
    try:
        response = requests.get(url, params=params, timeout=10)
        result = response.json()
        if result.get("status") == 1:
            print(f"[成功] 查询成功!当前可用点数:{result.get('points')}")
        else:
            print(f"[失败] 查询失败,错误信息:{result.get('msg')}")
            print(f"[提示] 错误状态码:{result.get('status')},请参考错误代码表排查")
        print(f"[完整响应] {json.dumps(result, ensure_ascii=False, indent=2)}")
        return result
    except requests.exceptions.RequestException as e:
        print(f"[异常] 网络请求出错:{e}")
        return None


if __name__ == "__main__":
    print("*" * 60)
    print("  查询账户点数 Demo (Python版)")
    print("*" * 60)
    if APPKEY == "你的appkey":
        print("\n[错误] 请先在脚本顶部的配置区域填写你的 APPKEY")
        sys.exit(1)
    query_points()
    print("\n" + "=" * 50)
    print("[完成] 查询执行完毕")
    print("=" * 50)

提交识别

recognize_yidun.py

下载源码
recognize_yidun.py

Python

# -*- coding: utf-8 -*-
"""
=============================================================
  易盾识别 Demo (Python版)

  功能说明:
  提交易盾验证码识别任务

  使用方法:
  1. 安装依赖:pip install requests
  2. 将下方的 APPKEY 替换为你自己的用户密钥
  3. 将 YIDUN_ID 替换为你获取到的易盾验证码 id 参数
  4. 将 YIDUN_REFERER 替换为你获取到的 referer 值
  5. 运行脚本:python recognize_yidun.py
=============================================================
"""

import requests
import json
import sys

# ======================== 配置区域(请替换为你自己的参数)========================
# 用户密钥,登录平台后获取
APPKEY = "你的appkey"

# 易盾验证码的 id 参数值(从目标网站抓包获取)
YIDUN_ID = "你获取到的易盾id"

# 易盾验证码的 referer 值(从目标网站抓包获取,注意不是当前页面的URL)
YIDUN_REFERER = "你获取到的referer地址"

# 项目类型,易盾固定填写 500(特殊类型请联系客服)
ITEM_ID = 500

# 可选参数:代理IP(格式示例:http://IP:端口,若需白名单支持请联系客服。http://账号:密码@proxy.com:8080 或 socks5://127.0.0.1:9888)
PROXY = ""

# 可选参数:开发者密钥(如果有的话填写)
DEVKEY = ""
# ===============================================================================

# API基础地址
API_BASE = "http://api.ttocr.com/api"


def recognize_yidun():
    """
    提交易盾验证码识别任务
    接口地址:POST http://api.ttocr.com/api/recognize2
    必填参数:appkey, id, referer, itemid(固定500)
    可选参数:proxy, devkey, ua, type
    重要提示:如果结果无法通过验证,请将返回的validate进行urlencode编码后再尝试
    """
    print("=" * 50)
    print("[易盾识别] 正在提交易盾识别任务...")
    print("=" * 50)
    url = f"{API_BASE}/recognize2"
    post_data = {
        "appkey": APPKEY,
        "id": YIDUN_ID,
        "referer": YIDUN_REFERER,
        "itemid": ITEM_ID,
    }
    if PROXY:
        post_data["proxy"] = PROXY
    if DEVKEY:
        post_data["devkey"] = DEVKEY
    print(f"[请求参数] id={YIDUN_ID}")
    print(f"[请求参数] referer={YIDUN_REFERER}")
    print(f"[请求参数] itemid={ITEM_ID}")
    try:
        response = requests.post(url, data=post_data, timeout=60)
        result = response.json()
        if result.get("status") == 1:
            print(f"[成功] 识别成功!耗时:{result.get('time')}ms")
            print(f"[识别结果] {result.get('data')}")
        else:
            print(f"[失败] 识别失败,错误信息:{result.get('msg')}")
            print(f"[提示] 错误状态码:{result.get('status')},请参考错误代码表排查")
        print(f"\n[完整响应] {json.dumps(result, ensure_ascii=False, indent=2)}")
        return result
    except requests.exceptions.RequestException as e:
        print(f"[异常] 网络请求出错:{e}")
        return None


if __name__ == "__main__":
    print("*" * 60)
    print("  易盾识别 Demo (Python版)")
    print("*" * 60)
    if APPKEY == "你的appkey":
        print("\n[错误] 请先在脚本顶部的配置区域填写你的 APPKEY")
        sys.exit(1)
    if YIDUN_ID == "你获取到的易盾id":
        print("\n[错误] 请先在脚本顶部的配置区域填写 YIDUN_ID 和 YIDUN_REFERER")
        sys.exit(1)
    recognize_yidun()
    print("\n" + "=" * 50)
    print("[完成] 识别执行完毕")
    print("=" * 50)

Go

共 2 个示例,按接口动作拆分。

该语言注意事项

跟随当前语言展示
  • ============================================================== 易盾识别 对接示例 — Go版 使用说明 ============================================================== 【一、环境准备】 1. 安装 Go - 下载地址:https://go.dev/dl/ - 建议版本:Go 1.18 或以上 - 安装完成后,打开命令行执行: go version 能看到版本号即表示安装成功 2. 无需安装第三方依赖 - 本 Demo 仅使用 Go 标准库 - 直接执行 go run 即可 -------------------------------------------------------------- 【二、参数配置】 本 Demo 包含两个独立脚本: - query_points.go — 查询账户剩余点数 - recognize_yidun.go — 提交易盾验证码识别 需要重点填写: 1. APPKEY - 登录平台后在个人中心获取 2. YIDUNID - 易盾验证码的 id 参数值 - 需要从目标网站抓包获取 3. YIDUNReferer - 易盾验证码请求中的 referer 值 - 注意不是当前页面地址,需以抓包结果为准 4. ITEMID - 易盾固定填写 500 5. PROXY / DEVKEY - 可选参数,不需要时保持为空即可 -------------------------------------------------------------- 【三、运行方式】 1. 进入当前目录: cd 易盾(易识别)/go 2. 查询点数: go run query_points.go 3. 易盾识别: go run recognize_yidun.go -------------------------------------------------------------- 【四、常见问题】 Q1:查询点数成功但识别失败 A1:优先检查 YIDUNID 和 YIDUNReferer 是否实时、准确 Q2:返回的 validate 无法通过目标网站校验 A2:请将返回的 validate 进行 urlencode 编码后再尝试 Q3:提示网络请求出错 A3:请检查本机网络、代理配置或目标参数是否过期 -------------------------------------------------------------- 【五、重要注意事项】 1. 查询点数接口不得超过 1 秒 1 次,否则会被拉黑 24 小时 2. 识别接口超时时间为 60 秒,请耐心等待结果 3. 不要将 APPKEY 泄露给他人 4. 请确保账户点数余额充足 ==============================================================

查询点数

query_points.go

下载源码
query_points.go

Go

package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"net/url"
	"os"
	"time"
)

/*
=============================================================
  查询账户点数 Demo (Go版)

  功能说明:
  查询账户剩余点数(余额)

  使用方法:
  1. 确保已安装 Go 1.18 或更高版本
  2. 将下方的 APPKEY 替换为你自己的用户密钥
  3. 运行脚本:go run query_points.go
  4. 本 Demo 仅使用 Go 标准库,无需安装第三方依赖
=============================================================
*/

const (
	APPKEY  = "你的appkey"
	APIBase = "http://api.ttocr.com/api"
)

func queryPoints() (map[string]interface{}, error) {
	client := &http.Client{Timeout: 10 * time.Second}
	endpoint := APIBase + "/points?appkey=" + url.QueryEscape(APPKEY)

	resp, err := client.Get(endpoint)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()

	var result map[string]interface{}
	if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
		return nil, err
	}

	pretty, _ := json.MarshalIndent(result, "", "  ")
	if status, ok := result["status"].(float64); ok && status == 1 {
		fmt.Printf("[成功] 查询成功!当前可用点数:%v\n", result["points"])
	} else {
		fmt.Printf("[失败] 查询失败,错误信息:%v\n", result["msg"])
		fmt.Printf("[提示] 错误状态码:%v,请参考错误代码表排查\n", result["status"])
	}
	fmt.Printf("[完整响应] %s\n", string(pretty))

	return result, nil
}

func main() {
	fmt.Println("************************************************************")
	fmt.Println("  查询账户点数 Demo (Go版)")
	fmt.Println("************************************************************")

	if APPKEY == "你的appkey" {
		fmt.Println("\n[错误] 请先在代码顶部的配置区域填写你的 APPKEY")
		os.Exit(1)
	}

	fmt.Println("==================================================")
	fmt.Println("[查询点数] 正在查询账户剩余点数...")
	fmt.Println("==================================================")

	if _, err := queryPoints(); err != nil {
		fmt.Printf("[异常] 网络请求出错:%v\n", err)
		os.Exit(1)
	}

	fmt.Println("\n==================================================")
	fmt.Println("[完成] 查询执行完毕")
	fmt.Println("==================================================")
}

提交识别

recognize_yidun.go

下载源码
recognize_yidun.go

Go

package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"net/url"
	"os"
	"time"
)

/*
=============================================================
  易盾识别 Demo (Go版)

  功能说明:
  提交易盾验证码识别任务

  使用方法:
  1. 确保已安装 Go 1.18 或更高版本
  2. 将下方的 APPKEY 替换为你自己的用户密钥
  3. 将 YIDUN_ID 替换为你获取到的易盾 id 参数
  4. 将 YIDUN_REFERER 替换为你获取到的 referer 值
  5. 运行脚本:go run recognize_yidun.go
=============================================================
*/

const (
	APPKEY        = "你的appkey"
	YIDUNID       = "你获取到的易盾id"
	YIDUNReferer  = "你获取到的referer地址"
	ITEMID        = "500"
	PROXY         = ""
	DEVKEY        = ""
	APIBase       = "http://api.ttocr.com/api"
	RequestTimout = 60 * time.Second
)

func postForm(endpoint string, values url.Values, timeout time.Duration) (map[string]interface{}, error) {
	client := &http.Client{Timeout: timeout}
	resp, err := client.PostForm(endpoint, values)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()

	var result map[string]interface{}
	if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
		return nil, err
	}

	return result, nil
}

func main() {
	fmt.Println("************************************************************")
	fmt.Println("  易盾识别 Demo (Go版)")
	fmt.Println("************************************************************")

	if APPKEY == "你的appkey" {
		fmt.Println("\n[错误] 请先在代码顶部的配置区域填写你的 APPKEY")
		os.Exit(1)
	}
	if YIDUNID == "你获取到的易盾id" {
		fmt.Println("\n[错误] 请先在代码顶部的配置区域填写 YIDUNID 和 YIDUNReferer")
		os.Exit(1)
	}

	fmt.Println("==================================================")
	fmt.Println("[易盾识别] 正在提交易盾识别任务...")
	fmt.Println("==================================================")

	values := url.Values{}
	values.Set("appkey", APPKEY)
	values.Set("id", YIDUNID)
	values.Set("referer", YIDUNReferer)
	values.Set("itemid", ITEMID)
	if PROXY != "" {
		values.Set("proxy", PROXY)
	}
	if DEVKEY != "" {
		values.Set("devkey", DEVKEY)
	}

	fmt.Printf("[请求参数] id=%s\n", YIDUNID)
	fmt.Printf("[请求参数] referer=%s\n", YIDUNReferer)
	fmt.Printf("[请求参数] itemid=%s\n", ITEMID)

	result, err := postForm(APIBase+"/recognize2", values, RequestTimout)
	if err != nil {
		fmt.Printf("[异常] 网络请求出错:%v\n", err)
		os.Exit(1)
	}

	pretty, _ := json.MarshalIndent(result, "", "  ")
	if status, ok := result["status"].(float64); ok && status == 1 {
		fmt.Printf("[成功] 识别成功!耗时:%vms\n", result["time"])
		fmt.Printf("[识别结果] %v\n", result["data"])
	} else {
		fmt.Printf("[失败] 识别失败,错误信息:%v\n", result["msg"])
		fmt.Printf("[提示] 错误状态码:%v,请参考错误代码表排查\n", result["status"])
		fmt.Println("[提示] 如果结果无法通过验证,请将返回的 validate 进行 urlencode 编码后再尝试。")
	}
	fmt.Printf("\n[完整响应] %s\n", string(pretty))

	fmt.Println("\n==================================================")
	fmt.Println("[完成] 识别执行完毕")
	fmt.Println("==================================================")
}

易语言

共 2 个示例,按接口动作拆分。

该语言注意事项

跟随当前语言展示
  • ============================================================== 易盾识别 对接示例 — 易语言版 使用说明 ============================================================== 【一、先说清楚这套源码依赖什么】 1. 需要导入:精易模块 2. 本示例实际用到的命令 / 类主要是: - 网页_访问_对象 - 类_POST数据类 - 类_json - 编码_URL编码 - 编码_Utf8到Ansi 3. 这次没有再额外依赖 `spec` 支持库 -------------------------------------------------------------- 【二、这套写法为什么和上一版不一样】 1. 这次按精易论坛常见示例和“精易网页调试助手生成”风格重写 2. `功能_查询点数 / 功能_易盾识别` 这些是示例里自己定义的子程序 3. 它们不是系统内置命令 4. 真正依赖的内置 / 模块命令已经在上面单独列出 -------------------------------------------------------------- 【三、源码怎么用】 1. `QueryPoints.e` - 查询账户剩余点数 2. `RecognizeYidun.e` - 提交易盾识别 - 必填: - APPKEY - YIDUNID - YIDUNReferer - ITEMID 固定 500 -------------------------------------------------------------- 【四、关于输出结果】 1. 示例默认用 `输出调试文本` 看返回 2. 适合直接在易语言 IDE 调试时观察接口响应 3. 如果你要做成正式窗口程序: - 可以把返回文本写到编辑框 - 或者写到日志文件 - 或者自己再封装成按钮点击事件 -------------------------------------------------------------- 【五、调用注意事项】 1. 查询点数接口不得超过 1 秒 1 次,否则会被拉黑 24 小时 2. 易盾识别固定走 `/api/recognize2` 3. `itemid` 固定为 `500` 4. `referer` 必须按抓包实际值填写,不能随便拿页面地址代替 5. 如果返回的 `validate` 提交后仍无法通过,请再对它做一次 urlencode ==============================================================

查询点数

QueryPoints.e

下载源码
QueryPoints.e

易语言

.版本 2

.子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行
.局部变量 APPKEY, 文本型
.局部变量 返回文本, 文本型
.局部变量 json, 类_json

' =============================================================
'   查询账户点数 Demo (易语言版)
'
'   说明:
'   1. 需要先导入精易模块
'   2. 本示例按精易论坛常见的“网页调试助手生成”写法整理
'   3. 结果默认输出到调试输出窗口,方便直接看接口返回
' =============================================================

APPKEY = "你的appkey"

.如果真 (APPKEY = "你的appkey")
    输出调试文本 ("[错误] 请先把 APPKEY 改成你自己的密钥")
    返回 (0)
.如果真结束

返回文本 = 功能_查询点数 (APPKEY)
输出调试文本 ("[完整响应]" + #换行符 + 返回文本)

.如果真 (json.解析 (返回文本, , ))
    .如果真 (json.取通用属性 ("status", ) = "1")
        输出调试文本 ("[成功] 当前可用点数:" + 到文本 (json.取通用属性 ("points", )))
    .否则
        输出调试文本 ("[失败] " + 到文本 (json.取通用属性 ("msg", )))
    .如果真结束
.否则
    输出调试文本 ("[失败] JSON 解析失败,请检查返回内容")
.如果真结束

返回 (0)

.子程序 功能_查询点数, 文本型, , 本命令由〖精易网页调试助手〗生成,请配合精易模块使用。
.参数 APPKEY, 文本型
.局部变量 局_网址, 文本型
.局部变量 局_方式, 整数型
.局部变量 ADD_协议头, 类_POST数据类
.局部变量 局_提交协议头, 文本型
.局部变量 局_结果, 字节集
.局部变量 局_返回, 文本型

局_网址 = "http://api.ttocr.com/api/points?appkey=" + 编码_URL编码 (APPKEY, 真, 真)
局_方式 = 0
ADD_协议头.添加 ("Accept", "application/json", )
ADD_协议头.添加 ("User-Agent", "Mozilla/5.0", )
局_提交协议头 = ADD_协议头.获取协议头数据 ()
局_结果 = 网页_访问_对象 (局_网址, 局_方式, , , , 局_提交协议头, , , , , , , , , , , )
局_返回 = 到文本 (编码_Utf8到Ansi (局_结果))
返回 (局_返回)

提交识别

RecognizeYidun.e

下载源码
RecognizeYidun.e

易语言

.版本 2

.子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行
.局部变量 APPKEY, 文本型
.局部变量 YIDUNID, 文本型
.局部变量 YIDUNReferer, 文本型
.局部变量 ITEMID, 文本型
.局部变量 PROXY, 文本型
.局部变量 DEVKEY, 文本型
.局部变量 返回文本, 文本型
.局部变量 json, 类_json

' =============================================================
'   易盾识别 Demo (易语言版)
'
'   说明:
'   1. 需要先导入精易模块
'   2. 接口使用 /api/recognize2
'   3. 易盾固定 itemid = 500
' =============================================================

APPKEY = "你的appkey"
YIDUNID = "你获取到的易盾id"
YIDUNReferer = "你获取到的referer地址"
ITEMID = "500"
PROXY = ""
DEVKEY = ""

.如果真 (APPKEY = "你的appkey")
    输出调试文本 ("[错误] 请先把 APPKEY 改成你自己的密钥")
    返回 (0)
.如果真结束

.如果真 (YIDUNID = "你获取到的易盾id")
    输出调试文本 ("[错误] 请先填写 YIDUNID 和 YIDUNReferer")
    返回 (0)
.如果真结束

返回文本 = 功能_易盾识别 (APPKEY, YIDUNID, YIDUNReferer, ITEMID, PROXY, DEVKEY)
输出调试文本 ("[完整响应]" + #换行符 + 返回文本)

.如果真 (json.解析 (返回文本, , ))
    .如果真 (json.取通用属性 ("status", ) = "1")
        输出调试文本 ("[成功] 耗时:" + 到文本 (json.取通用属性 ("time", )) + "ms")
        输出调试文本 ("[识别结果] " + 到文本 (json.取通用属性 ("data", )))
    .否则
        输出调试文本 ("[失败] " + 到文本 (json.取通用属性 ("msg", )))
        输出调试文本 ("[提示] 如果 validate 提交后无法通过,请先再做一次 urlencode")
    .如果真结束
.否则
    输出调试文本 ("[失败] JSON 解析失败,请检查返回内容")
.如果真结束

返回 (0)

.子程序 功能_易盾识别, 文本型, , 本命令由〖精易网页调试助手〗生成,请配合精易模块使用。
.参数 APPKEY, 文本型
.参数 YIDUNID, 文本型
.参数 YIDUNReferer, 文本型
.参数 ITEMID, 文本型
.参数 PROXY, 文本型
.参数 DEVKEY, 文本型
.局部变量 局_网址, 文本型
.局部变量 局_方式, 整数型
.局部变量 局_提交数据, 文本型
.局部变量 ADD_协议头, 类_POST数据类
.局部变量 局_提交协议头, 文本型
.局部变量 局_结果, 字节集
.局部变量 局_返回, 文本型

局_网址 = "http://api.ttocr.com/api/recognize2"
局_方式 = 1
局_提交数据 = "appkey=" + 编码_URL编码 (APPKEY, 真, 真)
局_提交数据 = 局_提交数据 + "&id=" + 编码_URL编码 (YIDUNID, 真, 真)
局_提交数据 = 局_提交数据 + "&referer=" + 编码_URL编码 (YIDUNReferer, 真, 真)
局_提交数据 = 局_提交数据 + "&itemid=" + 编码_URL编码 (ITEMID, 真, 真)

.如果真 (PROXY = "")
.否则
    局_提交数据 = 局_提交数据 + "&proxy=" + 编码_URL编码 (PROXY, 真, 真)
.如果真结束

.如果真 (DEVKEY = "")
.否则
    局_提交数据 = 局_提交数据 + "&devkey=" + 编码_URL编码 (DEVKEY, 真, 真)
.如果真结束

ADD_协议头.添加 ("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8", )
ADD_协议头.添加 ("Accept", "application/json", )
ADD_协议头.添加 ("User-Agent", "Mozilla/5.0", )
局_提交协议头 = ADD_协议头.获取协议头数据 ()
局_结果 = 网页_访问_对象 (局_网址, 局_方式, 局_提交数据, , , 局_提交协议头, , , , , , , , , , , )
局_返回 = 到文本 (编码_Utf8到Ansi (局_结果))
返回 (局_返回)

Node.js

共 2 个示例,按接口动作拆分。

该语言注意事项

跟随当前语言展示
  • ============================================================== 易盾识别 对接示例 — Node.js版 使用说明 ============================================================== 【一、环境准备】 1. 安装 Node.js - 下载地址:https://nodejs.org/ - 建议下载 LTS(长期支持)版本,最低要求 v12+ - 安装过程中保持默认选项即可,安装程序会自动配置环境变量 - 安装完成后,打开命令行(cmd 或 PowerShell),输入以下命令验证: node --version npm --version 如果都能正常显示版本号则安装成功 2. 本Demo无需安装任何第三方依赖 - 使用的全部是 Node.js 内置模块(http、querystring) - 不需要执行 npm install,直接运行即可 -------------------------------------------------------------- 【二、参数配置】 本Demo包含两个独立脚本: - query_points.js — 查询账户剩余点数 - recognize_yidun.js — 提交易盾验证码识别 请根据需要打开对应的脚本文件,找到顶部的"配置区域",修改以下参数: 1. APPKEY(必填) - 你的用户密钥,登录平台后在个人中心获取 - 示例:const APPKEY = "abc123def456"; 2. YIDUN_ID(必填) - 易盾验证码的 id 参数值 - 需要从目标网站通过浏览器开发者工具(F12)抓包获取 - 在网络请求中搜索与易盾相关的请求,找到 id 参数 - 示例:const YIDUN_ID = "84e18cc9ea6a49c7845847d7518b8ddf"; 3. YIDUN_REFERER(必填) - 易盾验证码请求中的 referer 值 - 同样需要从浏览器开发者工具(F12)抓包获取 - 注意:这个值不一定是你当前访问的页面URL,而是验证码请求头中的referer 4. ITEM_ID(一般不需要改) - 易盾类型固定填写 500 - 特殊类型请联系客服确认 5. PROXY(可选) - 如果你需要通过代理IP访问,填写代理地址 - 支持的格式: * http://IP:端口 (普通HTTP代理,若需白名单支持请联系客服) * http://账号:密码@proxy.com:8080 (带认证的HTTP代理) * socks5://127.0.0.1:9888 (SOCKS5代理) - 不需要代理则留空:const PROXY = ""; 6. DEVKEY(可选) - 开发者密钥,如果你有的话填写,没有则留空 -------------------------------------------------------------- 【三、运行方式】 1. 打开命令行(cmd 或 PowerShell) 2. 切换到脚本所在目录: cd 易盾\nodejs 查询点数: 3. 执行:node query_points.js - 仅查询账户剩余点数,确认APPKEY是否正确 易盾识别: 4. 执行:node recognize_yidun.js - 提交易盾验证码识别任务,等待服务器返回结果 5. 识别结果会在控制台中显示 -------------------------------------------------------------- 【四、常见问题】 Q1:运行时提示 "node 不是内部或外部命令" A1:Node.js未安装或环境变量未配置,请重新安装Node.js并确保勾选添加到PATH Q2:运行时提示 "请先在脚本顶部的配置区域填写你的 APPKEY" A2:你还没有修改 APPKEY,请用你自己的密钥替换 "你的appkey" Q3:查询点数成功但识别失败 A3:请检查 YIDUN_ID 和 YIDUN_REFERER 是否正确,这两个值需要实时抓包获取 Q4:返回的 validate 无法通过目标网站验证 A4:尝试对返回的 validate 值进行 encodeURIComponent() 编码后再使用 Q5:识别耗时较长(超过10秒) A5:这是正常现象,易盾验证码识别需要服务器端处理,耐心等待即可 Q6:提示网络请求出错或连接超时 A6:请检查网络连接是否正常,或者尝试使用代理IP -------------------------------------------------------------- 【五、重要注意事项】 1. 查询点数接口有频率限制:不得超过1秒1次,否则会被拉黑24小时 2. 识别接口的超时时间设置为120秒,请耐心等待结果 3. 不要将你的 APPKEY 泄露给他人 4. 请确保你的账户有足够的点数余额 5. 本Demo使用纯Node.js内置模块,无需额外安装任何npm包 ==============================================================

查询点数

query_points.js

下载源码
query_points.js

Node.js

/**
 * =============================================================
 *   查询账户点数 Demo (Node.js版)
 *
 *   功能说明:
 *   查询账户剩余点数(余额)
 *
 *   使用方法:
 *   1. 确保已安装 Node.js (建议 v12+)
 *   2. 将下方的 APPKEY 替换为你自己的用户密钥
 *   3. 运行脚本:node query_points.js
 *   注意:本Demo使用Node.js内置模块,无需安装第三方依赖
 * =============================================================
 */

const http = require('http');

// ======================== 配置区域(请替换为你自己的参数)========================
// 用户密钥,登录平台后获取
const APPKEY = "你的appkey";
// ===============================================================================

// API基础地址
const API_BASE = "http://api.ttocr.com/api";

/**
 * 发送HTTP GET请求
 */
function httpGet(url) {
    return new Promise((resolve, reject) => {
        http.get(url, { timeout: 10000 }, (res) => {
            let data = '';
            res.on('data', (chunk) => { data += chunk; });
            res.on('end', () => {
                try { resolve(JSON.parse(data)); }
                catch (e) { reject(new Error('JSON解析失败: ' + data)); }
            });
        }).on('error', reject);
    });
}

/**
 * 查询账户剩余点数
 * 接口地址:GET http://api.ttocr.com/api/points
 * 注意:查询点数不得超过1秒1次,否则会被拉黑24小时
 */
async function queryPoints() {
    console.log("=".repeat(50));
    console.log("[查询点数] 正在查询账户剩余点数...");
    console.log("=".repeat(50));
    try {
        const url = `${API_BASE}/points?appkey=${encodeURIComponent(APPKEY)}`;
        const result = await httpGet(url);
        if (result.status === 1) {
            console.log(`[成功] 查询成功!当前可用点数:${result.points}`);
        } else {
            console.log(`[失败] 查询失败,错误信息:${result.msg}`);
            console.log(`[提示] 错误状态码:${result.status},请参考错误代码表排查`);
        }
        console.log(`[完整响应] ${JSON.stringify(result, null, 2)}`);
        return result;
    } catch (e) {
        console.log(`[异常] 网络请求出错:${e.message}`);
        return null;
    }
}

// 主流程
async function main() {
    console.log("*".repeat(60));
    console.log("  查询账户点数 Demo (Node.js版)");
    console.log("*".repeat(60));

    if (APPKEY === "你的appkey") {
        console.log("\n[错误] 请先在脚本顶部的配置区域填写你的 APPKEY");
        process.exit(1);
    }

    await queryPoints();

    console.log("\n" + "=".repeat(50));
    console.log("[完成] 查询执行完毕");
    console.log("=".repeat(50));
}

main().catch(err => {
    console.error("[致命错误]", err.message);
    process.exit(1);
});

提交识别

recognize_yidun.js

下载源码
recognize_yidun.js

Node.js

/**
 * =============================================================
 *   易盾识别 Demo (Node.js版)
 *
 *   功能说明:
 *   提交易盾验证码识别任务
 *
 *   使用方法:
 *   1. 确保已安装 Node.js (建议 v12+)
 *   2. 将下方的 APPKEY 替换为你自己的用户密钥
 *   3. 将 YIDUN_ID 替换为你获取到的易盾验证码 id 参数
 *   4. 将 YIDUN_REFERER 替换为你获取到的 referer 值
 *   5. 运行脚本:node recognize_yidun.js
 *   注意:本Demo使用Node.js内置模块,无需安装第三方依赖
 * =============================================================
 */

const http = require('http');
const querystring = require('querystring');

// ======================== 配置区域(请替换为你自己的参数)========================
// 用户密钥,登录平台后获取
const APPKEY = "你的appkey";

// 易盾验证码的 id 参数值(从目标网站抓包获取)
const YIDUN_ID = "你获取到的易盾id";

// 易盾验证码的 referer 值(从目标网站抓包获取,注意不是当前页面的URL)
const YIDUN_REFERER = "你获取到的referer地址";

// 项目类型,易盾固定填写 500(特殊类型请联系客服)
const ITEM_ID = 500;

// 可选参数:代理IP(格式示例:http://IP:端口,若需白名单支持请联系客服。http://账号:密码@proxy.com:8080 或 socks5://127.0.0.1:9888)
const PROXY = "";

// 可选参数:开发者密钥(如果有的话填写)
const DEVKEY = "";
// ===============================================================================

// API基础地址
const API_BASE = "http://api.ttocr.com/api";

/**
 * 发送HTTP POST请求(表单数据)
 */
function httpPost(url, postData) {
    return new Promise((resolve, reject) => {
        const data = querystring.stringify(postData);
        const urlObj = new URL(url);
        const options = {
            hostname: urlObj.hostname,
            port: urlObj.port || 80,
            path: urlObj.pathname,
            method: 'POST',
            timeout: 120000, // 识别可能需要较长时间
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
                'Content-Length': Buffer.byteLength(data)
            }
        };
        const req = http.request(options, (res) => {
            let body = '';
            res.on('data', (chunk) => { body += chunk; });
            res.on('end', () => {
                try { resolve(JSON.parse(body)); }
                catch (e) { reject(new Error('JSON解析失败: ' + body)); }
            });
        });
        req.on('error', reject);
        req.write(data);
        req.end();
    });
}

/**
 * 提交易盾验证码识别任务
 * 接口地址:POST http://api.ttocr.com/api/recognize2
 * 必填参数:appkey, id, referer, itemid(固定500)
 * 可选参数:proxy, devkey, ua, type
 * 重要提示:如果结果无法通过验证,请将返回的validate进行urlencode编码后再尝试
 */
async function recognizeYidun() {
    console.log("=".repeat(50));
    console.log("[易盾识别] 正在提交易盾识别任务...");
    console.log("=".repeat(50));
    const postData = {
        appkey: APPKEY,
        id: YIDUN_ID,
        referer: YIDUN_REFERER,
        itemid: ITEM_ID,
    };
    if (PROXY) { postData.proxy = PROXY; }
    if (DEVKEY) { postData.devkey = DEVKEY; }
    console.log(`[请求参数] id=${YIDUN_ID}`);
    console.log(`[请求参数] referer=${YIDUN_REFERER}`);
    console.log(`[请求参数] itemid=${ITEM_ID}`);
    try {
        const url = `${API_BASE}/recognize2`;
        const result = await httpPost(url, postData);
        if (result.status === 1) {
            console.log(`[成功] 识别成功!耗时:${result.time}ms`);
            console.log(`[识别结果] ${result.data}`);
        } else {
            console.log(`[失败] 识别失败,错误信息:${result.msg}`);
            console.log(`[提示] 错误状态码:${result.status},请参考错误代码表排查`);
        }
        console.log(`\n[完整响应] ${JSON.stringify(result, null, 2)}`);
        return result;
    } catch (e) {
        console.log(`[异常] 网络请求出错:${e.message}`);
        return null;
    }
}

// 主流程
async function main() {
    console.log("*".repeat(60));
    console.log("  易盾识别 Demo (Node.js版)");
    console.log("*".repeat(60));

    if (APPKEY === "你的appkey") {
        console.log("\n[错误] 请先在脚本顶部的配置区域填写你的 APPKEY");
        process.exit(1);
    }
    if (YIDUN_ID === "你获取到的易盾id") {
        console.log("\n[错误] 请先在脚本顶部的配置区域填写 YIDUN_ID 和 YIDUN_REFERER");
        process.exit(1);
    }

    await recognizeYidun();

    console.log("\n" + "=".repeat(50));
    console.log("[完成] 识别执行完毕");
    console.log("=".repeat(50));
}

main().catch(err => {
    console.error("[致命错误]", err.message);
    process.exit(1);
});

Java

共 2 个示例,按接口动作拆分。

该语言注意事项

跟随当前语言展示
  • ============================================================== 易盾识别 对接示例 — Java版 使用说明 ============================================================== 【一、环境准备】 1. 安装 JDK(Java Development Kit) - 下载地址:https://www.oracle.com/java/technologies/downloads/ - 也可以使用免费的 OpenJDK:https://adoptium.net/ - 建议版本:JDK 8 或以上(推荐 JDK 11+) - 安装完成后,需要配置环境变量: * JAVA_HOME = JDK安装目录(例如 C:\Program Files\Java\jdk-11) * 在 Path 中添加 %JAVA_HOME%\bin - 打开命令行(cmd),输入以下命令验证: java -version javac -version 如果都能正常显示版本号则配置成功 2. 本Demo无需任何第三方依赖 - 使用的全部是 JDK 自带的标准库(java.net、java.io等) - 不需要 Maven、Gradle 或其他构建工具 -------------------------------------------------------------- 【二、参数配置】 本Demo包含两个独立源码文件: - QueryPoints.java — 查询账户剩余点数 - RecognizeYidun.java — 提交易盾验证码识别 请根据需要打开对应的源码文件,找到顶部的"配置区域",修改以下参数: 1. APPKEY(必填) - 你的用户密钥,登录平台后在个人中心获取 - 示例:private static final String APPKEY = "abc123def456"; 2. YIDUN_ID(必填) - 易盾验证码的 id 参数值 - 需要从目标网站通过浏览器开发者工具(F12)抓包获取 - 在网络请求中搜索与易盾相关的请求,找到 id 参数 - 示例:private static final String YIDUN_ID = "84e18cc9ea6a..."; 3. YIDUN_REFERER(必填) - 易盾验证码请求中的 referer 值 - 同样需要从浏览器开发者工具(F12)抓包获取 - 注意:这个值不一定是你当前访问的页面URL,而是验证码请求头中的referer 4. ITEM_ID(一般不需要改) - 易盾类型固定填写 500 - 特殊类型请联系客服确认 5. PROXY(可选) - 如果你需要通过代理IP访问,填写代理地址 - 支持的格式: * http://IP:端口 (普通HTTP代理,若需白名单支持请联系客服) * http://账号:密码@proxy.com:8080 (带认证的HTTP代理) * socks5://127.0.0.1:9888 (SOCKS5代理) - 不需要代理则留空:private static final String PROXY = ""; 6. DEVKEY(可选) - 开发者密钥,如果你有的话填写,没有则留空 -------------------------------------------------------------- 【三、编译与运行】 1. 打开命令行(cmd 或 PowerShell) 2. 切换到源码所在目录: cd 易盾\java 查询点数: 3. 编译并运行: javac -encoding UTF-8 QueryPoints.java && java QueryPoints 易盾识别: 4. 编译并运行: javac -encoding UTF-8 RecognizeYidun.java && java RecognizeYidun 注意:编译时必须加 -encoding UTF-8 参数,否则中文注释可能导致编译错误 -------------------------------------------------------------- 【四、常见问题】 Q1:编译时提示 "javac 不是内部或外部命令" A1:JDK未安装或环境变量未配置,请按"环境准备"步骤配置JAVA_HOME和Path Q2:编译时出现中文乱码或编码错误 A2:请在编译命令中加上 -encoding UTF-8 参数 Q3:运行时提示 "请先在代码顶部的配置区域填写你的 APPKEY" A3:你还没有修改 APPKEY,请用你自己的密钥替换 "你的appkey" Q4:查询点数成功但识别失败 A4:请检查 YIDUN_ID 和 YIDUN_REFERER 是否正确,这两个值需要实时抓包获取 Q5:返回的 validate 无法通过目标网站验证 A5:尝试对返回的 validate 值进行 URLEncoder.encode() 编码后再使用 Q6:识别耗时较长(超过10秒) A6:这是正常现象,易盾验证码识别需要服务器端处理,耐心等待即可 Q7:提示网络请求出错或连接超时 A7:请检查网络连接是否正常,或者尝试使用代理IP -------------------------------------------------------------- 【五、重要注意事项】 1. 查询点数接口有频率限制:不得超过1秒1次,否则会被拉黑24小时 2. 识别接口的超时时间设置为120秒,请耐心等待结果 3. 不要将你的 APPKEY 泄露给他人 4. 请确保你的账户有足够的点数余额 5. 编译时务必使用 -encoding UTF-8 避免编码问题 ==============================================================

查询点数

QueryPoints.java

下载源码
QueryPoints.java

Java

import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;

/**
 * =============================================================
 *   查询账户点数 Demo (Java版)
 *
 *   功能说明:
 *   查询账户剩余点数(余额)
 *
 *   使用方法:
 *   1. 将下方的 APPKEY 替换为你自己的用户密钥
 *   2. 编译运行:javac -encoding UTF-8 QueryPoints.java && java QueryPoints
 * =============================================================
 */
public class QueryPoints {

    // ======================== 配置区域(请替换为你自己的参数)========================
    // 用户密钥,登录平台后获取
    private static final String APPKEY = "你的appkey";
    // ===============================================================================

    // API基础地址
    private static final String API_BASE = "http://api.ttocr.com/api";

    /**
     * 发送GET请求
     */
    private static String httpGet(String urlStr) throws Exception {
        URL url = new URL(urlStr);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setConnectTimeout(10000);
        conn.setReadTimeout(10000);
        BufferedReader reader = new BufferedReader(
                new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8));
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            sb.append(line);
        }
        reader.close();
        conn.disconnect();
        return sb.toString();
    }

    /**
     * 查询账户剩余点数
     * 接口地址:GET http://api.ttocr.com/api/points
     * 注意:查询点数不得超过1秒1次,否则会被拉黑24小时
     */
    public static void main(String[] args) {
        System.out.println("************************************************************");
        System.out.println("  查询账户点数 Demo (Java版)");
        System.out.println("************************************************************");

        // 检查参数是否已配置
        if ("你的appkey".equals(APPKEY)) {
            System.out.println("\n[错误] 请先在代码顶部的配置区域填写你的 APPKEY");
            System.exit(1);
        }

        System.out.println("==================================================");
        System.out.println("[查询点数] 正在查询账户剩余点数...");
        System.out.println("==================================================");
        try {
            String url = API_BASE + "/points?appkey=" + URLEncoder.encode(APPKEY, "UTF-8");
            String result = httpGet(url);
            System.out.println("[完整响应] " + result);
        } catch (Exception e) {
            System.out.println("[异常] 网络请求出错:" + e.getMessage());
        }

        System.out.println("\n==================================================");
        System.out.println("[完成] 查询执行完毕");
        System.out.println("==================================================");
    }
}

提交识别

RecognizeYidun.java

下载源码
RecognizeYidun.java

Java

import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;

/**
 * =============================================================
 *   易盾识别 Demo (Java版)
 *
 *   功能说明:
 *   提交易盾验证码识别任务
 *
 *   使用方法:
 *   1. 将下方的 APPKEY 替换为你自己的用户密钥
 *   2. 将 YIDUN_ID 替换为你获取到的易盾验证码 id 参数
 *   3. 将 YIDUN_REFERER 替换为你获取到的 referer 值
 *   4. 编译运行:javac -encoding UTF-8 RecognizeYidun.java && java RecognizeYidun
 * =============================================================
 */
public class RecognizeYidun {

    // ======================== 配置区域(请替换为你自己的参数)========================
    // 用户密钥,登录平台后获取
    private static final String APPKEY = "你的appkey";

    // 易盾验证码的 id 参数值(从目标网站抓包获取)
    private static final String YIDUN_ID = "你获取到的易盾id";

    // 易盾验证码的 referer 值(从目标网站抓包获取,注意不是当前页面的URL)
    private static final String YIDUN_REFERER = "你获取到的referer地址";

    // 项目类型,易盾固定填写 500(特殊类型请联系客服)
    private static final int ITEM_ID = 500;

    // 可选参数:代理IP(格式示例:http://IP:端口,若需白名单支持请联系客服。http://账号:密码@proxy.com:8080 或 socks5://127.0.0.1:9888)
    private static final String PROXY = "";

    // 可选参数:开发者密钥(如果有的话填写)
    private static final String DEVKEY = "";
    // ===============================================================================

    // API基础地址
    private static final String API_BASE = "http://api.ttocr.com/api";

    /**
     * 发送POST请求(表单数据)
     */
    private static String httpPost(String urlStr, String postData) throws Exception {
        URL url = new URL(urlStr);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setDoOutput(true);
        conn.setConnectTimeout(10000);
        conn.setReadTimeout(120000); // 识别可能需要较长时间
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        OutputStream os = conn.getOutputStream();
        os.write(postData.getBytes(StandardCharsets.UTF_8));
        os.flush();
        os.close();
        BufferedReader reader = new BufferedReader(
                new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8));
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            sb.append(line);
        }
        reader.close();
        conn.disconnect();
        return sb.toString();
    }

    /**
     * 提交易盾验证码识别任务
     * 接口地址:POST http://api.ttocr.com/api/recognize2
     * 必填参数:appkey, id, referer, itemid(固定500)
     * 可选参数:proxy, devkey, ua, type
     * 重要提示:如果结果无法通过验证,请将返回的validate进行urlencode编码后再尝试
     */
    public static void main(String[] args) {
        System.out.println("************************************************************");
        System.out.println("  易盾识别 Demo (Java版)");
        System.out.println("************************************************************");

        // 检查参数是否已配置
        if ("你的appkey".equals(APPKEY)) {
            System.out.println("\n[错误] 请先在代码顶部的配置区域填写你的 APPKEY");
            System.exit(1);
        }
        if ("你获取到的易盾id".equals(YIDUN_ID)) {
            System.out.println("\n[错误] 请先在代码顶部的配置区域填写 YIDUN_ID 和 YIDUN_REFERER");
            System.exit(1);
        }

        System.out.println("==================================================");
        System.out.println("[易盾识别] 正在提交易盾识别任务...");
        System.out.println("==================================================");
        try {
            String url = API_BASE + "/recognize2";
            // 构建POST请求数据
            StringBuilder postData = new StringBuilder();
            postData.append("appkey=").append(URLEncoder.encode(APPKEY, "UTF-8"));
            postData.append("&id=").append(URLEncoder.encode(YIDUN_ID, "UTF-8"));
            postData.append("&referer=").append(URLEncoder.encode(YIDUN_REFERER, "UTF-8"));
            postData.append("&itemid=").append(ITEM_ID);
            // 如果设置了代理,则添加代理参数
            if (PROXY != null && !PROXY.isEmpty()) {
                postData.append("&proxy=").append(URLEncoder.encode(PROXY, "UTF-8"));
            }
            // 如果设置了开发者密钥,则添加
            if (DEVKEY != null && !DEVKEY.isEmpty()) {
                postData.append("&devkey=").append(URLEncoder.encode(DEVKEY, "UTF-8"));
            }
            System.out.println("[请求参数] id=" + YIDUN_ID);
            System.out.println("[请求参数] referer=" + YIDUN_REFERER);
            System.out.println("[请求参数] itemid=" + ITEM_ID);
            String result = httpPost(url, postData.toString());
            System.out.println("[完整响应] " + result);
        } catch (Exception e) {
            System.out.println("[异常] 网络请求出错:" + e.getMessage());
        }

        System.out.println("\n==================================================");
        System.out.println("[完成] 识别执行完毕");
        System.out.println("==================================================");
    }
}

Rust

共 2 个示例,按接口动作拆分。

该语言注意事项

跟随当前语言展示
  • ============================================================== 易盾识别 对接示例 — Rust版 使用说明 ============================================================== 【一、环境准备】 1. 安装 Rust / Cargo - 官方地址:https://www.rust-lang.org/tools/install - 安装完成后执行: rustc --version cargo --version 2. 安装依赖 - 进入你的 Cargo 项目后执行: cargo add reqwest --features blocking,json,rustls-tls cargo add serde_json -------------------------------------------------------------- 【二、参数配置】 本 Demo 包含两个独立脚本: - query_points.rs — 查询账户剩余点数 - recognize_yidun.rs — 提交易盾验证码识别 需要重点填写: 1. APPKEY 2. YIDUN_ID 3. YIDUN_REFERER 4. ITEM_ID 固定为 500 5. PROXY / DEVKEY 视情况选填 -------------------------------------------------------------- 【三、运行方式】 1. 将文件放入 Cargo 项目中,例如: src/bin/query_points.rs src/bin/recognize_yidun.rs 2. 查询点数: cargo run --bin query_points 3. 易盾识别: cargo run --bin recognize_yidun -------------------------------------------------------------- 【四、常见问题】 Q1:编译时报缺少 reqwest 或 serde_json A1:请先执行 cargo add 安装依赖 Q2:返回的 validate 无法通过验证 A2:请将返回的 validate 进行 urlencode 编码后再尝试 Q3:提示网络请求出错 A3:请检查网络、代理和参数是否过期 -------------------------------------------------------------- 【五、重要注意事项】 1. 查询点数接口不得超过 1 秒 1 次,否则会被拉黑 24 小时 2. 识别接口超时时间为 60 秒,请耐心等待结果 3. 不要将 APPKEY 泄露给他人 4. 请确保账户点数余额充足 ==============================================================

查询点数

query_points.rs

下载源码
query_points.rs

Rust

/*
=============================================================
  查询账户点数 Demo (Rust版)

  功能说明:
  查询账户剩余点数(余额)

  使用方法:
  1. 确保已安装 Rust / Cargo(建议 stable 版本)
  2. 执行:
       cargo add reqwest --features blocking,json,rustls-tls
       cargo add serde_json
  3. 将下方的 APPKEY 替换为你自己的用户密钥
  4. 运行脚本:cargo run --bin query_points
=============================================================
*/

use reqwest::blocking::Client;
use serde_json::Value;
use std::error::Error;
use std::process;
use std::time::Duration;

const APPKEY: &str = "你的appkey";
const API_BASE: &str = "http://api.ttocr.com/api";

fn query_points() -> Result<Value, Box<dyn Error>> {
    let client = Client::builder().timeout(Duration::from_secs(10)).build()?;
    let result: Value = client
        .get(&format!("{}/points", API_BASE))
        .query(&[("appkey", APPKEY)])
        .send()?
        .json()?;

    if result["status"].as_i64() == Some(1) {
        println!("[成功] 查询成功!当前可用点数:{}", result["points"]);
    } else {
        println!("[失败] 查询失败,错误信息:{}", result["msg"]);
        println!("[提示] 错误状态码:{},请参考错误代码表排查", result["status"]);
    }

    println!(
        "[完整响应] {}",
        serde_json::to_string_pretty(&result).unwrap_or_else(|_| result.to_string())
    );

    Ok(result)
}

fn main() {
    println!("************************************************************");
    println!("  查询账户点数 Demo (Rust版)");
    println!("************************************************************");

    if APPKEY == "你的appkey" {
        println!("\n[错误] 请先在代码顶部的配置区域填写你的 APPKEY");
        process::exit(1);
    }

    println!("==================================================");
    println!("[查询点数] 正在查询账户剩余点数...");
    println!("==================================================");

    if let Err(error) = query_points() {
        println!("[异常] 网络请求出错:{}", error);
        process::exit(1);
    }

    println!("\n==================================================");
    println!("[完成] 查询执行完毕");
    println!("==================================================");
}

提交识别

recognize_yidun.rs

下载源码
recognize_yidun.rs

Rust

/*
=============================================================
  易盾识别 Demo (Rust版)

  功能说明:
  提交易盾验证码识别任务

  使用方法:
  1. 确保已安装 Rust / Cargo(建议 stable 版本)
  2. 执行:
       cargo add reqwest --features blocking,json,rustls-tls
       cargo add serde_json
  3. 将下方的 APPKEY / YIDUN_ID / YIDUN_REFERER 替换为你自己的值
  4. 运行脚本:cargo run --bin recognize_yidun
=============================================================
*/

use reqwest::blocking::Client;
use serde_json::Value;
use std::collections::HashMap;
use std::error::Error;
use std::process;
use std::time::Duration;

const APPKEY: &str = "你的appkey";
const YIDUN_ID: &str = "你获取到的易盾id";
const YIDUN_REFERER: &str = "你获取到的referer地址";
const ITEM_ID: &str = "500";
const PROXY: &str = "";
const DEVKEY: &str = "";
const API_BASE: &str = "http://api.ttocr.com/api";

fn recognize_yidun() -> Result<Value, Box<dyn Error>> {
    let client = Client::builder().timeout(Duration::from_secs(60)).build()?;
    let mut params = HashMap::new();
    params.insert("appkey", APPKEY.to_string());
    params.insert("id", YIDUN_ID.to_string());
    params.insert("referer", YIDUN_REFERER.to_string());
    params.insert("itemid", ITEM_ID.to_string());

    if !PROXY.is_empty() {
        params.insert("proxy", PROXY.to_string());
    }
    if !DEVKEY.is_empty() {
        params.insert("devkey", DEVKEY.to_string());
    }

    println!("[请求参数] id={}", YIDUN_ID);
    println!("[请求参数] referer={}", YIDUN_REFERER);
    println!("[请求参数] itemid={}", ITEM_ID);

    let result: Value = client
        .post(&format!("{}/recognize2", API_BASE))
        .form(&params)
        .send()?
        .json()?;

    if result["status"].as_i64() == Some(1) {
        println!("[成功] 识别成功!耗时:{}ms", result["time"]);
        println!("[识别结果] {}", result["data"]);
    } else {
        println!("[失败] 识别失败,错误信息:{}", result["msg"]);
        println!("[提示] 错误状态码:{},请参考错误代码表排查", result["status"]);
        println!("[提示] 如果结果无法通过验证,请将返回的 validate 进行 urlencode 编码后再尝试。");
    }

    println!(
        "\n[完整响应] {}",
        serde_json::to_string_pretty(&result).unwrap_or_else(|_| result.to_string())
    );

    Ok(result)
}

fn main() {
    println!("************************************************************");
    println!("  易盾识别 Demo (Rust版)");
    println!("************************************************************");

    if APPKEY == "你的appkey" {
        println!("\n[错误] 请先在代码顶部的配置区域填写你的 APPKEY");
        process::exit(1);
    }
    if YIDUN_ID == "你获取到的易盾id" {
        println!("\n[错误] 请先在代码顶部的配置区域填写 YIDUN_ID 和 YIDUN_REFERER");
        process::exit(1);
    }

    println!("==================================================");
    println!("[易盾识别] 正在提交易盾识别任务...");
    println!("==================================================");

    if let Err(error) = recognize_yidun() {
        println!("[异常] 网络请求出错:{}", error);
        process::exit(1);
    }

    println!("\n==================================================");
    println!("[完成] 识别执行完毕");
    println!("==================================================");
}

C#

共 2 个示例,按接口动作拆分。

该语言注意事项

跟随当前语言展示
  • ============================================================== 易盾识别 对接示例 — C#版 使用说明 ============================================================== 【一、环境准备】 你可以选择以下任一方式来编译运行本Demo: 方式A:使用 .NET SDK(推荐,适合没有Visual Studio的用户) -------------------------------------------------------- 1. 下载 .NET SDK - 下载地址:https://dotnet.microsoft.com/download - 建议下载 .NET 6.0 或以上版本 - 安装完成后,打开命令行(cmd 或 PowerShell),输入以下命令验证: dotnet --version 如果显示版本号则安装成功 方式B:使用 Visual Studio -------------------------------------------------------- 1. 下载 Visual Studio - 下载地址:https://visualstudio.microsoft.com/ - 免费版(Community)即可 - 安装时勾选".NET 桌面开发"工作负载 方式C:使用 .NET Framework 自带的 csc 编译器(无需安装额外软件) -------------------------------------------------------- 1. Windows系统自带 .NET Framework,其中包含 csc.exe 编译器 2. csc.exe 通常位于: C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe 或(64位系统): C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe -------------------------------------------------------------- 【二、参数配置】 本Demo包含两个独立源码文件: - QueryPoints.cs — 查询账户剩余点数 - RecognizeYidun.cs — 提交易盾验证码识别 请根据需要打开对应的源码文件,找到顶部的"配置区域",修改以下参数: 1. APPKEY(必填) - 你的用户密钥,登录平台后在个人中心获取 - 示例:static string APPKEY = "abc123def456"; 2. YIDUN_ID(必填) - 易盾验证码的 id 参数值 - 需要从目标网站通过浏览器开发者工具(F12)抓包获取 - 在网络请求中搜索与易盾相关的请求,找到 id 参数 3. YIDUN_REFERER(必填) - 易盾验证码请求中的 referer 值 - 同样需要从浏览器开发者工具(F12)抓包获取 - 注意:这个值不一定是你当前访问的页面URL,而是验证码请求头中的referer 4. ITEM_ID(一般不需要改) - 易盾类型固定填写 500 5. PROXY(可选) - 如果你需要通过代理IP访问,填写代理地址 - 支持的格式: * http://IP:端口 (普通HTTP代理,若需白名单支持请联系客服) * http://账号:密码@proxy.com:8080 (带认证的HTTP代理) * socks5://127.0.0.1:9888 (SOCKS5代理) - 不需要代理则留空:static string PROXY = ""; 6. DEVKEY(可选) - 开发者密钥,如果你有的话填写,没有则留空 -------------------------------------------------------------- 【三、编译与运行】 方式A:使用 .NET SDK(dotnet命令行) -------------------------------------------------------- 1. 打开命令行,切换到源码目录: cd 易盾\csharp 2. 创建项目(首次使用时执行一次): dotnet new console --force 3. 将对应的 .cs 文件内容复制替换生成的 Program.cs 4. 运行: dotnet run 方式B:使用 Visual Studio -------------------------------------------------------- 1. 打开 Visual Studio,创建一个新的"控制台应用程序"项目 2. 将对应的 .cs 文件内容复制替换到 Program.cs 中 3. 按 F5 或 Ctrl+F5 运行 方式C:使用 csc.exe 直接编译 -------------------------------------------------------- 1. 打开命令行,切换到源码目录: cd 易盾\csharp 查询点数: 2. 编译并运行: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /out:QueryPoints.exe QueryPoints.cs QueryPoints.exe 易盾识别: 3. 编译并运行: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /out:RecognizeYidun.exe RecognizeYidun.cs RecognizeYidun.exe -------------------------------------------------------------- 【四、常见问题】 Q1:编译时提示 "csc 不是内部或外部命令" A1:请使用完整路径调用csc.exe,或者安装 .NET SDK 后使用 dotnet run Q2:编译时提示找不到 System.Web 命名空间 A2:使用csc编译时需要引用System.Web.dll: csc /r:System.Web.dll /out:RecognizeYidun.exe RecognizeYidun.cs Q3:运行时提示 "请先在代码顶部的配置区域填写你的 APPKEY" A3:你还没有修改 APPKEY,请用你自己的密钥替换 "你的appkey" Q4:查询点数成功但识别失败 A4:请检查 YIDUN_ID 和 YIDUN_REFERER 是否正确,这两个值需要实时抓包获取 Q5:返回的 validate 无法通过目标网站验证 A5:尝试对返回的 validate 值进行 Uri.EscapeDataString() 编码后再使用 Q6:识别耗时较长(超过10秒) A6:这是正常现象,易盾验证码识别需要服务器端处理,耐心等待即可 -------------------------------------------------------------- 【五、重要注意事项】 1. 查询点数接口有频率限制:不得超过1秒1次,否则会被拉黑24小时 2. 识别接口的超时时间设置为120秒,请耐心等待结果 3. 不要将你的 APPKEY 泄露给他人 4. 请确保你的账户有足够的点数余额 5. 本Demo无需任何第三方NuGet包,使用.NET标准库即可运行 ==============================================================

查询点数

QueryPoints.cs

下载源码
QueryPoints.cs

C#

using System;
using System.IO;
using System.Net;
using System.Text;

/// <summary>
/// =============================================================
///   查询账户点数 Demo (C#版)
///
///   功能说明:
///   查询账户剩余点数(余额)
///
///   使用方法:
///   1. 将下方的 APPKEY 替换为你自己的用户密钥
///   2. 编译运行:csc QueryPoints.cs && QueryPoints.exe
///      或使用 dotnet run
/// =============================================================
/// </summary>
class QueryPoints
{
    // ======================== 配置区域(请替换为你自己的参数)========================
    // 用户密钥,登录平台后获取
    static string APPKEY = "你的appkey";
    // ===============================================================================

    // API基础地址
    static string API_BASE = "http://api.ttocr.com/api";

    /// <summary>
    /// 发送GET请求
    /// </summary>
    static string HttpGet(string url)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "GET";
        request.Timeout = 10000;
        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
        {
            return reader.ReadToEnd();
        }
    }

    static void Main(string[] args)
    {
        Console.OutputEncoding = Encoding.UTF8;
        Console.WriteLine(new string('*', 60));
        Console.WriteLine("  查询账户点数 Demo (C#版)");
        Console.WriteLine(new string('*', 60));

        // 检查参数是否已配置
        if (APPKEY == "你的appkey")
        {
            Console.WriteLine("\n[错误] 请先在代码顶部的配置区域填写你的 APPKEY");
            Environment.Exit(1);
        }

        Console.WriteLine(new string('=', 50));
        Console.WriteLine("[查询点数] 正在查询账户剩余点数...");
        Console.WriteLine(new string('=', 50));
        try
        {
            string url = API_BASE + "/points?appkey=" + Uri.EscapeDataString(APPKEY);
            string result = HttpGet(url);
            Console.WriteLine("[完整响应] " + result);
        }
        catch (Exception e)
        {
            Console.WriteLine("[异常] 网络请求出错:" + e.Message);
        }

        Console.WriteLine();
        Console.WriteLine(new string('=', 50));
        Console.WriteLine("[完成] 查询执行完毕");
        Console.WriteLine(new string('=', 50));
    }
}

提交识别

RecognizeYidun.cs

下载源码
RecognizeYidun.cs

C#

using System;
using System.IO;
using System.Net;
using System.Text;

/// <summary>
/// =============================================================
///   易盾识别 Demo (C#版)
///
///   功能说明:
///   提交易盾验证码识别任务
///
///   使用方法:
///   1. 将下方的 APPKEY 替换为你自己的用户密钥
///   2. 将 YIDUN_ID 替换为你获取到的易盾验证码 id 参数
///   3. 将 YIDUN_REFERER 替换为你获取到的 referer 值
///   4. 编译运行:csc RecognizeYidun.cs && RecognizeYidun.exe
///      或使用 dotnet run
/// =============================================================
/// </summary>
class RecognizeYidun
{
    // ======================== 配置区域(请替换为你自己的参数)========================
    // 用户密钥,登录平台后获取
    static string APPKEY = "你的appkey";

    // 易盾验证码的 id 参数值(从目标网站抓包获取)
    static string YIDUN_ID = "你获取到的易盾id";

    // 易盾验证码的 referer 值(从目标网站抓包获取,注意不是当前页面的URL)
    static string YIDUN_REFERER = "你获取到的referer地址";

    // 项目类型,易盾固定填写 500(特殊类型请联系客服)
    static int ITEM_ID = 500;

    // 可选参数:代理IP(格式示例:http://IP:端口,若需白名单支持请联系客服。http://账号:密码@proxy.com:8080 或 socks5://127.0.0.1:9888)
    static string PROXY = "";

    // 可选参数:开发者密钥(如果有的话填写)
    static string DEVKEY = "";
    // ===============================================================================

    // API基础地址
    static string API_BASE = "http://api.ttocr.com/api";

    /// <summary>
    /// 发送POST请求(表单数据)
    /// </summary>
    static string HttpPost(string url, string postData)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.Timeout = 120000; // 识别可能需要较长时间
        byte[] data = Encoding.UTF8.GetBytes(postData);
        request.ContentLength = data.Length;
        using (Stream stream = request.GetRequestStream())
        {
            stream.Write(data, 0, data.Length);
        }
        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
        {
            return reader.ReadToEnd();
        }
    }

    static void Main(string[] args)
    {
        Console.OutputEncoding = Encoding.UTF8;
        Console.WriteLine(new string('*', 60));
        Console.WriteLine("  易盾识别 Demo (C#版)");
        Console.WriteLine(new string('*', 60));

        // 检查参数是否已配置
        if (APPKEY == "你的appkey")
        {
            Console.WriteLine("\n[错误] 请先在代码顶部的配置区域填写你的 APPKEY");
            Environment.Exit(1);
        }
        if (YIDUN_ID == "你获取到的易盾id")
        {
            Console.WriteLine("\n[错误] 请先在代码顶部的配置区域填写 YIDUN_ID 和 YIDUN_REFERER");
            Environment.Exit(1);
        }

        Console.WriteLine(new string('=', 50));
        Console.WriteLine("[易盾识别] 正在提交易盾识别任务...");
        Console.WriteLine(new string('=', 50));
        try
        {
            string url = API_BASE + "/recognize2";
            // 构建POST请求数据
            StringBuilder postData = new StringBuilder();
            postData.Append("appkey=").Append(Uri.EscapeDataString(APPKEY));
            postData.Append("&id=").Append(Uri.EscapeDataString(YIDUN_ID));
            postData.Append("&referer=").Append(Uri.EscapeDataString(YIDUN_REFERER));
            postData.Append("&itemid=").Append(ITEM_ID);
            // 如果设置了代理,则添加代理参数
            if (!string.IsNullOrEmpty(PROXY))
            {
                postData.Append("&proxy=").Append(Uri.EscapeDataString(PROXY));
            }
            // 如果设置了开发者密钥,则添加
            if (!string.IsNullOrEmpty(DEVKEY))
            {
                postData.Append("&devkey=").Append(Uri.EscapeDataString(DEVKEY));
            }
            Console.WriteLine("[请求参数] id=" + YIDUN_ID);
            Console.WriteLine("[请求参数] referer=" + YIDUN_REFERER);
            Console.WriteLine("[请求参数] itemid=" + ITEM_ID);
            string result = HttpPost(url, postData.ToString());
            Console.WriteLine("[完整响应] " + result);
        }
        catch (Exception e)
        {
            Console.WriteLine("[异常] 网络请求出错:" + e.Message);
        }

        Console.WriteLine();
        Console.WriteLine(new string('=', 50));
        Console.WriteLine("[完成] 识别执行完毕");
        Console.WriteLine(new string('=', 50));
    }
}

C++

共 2 个示例,按接口动作拆分。

该语言注意事项

跟随当前语言展示
  • ============================================================== 易盾识别 对接示例 — C++版 使用说明 ============================================================== 【一、环境准备】 1. 安装 g++ - Ubuntu 可执行: sudo apt-get install g++ 2. 安装 libcurl 开发库 - Ubuntu 可执行: sudo apt-get install libcurl4-openssl-dev -------------------------------------------------------------- 【二、参数配置】 本 Demo 包含两个独立脚本: - QueryPoints.cpp — 查询账户剩余点数 - RecognizeYidun.cpp — 提交易盾验证码识别 需要重点填写: 1. APPKEY 2. YIDUN_ID 3. YIDUN_REFERER 4. ITEM_ID 固定为 500 5. PROXY / DEVKEY 可按需填写 -------------------------------------------------------------- 【三、运行方式】 1. 查询点数: g++ -std=c++11 QueryPoints.cpp -lcurl -o query_points ./query_points 2. 易盾识别: g++ -std=c++11 RecognizeYidun.cpp -lcurl -o recognize_yidun ./recognize_yidun -------------------------------------------------------------- 【四、常见问题】 Q1:编译时报找不到 curl/curl.h A1:说明 libcurl 开发库未安装,请先安装 libcurl4-openssl-dev Q2:返回的 validate 无法通过验证 A2:请将返回的 validate 进行 urlencode 编码后再尝试 Q3:提示网络请求出错 A3:请检查网络、代理和参数是否过期 -------------------------------------------------------------- 【五、重要注意事项】 1. 查询点数接口不得超过 1 秒 1 次,否则会被拉黑 24 小时 2. 识别接口超时时间为 60 秒,请耐心等待结果 3. 不要将 APPKEY 泄露给他人 4. 请确保账户点数余额充足 ==============================================================

查询点数

QueryPoints.cpp

下载源码
QueryPoints.cpp

C++

#include <curl/curl.h>
#include <cctype>
#include <cstdlib>
#include <iostream>
#include <stdexcept>
#include <string>

/*
=============================================================
  查询账户点数 Demo (C++版)

  功能说明:
  查询账户剩余点数(余额)

  使用方法:
  1. 确保已安装 g++ 和 libcurl 开发库
  2. 将下方的 APPKEY 替换为你自己的用户密钥
  3. 编译运行:
       g++ -std=c++11 QueryPoints.cpp -lcurl -o query_points
       ./query_points
=============================================================
*/

const std::string APPKEY = "你的appkey";
const std::string API_BASE = "http://api.ttocr.com/api";

static size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) {
    size_t total = size * nmemb;
    static_cast<std::string*>(userp)->append(static_cast<char*>(contents), total);
    return total;
}

std::string Trim(const std::string& input) {
    size_t start = 0;
    while (start < input.size() && std::isspace(static_cast<unsigned char>(input[start]))) {
        ++start;
    }

    size_t end = input.size();
    while (end > start && std::isspace(static_cast<unsigned char>(input[end - 1]))) {
        --end;
    }

    return input.substr(start, end - start);
}

std::string StripQuotes(const std::string& input) {
    if (input.size() >= 2 && input.front() == '"' && input.back() == '"') {
        return input.substr(1, input.size() - 2);
    }
    return input;
}

std::string ExtractJsonValue(const std::string& json, const std::string& key) {
    std::string needle = "\"" + key + "\"";
    size_t keyPos = json.find(needle);
    if (keyPos == std::string::npos) {
        return "";
    }

    size_t colon = json.find(':', keyPos + needle.size());
    if (colon == std::string::npos) {
        return "";
    }

    size_t pos = colon + 1;
    while (pos < json.size() && std::isspace(static_cast<unsigned char>(json[pos]))) {
        ++pos;
    }

    bool inString = false;
    bool escaped = false;
    int braceDepth = 0;
    int bracketDepth = 0;
    size_t end = pos;

    for (; end < json.size(); ++end) {
        char ch = json[end];
        if (inString) {
            if (escaped) {
                escaped = false;
                continue;
            }
            if (ch == '\\') {
                escaped = true;
                continue;
            }
            if (ch == '"') {
                inString = false;
            }
            continue;
        }

        if (ch == '"') {
            inString = true;
            continue;
        }
        if (ch == '{') {
            ++braceDepth;
            continue;
        }
        if (ch == '}') {
            if (braceDepth == 0 && bracketDepth == 0) {
                break;
            }
            --braceDepth;
            continue;
        }
        if (ch == '[') {
            ++bracketDepth;
            continue;
        }
        if (ch == ']') {
            --bracketDepth;
            continue;
        }
        if (ch == ',' && braceDepth == 0 && bracketDepth == 0) {
            break;
        }
    }

    return Trim(json.substr(pos, end - pos));
}

bool IsSuccessStatus(const std::string& json) {
    return ExtractJsonValue(json, "status") == "1";
}

std::string HttpGet(const std::string& url) {
    CURL* curl = curl_easy_init();
    if (!curl) {
        throw std::runtime_error("初始化 CURL 失败");
    }

    std::string response;
    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);

    CURLcode code = curl_easy_perform(curl);
    curl_easy_cleanup(curl);

    if (code != CURLE_OK) {
        throw std::runtime_error(curl_easy_strerror(code));
    }

    return response;
}

int main() {
    std::cout << "************************************************************" << std::endl;
    std::cout << "  查询账户点数 Demo (C++版)" << std::endl;
    std::cout << "************************************************************" << std::endl;

    if (APPKEY == "你的appkey") {
        std::cout << "\n[错误] 请先在代码顶部的配置区域填写你的 APPKEY" << std::endl;
        return 1;
    }

    curl_global_init(CURL_GLOBAL_DEFAULT);

    std::cout << "==================================================" << std::endl;
    std::cout << "[查询点数] 正在查询账户剩余点数..." << std::endl;
    std::cout << "==================================================" << std::endl;

    try {
        CURL* encoder = curl_easy_init();
        char* escaped = curl_easy_escape(encoder, APPKEY.c_str(), static_cast<int>(APPKEY.size()));
        std::string url = API_BASE + "/points?appkey=" + (escaped ? escaped : "");
        if (escaped) {
            curl_free(escaped);
        }
        curl_easy_cleanup(encoder);

        std::string result = HttpGet(url);
        if (IsSuccessStatus(result)) {
            std::cout << "[成功] 查询成功!当前可用点数:" << StripQuotes(ExtractJsonValue(result, "points")) << std::endl;
        } else {
            std::cout << "[失败] 查询失败,错误信息:" << StripQuotes(ExtractJsonValue(result, "msg")) << std::endl;
            std::cout << "[提示] 错误状态码:" << ExtractJsonValue(result, "status") << ",请参考错误代码表排查" << std::endl;
        }
        std::cout << "[完整响应] " << result << std::endl;
    } catch (const std::exception& error) {
        std::cout << "[异常] 网络请求出错:" << error.what() << std::endl;
        curl_global_cleanup();
        return 1;
    }

    curl_global_cleanup();

    std::cout << "\n==================================================" << std::endl;
    std::cout << "[完成] 查询执行完毕" << std::endl;
    std::cout << "==================================================" << std::endl;
    return 0;
}

提交识别

RecognizeYidun.cpp

下载源码
RecognizeYidun.cpp

C++

#include <curl/curl.h>
#include <cctype>
#include <cstdlib>
#include <iostream>
#include <stdexcept>
#include <string>

/*
=============================================================
  易盾识别 Demo (C++版)

  功能说明:
  提交易盾验证码识别任务

  使用方法:
  1. 确保已安装 g++ 和 libcurl 开发库
  2. 将下方的 APPKEY / YIDUN_ID / YIDUN_REFERER 替换为你自己的值
  3. 编译运行:
       g++ -std=c++11 RecognizeYidun.cpp -lcurl -o recognize_yidun
       ./recognize_yidun
=============================================================
*/

const std::string APPKEY = "你的appkey";
const std::string YIDUN_ID = "你获取到的易盾id";
const std::string YIDUN_REFERER = "你获取到的referer地址";
const std::string ITEM_ID = "500";
const std::string PROXY = "";
const std::string DEVKEY = "";
const std::string API_BASE = "http://api.ttocr.com/api";

static size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) {
    size_t total = size * nmemb;
    static_cast<std::string*>(userp)->append(static_cast<char*>(contents), total);
    return total;
}

std::string Trim(const std::string& input) {
    size_t start = 0;
    while (start < input.size() && std::isspace(static_cast<unsigned char>(input[start]))) {
        ++start;
    }

    size_t end = input.size();
    while (end > start && std::isspace(static_cast<unsigned char>(input[end - 1]))) {
        --end;
    }

    return input.substr(start, end - start);
}

std::string StripQuotes(const std::string& input) {
    if (input.size() >= 2 && input.front() == '"' && input.back() == '"') {
        return input.substr(1, input.size() - 2);
    }
    return input;
}

std::string ExtractJsonValue(const std::string& json, const std::string& key) {
    std::string needle = "\"" + key + "\"";
    size_t keyPos = json.find(needle);
    if (keyPos == std::string::npos) {
        return "";
    }

    size_t colon = json.find(':', keyPos + needle.size());
    if (colon == std::string::npos) {
        return "";
    }

    size_t pos = colon + 1;
    while (pos < json.size() && std::isspace(static_cast<unsigned char>(json[pos]))) {
        ++pos;
    }

    bool inString = false;
    bool escaped = false;
    int braceDepth = 0;
    int bracketDepth = 0;
    size_t end = pos;

    for (; end < json.size(); ++end) {
        char ch = json[end];
        if (inString) {
            if (escaped) {
                escaped = false;
                continue;
            }
            if (ch == '\\') {
                escaped = true;
                continue;
            }
            if (ch == '"') {
                inString = false;
            }
            continue;
        }

        if (ch == '"') {
            inString = true;
            continue;
        }
        if (ch == '{') {
            ++braceDepth;
            continue;
        }
        if (ch == '}') {
            if (braceDepth == 0 && bracketDepth == 0) {
                break;
            }
            --braceDepth;
            continue;
        }
        if (ch == '[') {
            ++bracketDepth;
            continue;
        }
        if (ch == ']') {
            --bracketDepth;
            continue;
        }
        if (ch == ',' && braceDepth == 0 && bracketDepth == 0) {
            break;
        }
    }

    return Trim(json.substr(pos, end - pos));
}

bool IsSuccessStatus(const std::string& json) {
    return ExtractJsonValue(json, "status") == "1";
}

void AppendFormField(CURL* curl, std::string& postData, const std::string& key, const std::string& value) {
    char* escaped = curl_easy_escape(curl, value.c_str(), static_cast<int>(value.size()));
    if (!postData.empty()) {
        postData += "&";
    }
    postData += key + "=" + (escaped ? escaped : "");
    if (escaped) {
        curl_free(escaped);
    }
}

std::string HttpPost(const std::string& url, const std::string& postData, long timeoutSeconds) {
    CURL* curl = curl_easy_init();
    if (!curl) {
        throw std::runtime_error("初始化 CURL 失败");
    }

    std::string response;
    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    curl_easy_setopt(curl, CURLOPT_POST, 1L);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData.c_str());
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeoutSeconds);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);

    struct curl_slist* headers = NULL;
    headers = curl_slist_append(headers, "Content-Type: application/x-www-form-urlencoded");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

    CURLcode code = curl_easy_perform(curl);
    curl_slist_free_all(headers);
    curl_easy_cleanup(curl);

    if (code != CURLE_OK) {
        throw std::runtime_error(curl_easy_strerror(code));
    }

    return response;
}

int main() {
    std::cout << "************************************************************" << std::endl;
    std::cout << "  易盾识别 Demo (C++版)" << std::endl;
    std::cout << "************************************************************" << std::endl;

    if (APPKEY == "你的appkey") {
        std::cout << "\n[错误] 请先在代码顶部的配置区域填写你的 APPKEY" << std::endl;
        return 1;
    }
    if (YIDUN_ID == "你获取到的易盾id") {
        std::cout << "\n[错误] 请先在代码顶部的配置区域填写 YIDUN_ID 和 YIDUN_REFERER" << std::endl;
        return 1;
    }

    curl_global_init(CURL_GLOBAL_DEFAULT);

    std::cout << "==================================================" << std::endl;
    std::cout << "[易盾识别] 正在提交流程识别任务..." << std::endl;
    std::cout << "==================================================" << std::endl;

    try {
        CURL* encoder = curl_easy_init();
        std::string postData;
        AppendFormField(encoder, postData, "appkey", APPKEY);
        AppendFormField(encoder, postData, "id", YIDUN_ID);
        AppendFormField(encoder, postData, "referer", YIDUN_REFERER);
        AppendFormField(encoder, postData, "itemid", ITEM_ID);
        if (!PROXY.empty()) {
            AppendFormField(encoder, postData, "proxy", PROXY);
        }
        if (!DEVKEY.empty()) {
            AppendFormField(encoder, postData, "devkey", DEVKEY);
        }
        curl_easy_cleanup(encoder);

        std::cout << "[请求参数] id=" << YIDUN_ID << std::endl;
        std::cout << "[请求参数] referer=" << YIDUN_REFERER << std::endl;
        std::cout << "[请求参数] itemid=" << ITEM_ID << std::endl;

        std::string result = HttpPost(API_BASE + "/recognize2", postData, 60L);
        if (IsSuccessStatus(result)) {
            std::cout << "[成功] 识别成功!耗时:" << StripQuotes(ExtractJsonValue(result, "time")) << "ms" << std::endl;
            std::cout << "[识别结果] " << StripQuotes(ExtractJsonValue(result, "data")) << std::endl;
        } else {
            std::cout << "[失败] 识别失败,错误信息:" << StripQuotes(ExtractJsonValue(result, "msg")) << std::endl;
            std::cout << "[提示] 错误状态码:" << ExtractJsonValue(result, "status") << ",请参考错误代码表排查" << std::endl;
            std::cout << "[提示] 如果结果无法通过验证,请将返回的 validate 进行 urlencode 编码后再尝试。" << std::endl;
        }
        std::cout << "\n[完整响应] " << result << std::endl;
    } catch (const std::exception& error) {
        std::cout << "[异常] 网络请求出错:" << error.what() << std::endl;
        curl_global_cleanup();
        return 1;
    }

    curl_global_cleanup();

    std::cout << "\n==================================================" << std::endl;
    std::cout << "[完成] 识别执行完毕" << std::endl;
    std::cout << "==================================================" << std::endl;
    return 0;
}

PHP

共 2 个示例,按接口动作拆分。

该语言注意事项

跟随当前语言展示
  • ============================================================== 易盾识别 对接示例 — PHP版 使用说明 ============================================================== 【一、环境准备】 1. 安装 PHP - Windows用户推荐下载集成环境(任选其一): * XAMPP:https://www.apachefriends.org/download.html * PHPStudy(小皮面板):https://www.xp.cn/ * 独立PHP:https://windows.php.net/download/ - 建议版本:PHP 7.0 或以上(推荐 PHP 7.4+) - 如果使用独立PHP,需要将PHP安装目录添加到系统环境变量Path中 - 安装完成后,打开命令行(cmd 或 PowerShell),输入以下命令验证: php -v 如果显示PHP版本号则安装成功 2. 确认 curl 扩展已启用 - 本Demo依赖PHP的curl扩展来发送HTTP请求 - 执行以下命令检查curl是否启用: php -m | findstr curl 如果显示 "curl" 则已启用 - 如果未启用,需要编辑 php.ini 文件: * 找到 php.ini 文件(执行 php --ini 可以查看路径) * 找到这一行:;extension=curl * 去掉前面的分号,改为:extension=curl * 保存后重启PHP或Apache服务 - 使用XAMPP或PHPStudy等集成环境的用户,curl通常已默认启用 -------------------------------------------------------------- 【二、参数配置】 本Demo包含两个独立脚本: - query_points.php — 查询账户剩余点数 - recognize_yidun.php — 提交易盾验证码识别 请根据需要打开对应的脚本文件,找到顶部的"配置区域",修改以下参数: 1. $APPKEY(必填) - 你的用户密钥,登录平台后在个人中心获取 - 示例:$APPKEY = "abc123def456"; 2. $YIDUN_ID(必填) - 易盾验证码的 id 参数值 - 需要从目标网站通过浏览器开发者工具(F12)抓包获取 - 在网络请求中搜索与易盾相关的请求,找到 id 参数 - 示例:$YIDUN_ID = "84e18cc9ea6a49c7845847d7518b8ddf"; 3. $YIDUN_REFERER(必填) - 易盾验证码请求中的 referer 值 - 同样需要从浏览器开发者工具(F12)抓包获取 - 注意:这个值不一定是你当前访问的页面URL,而是验证码请求头中的referer 4. $ITEM_ID(一般不需要改) - 易盾类型固定填写 500 - 特殊类型请联系客服确认 5. $PROXY(可选) - 如果你需要通过代理IP访问,填写代理地址 - 支持的格式: * http://IP:端口 (普通HTTP代理,若需白名单支持请联系客服) * http://账号:密码@proxy.com:8080 (带认证的HTTP代理) * socks5://127.0.0.1:9888 (SOCKS5代理) - 不需要代理则留空:$PROXY = ""; 6. $DEVKEY(可选) - 开发者密钥,如果你有的话填写,没有则留空 -------------------------------------------------------------- 【三、运行方式】 命令行方式(推荐): 1. 打开命令行(cmd 或 PowerShell) 2. 切换到脚本所在目录: cd 易盾\php 查询点数: 3. 执行:php query_points.php - 仅查询账户剩余点数,确认APPKEY是否正确 易盾识别: 4. 执行:php recognize_yidun.php - 提交易盾验证码识别任务,等待服务器返回结果 5. 识别结果会在控制台中显示 集成到Web项目: - 你可以将脚本中的逻辑复制到你的项目中使用 - 在Web环境中调用时,将 echo 替换为日志记录或API返回 -------------------------------------------------------------- 【四、常见问题】 Q1:运行时提示 "php 不是内部或外部命令" A1:PHP未安装或未添加到系统环境变量,请按"环境准备"步骤操作 Q2:运行时提示 "Call to undefined function curl_init()" A2:curl扩展未启用,请按"环境准备"中的步骤启用curl扩展 Q3:运行时提示 "请先在脚本顶部的配置区域填写你的 APPKEY" A3:你还没有修改 $APPKEY,请用你自己的密钥替换 "你的appkey" Q4:查询点数成功但识别失败 A4:请检查 $YIDUN_ID 和 $YIDUN_REFERER 是否正确,这两个值需要实时抓包获取 Q5:返回的 validate 无法通过目标网站验证 A5:尝试对返回的 validate 值进行 urlencode() 编码后再使用 Q6:识别耗时较长(超过10秒) A6:这是正常现象,易盾验证码识别需要服务器端处理,耐心等待即可 Q7:提示网络请求出错或连接超时 A7:请检查网络连接是否正常,或者尝试使用代理IP -------------------------------------------------------------- 【五、重要注意事项】 1. 查询点数接口有频率限制:不得超过1秒1次,否则会被拉黑24小时 2. 识别接口的超时时间设置为120秒,请耐心等待结果 3. 不要将你的 APPKEY 泄露给他人 4. 请确保你的账户有足够的点数余额 5. PHP版本建议 7.0 以上,必须启用curl扩展 ==============================================================

查询点数

query_points.php

下载源码
query_points.php

PHP

<?php
/**
 * =============================================================
 *   查询账户点数 Demo (PHP版)
 *
 *   功能说明:
 *   查询账户剩余点数(余额)
 *
 *   使用方法:
 *   1. 确保PHP已安装并启用curl扩展
 *   2. 将下方的 APPKEY 替换为你自己的用户密钥
 *   3. 运行脚本:php query_points.php
 * =============================================================
 */

// ======================== 配置区域(请替换为你自己的参数)========================
// 用户密钥,登录平台后获取
$APPKEY = "你的appkey";
// ===============================================================================

// API基础地址
$API_BASE = "http://api.ttocr.com/api";

// ======================== 主流程 ========================
echo str_repeat("*", 60) . "\n";
echo "  查询账户点数 Demo (PHP版)\n";
echo str_repeat("*", 60) . "\n";

// 检查参数是否已配置
if ($APPKEY === "你的appkey") {
    echo "\n[错误] 请先在脚本顶部的配置区域填写你的 APPKEY\n";
    exit(1);
}

echo str_repeat("=", 50) . "\n";
echo "[查询点数] 正在查询账户剩余点数...\n";
echo str_repeat("=", 50) . "\n";

$url = $API_BASE . "/points?appkey=" . urlencode($APPKEY);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$response = curl_exec($ch);

if (curl_errno($ch)) {
    echo "[异常] 网络请求出错:" . curl_error($ch) . "\n";
    curl_close($ch);
    exit(1);
}
curl_close($ch);

$result = json_decode($response, true);
if ($result['status'] == 1) {
    echo "[成功] 查询成功!当前可用点数:" . $result['points'] . "\n";
} else {
    echo "[失败] 查询失败,错误信息:" . $result['msg'] . "\n";
    echo "[提示] 错误状态码:" . $result['status'] . ",请参考错误代码表排查\n";
}
echo "[完整响应] " . json_encode($result, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) . "\n";

echo "\n" . str_repeat("=", 50) . "\n";
echo "[完成] 查询执行完毕\n";
echo str_repeat("=", 50) . "\n";
?>

提交识别

recognize_yidun.php

下载源码
recognize_yidun.php

PHP

<?php
/**
 * =============================================================
 *   易盾识别 Demo (PHP版)
 *
 *   功能说明:
 *   提交易盾验证码识别任务
 *
 *   使用方法:
 *   1. 确保PHP已安装并启用curl扩展
 *   2. 将下方的 APPKEY 替换为你自己的用户密钥
 *   3. 将 YIDUN_ID 替换为你获取到的易盾验证码 id 参数
 *   4. 将 YIDUN_REFERER 替换为你获取到的 referer 值
 *   5. 运行脚本:php recognize_yidun.php
 * =============================================================
 */

// ======================== 配置区域(请替换为你自己的参数)========================
// 用户密钥,登录平台后获取
$APPKEY = "你的appkey";

// 易盾验证码的 id 参数值(从目标网站抓包获取)
$YIDUN_ID = "你获取到的易盾id";

// 易盾验证码的 referer 值(从目标网站抓包获取,注意不是当前页面的URL)
$YIDUN_REFERER = "你获取到的referer地址";

// 项目类型,易盾固定填写 500(特殊类型请联系客服)
$ITEM_ID = 500;

// 可选参数:代理IP(格式示例:http://IP:端口,若需白名单支持请联系客服。http://账号:密码@proxy.com:8080 或 socks5://127.0.0.1:9888)
$PROXY = "";

// 可选参数:开发者密钥(如果有的话填写)
$DEVKEY = "";
// ===============================================================================

// API基础地址
$API_BASE = "http://api.ttocr.com/api";

// ======================== 主流程 ========================
echo str_repeat("*", 60) . "\n";
echo "  易盾识别 Demo (PHP版)\n";
echo str_repeat("*", 60) . "\n";

// 检查参数是否已配置
if ($APPKEY === "你的appkey") {
    echo "\n[错误] 请先在脚本顶部的配置区域填写你的 APPKEY\n";
    exit(1);
}
if ($YIDUN_ID === "你获取到的易盾id") {
    echo "\n[错误] 请先在脚本顶部的配置区域填写 YIDUN_ID 和 YIDUN_REFERER\n";
    exit(1);
}

echo str_repeat("=", 50) . "\n";
echo "[易盾识别] 正在提交易盾识别任务...\n";
echo str_repeat("=", 50) . "\n";

$url = $API_BASE . "/recognize2";

// 构建POST请求数据
$postData = array(
    'appkey' => $APPKEY,
    'id' => $YIDUN_ID,
    'referer' => $YIDUN_REFERER,
    'itemid' => $ITEM_ID,
);
// 如果设置了代理,则添加代理参数
if (!empty($PROXY)) {
    $postData['proxy'] = $PROXY;
}
// 如果设置了开发者密钥,则添加
if (!empty($DEVKEY)) {
    $postData['devkey'] = $DEVKEY;
}

echo "[请求参数] id=" . $YIDUN_ID . "\n";
echo "[请求参数] referer=" . $YIDUN_REFERER . "\n";
echo "[请求参数] itemid=" . $ITEM_ID . "\n";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 120); // 识别可能需要较长时间

$response = curl_exec($ch);

if (curl_errno($ch)) {
    echo "[异常] 网络请求出错:" . curl_error($ch) . "\n";
    curl_close($ch);
    exit(1);
}
curl_close($ch);

$result = json_decode($response, true);
if ($result['status'] == 1) {
    echo "[成功] 识别成功!耗时:" . $result['time'] . "ms\n";
    echo "[识别结果] " . $result['data'] . "\n";
} else {
    echo "[失败] 识别失败,错误信息:" . $result['msg'] . "\n";
    echo "[提示] 错误状态码:" . $result['status'] . ",请参考错误代码表排查\n";
}
echo "\n[完整响应] " . json_encode($result, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) . "\n";

echo "\n" . str_repeat("=", 50) . "\n";
echo "[完成] 识别执行完毕\n";
echo str_repeat("=", 50) . "\n";
?>