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

/**
 * =============================================================
 *   CSDN识别 Demo (Java版)
 *
 *   功能说明：
 *   提交CSDN验证码识别任务（目前支持文字点选）
 *
 *   使用方法：
 *   1. 将下方的 APPKEY 替换为你自己的用户密钥
 *   2. 将 CSDN_COOKIE 替换为你获取到的 waf_captcha_marker cookie值
 *   3. 编译运行：javac -encoding UTF-8 RecognizeCsdn.java && java RecognizeCsdn
 * =============================================================
 */
public class RecognizeCsdn {

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

    // CSDN验证码的 waf_captcha_marker cookie字段值（从浏览器抓包获取）
    private static final String CSDN_COOKIE = "你获取到的cookie";

    // 项目类型，CSDN固定填写 600（特殊类型请联系客服）
    private static final int ITEM_ID = 600;

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

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

    // 可选参数：User-Agent（如果需要的话填写）
    private static final String UA = "";
    // ===============================================================================

    // 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();
    }

    /**
     * 提交CSDN验证码识别任务
     * 接口地址：POST http://api.ttocr.com/api/recognize2
     * 必填参数：appkey, cookie, itemid(固定600)
     * 可选参数：proxy, devkey, ua
     * 重要提示：如果提交结果失败无法通过，请将结果URL编码后提交
     */
    public static void main(String[] args) {
        System.out.println("************************************************************");
        System.out.println("  CSDN识别 Demo (Java版)");
        System.out.println("************************************************************");

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

        System.out.println("==================================================");
        System.out.println("[CSDN识别] 正在提交CSDN识别任务...");
        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("&cookie=").append(URLEncoder.encode(CSDN_COOKIE, "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"));
            }
            // 如果设置了UA，则添加
            if (UA != null && !UA.isEmpty()) {
                postData.append("&ua=").append(URLEncoder.encode(UA, "UTF-8"));
            }
            System.out.println("[请求参数] cookie=" + CSDN_COOKIE.substring(0, Math.min(20, CSDN_COOKIE.length())) + "...");
            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("==================================================");
    }
}

