<?php
/**
 * =============================================================
 *   极验识别 Demo (PHP版)
 *
 *   功能说明：
 *   提交极验验证码识别任务（支持三代/四代）
 *   极验识别为异步流程：先提交任务获取resultid，再轮询查询结果
 *
 *   使用方法：
 *   1. 确保PHP已安装并启用curl扩展
 *   2. 将下方的配置参数替换为你自己的值
 *   3. 运行脚本：php recognize_geetest.php
 * =============================================================
 */

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

// 极验gt值（三代为gt值，四代为captcha_id值）
$GT = "你获取到的gt值";

// challenge值（三代必填，每次只能使用一次；四代无需传此参数，留空即可）
$CHALLENGE = "";

// 项目类型（请参照项目价格表，不同类型对应不同的itemid）
$ITEM_ID = 0;

// 验证码所在的页面URL（可选，部分网站需要填写）
$REFERER = "";

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

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

// 可选参数：SDK版本（特殊版本为2，默认为1）
$SDK = "";

// 可选参数：对接模式（按次计费:0，包月计费:1，默认为0。包月用户必填）
$GIVEN = "";

// 可选参数：特殊网站极验域名（如api-na.geetest.com，不要带http://和/，只需域名）
$HOST_PARAM = "";

// 可选参数：User-Agent（适用于某些检验UA的网站，只支持传入安卓ua）
$USER_AGENT = "";
// ===============================================================================

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

// 轮询配置
$POLL_INTERVAL = 2;    // 轮询间隔（秒），不得低于1秒
$MAX_POLL_TIME = 60;   // 最大等待时间（秒）

/**
 * 发送POST请求
 */
function httpPost($url, $postData) {
    $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, 30);
    $response = curl_exec($ch);
    if (curl_errno($ch)) {
        $error = curl_error($ch);
        curl_close($ch);
        throw new Exception("网络请求出错：" . $error);
    }
    curl_close($ch);
    return json_decode($response, true);
}

echo str_repeat("*", 60) . "\n";
echo "  极验识别 Demo (PHP版)\n";
echo str_repeat("*", 60) . "\n";

if ($APPKEY === "你的appkey") {
    echo "\n[错误] 请先在脚本顶部的配置区域填写你的 APPKEY\n";
    exit(1);
}
if ($GT === "你获取到的gt值") {
    echo "\n[错误] 请先在脚本顶部的配置区域填写 GT 值\n";
    exit(1);
}
if ($ITEM_ID === 0) {
    echo "\n[错误] 请先在脚本顶部的配置区域填写 ITEM_ID（项目类型）\n";
    exit(1);
}

try {
    // ========== 步骤1：提交极验识别任务 ==========
    echo str_repeat("=", 50) . "\n";
    echo "[提交任务] 正在提交极验识别任务...\n";
    echo str_repeat("=", 50) . "\n";

    $postData = [
        "appkey" => $APPKEY,
        "gt" => $GT,
        "itemid" => $ITEM_ID,
    ];
    if (!empty($CHALLENGE)) { $postData["challenge"] = $CHALLENGE; }
    if (!empty($REFERER)) { $postData["referer"] = $REFERER; }
    if (!empty($PROXY)) { $postData["proxy"] = $PROXY; }
    if (!empty($DEVKEY)) { $postData["devkey"] = $DEVKEY; }
    if (!empty($SDK)) { $postData["sdk"] = $SDK; }
    if (!empty($GIVEN)) { $postData["given"] = $GIVEN; }
    if (!empty($HOST_PARAM)) { $postData["host"] = $HOST_PARAM; }
    if (!empty($USER_AGENT)) { $postData["userAgent"] = $USER_AGENT; }

    echo "[请求参数] gt=" . $GT . "\n";
    echo "[请求参数] itemid=" . $ITEM_ID . "\n";

    $submitResult = httpPost($API_BASE . "/recognize", $postData);
    echo "[提交响应] " . json_encode($submitResult, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) . "\n";

    if (!isset($submitResult["status"]) || $submitResult["status"] != 1 || !isset($submitResult["resultid"])) {
        echo "[失败] 任务提交失败，错误信息：" . ($submitResult["msg"] ?? "未知") . "\n";
        exit(1);
    }

    $resultid = $submitResult["resultid"];
    echo "[成功] 任务提交成功！resultid=" . $resultid . "\n";



    // ========== 步骤2：轮询查询识别结果 ==========
    echo "\n" . str_repeat("=", 50) . "\n";
    echo "[查询结果] 正在轮询识别结果...\n";
    echo "[查询结果] 轮询间隔：" . $POLL_INTERVAL . "秒，最大等待：" . $MAX_POLL_TIME . "秒\n";
    echo str_repeat("=", 50) . "\n";

    $startTime = time();
    while (true) {
        $elapsed = time() - $startTime;
        if ($elapsed > $MAX_POLL_TIME) {
            echo "[超时] 已等待" . $MAX_POLL_TIME . "秒，识别超时，请稍后重试\n";
            break;
        }
        sleep($POLL_INTERVAL);
        $queryResult = httpPost($API_BASE . "/results", [
            "appkey" => $APPKEY,
            "resultid" => $resultid
        ]);
        $elapsed = time() - $startTime;
        if (isset($queryResult["status"]) && $queryResult["status"] == 1) {
            echo "\n[成功] 识别成功！耗时：" . ($queryResult["time"] ?? "未知") . "ms\n";
            echo "[识别结果] " . json_encode($queryResult["data"] ?? [], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) . "\n";
            echo "\n[完整响应] " . json_encode($queryResult, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) . "\n";
            break;
        } else {
            echo "[等待中] 第" . $elapsed . "秒 - " . ($queryResult["msg"] ?? "正在识别中...") . "\n";
        }
    }
} catch (Exception $e) {
    echo "[异常] " . $e->getMessage() . "\n";
}

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