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

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

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

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 CSDN_COOKIE: &str = "你获取到的cookie";
const ITEM_ID: &str = "600";
const PROXY: &str = "";
const DEVKEY: &str = "";
const UA: &str = "";
const API_BASE: &str = "http://api.ttocr.com/api";

fn recognize_csdn() -> 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("cookie", CSDN_COOKIE.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());
    }
    if !UA.is_empty() {
        params.insert("ua", UA.to_string());
    }

    let display_cookie = if CSDN_COOKIE.chars().count() > 20 {
        format!("{}...", &CSDN_COOKIE.chars().take(20).collect::<String>())
    } else {
        CSDN_COOKIE.to_string()
    };

    println!("[请求参数] cookie={}", display_cookie);
    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!("[提示] 如果结果无法通过验证，请将返回的 data 进行 urlencode 后再提交。");
    }

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

    Ok(result)
}

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

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

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

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

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