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("==================================================")
}
