package main

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

/*
=============================================================
  CSDN识别 Demo (Go版)

  功能说明：
  提交CSDN验证码识别任务（目前支持文字点选）

  使用方法：
  1. 确保已安装 Go 1.18 或更高版本
  2. 将下方的 APPKEY 替换为你自己的用户密钥
  3. 将 CSDN_COOKIE 替换为你获取到的 waf_captcha_marker cookie 值
  4. 运行脚本：go run recognize_csdn.go
=============================================================
*/

const (
	APPKEY       = "你的appkey"
	CSDNCookie   = "你获取到的cookie"
	ITEMID       = "600"
	PROXY        = ""
	DEVKEY       = ""
	UA           = ""
	APIBase      = "http://api.ttocr.com/api"
	RequestDelay = 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("  CSDN识别 Demo (Go版)")
	fmt.Println("************************************************************")

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

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

	values := url.Values{}
	values.Set("appkey", APPKEY)
	values.Set("cookie", CSDNCookie)
	values.Set("itemid", ITEMID)
	if PROXY != "" {
		values.Set("proxy", PROXY)
	}
	if DEVKEY != "" {
		values.Set("devkey", DEVKEY)
	}
	if UA != "" {
		values.Set("ua", UA)
	}

	displayCookie := CSDNCookie
	if len(displayCookie) > 20 {
		displayCookie = displayCookie[:20] + "..."
	}
	fmt.Printf("[请求参数] cookie=%s\n", displayCookie)
	fmt.Printf("[请求参数] itemid=%s\n", ITEMID)

	result, err := postForm(APIBase+"/recognize2", values, RequestDelay)
	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("[提示] 如果结果无法通过验证，请将返回的 data 进行 urlencode 后再提交。")
	}
	fmt.Printf("\n[完整响应] %s\n", string(pretty))

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