You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PHP Curl获取登录令牌异常:获取值与实际不符求排查

问题排查与修复方案

你的代码存在几个关键问题,直接导致获取的logintoken与实际页面不一致,逐一说明:

  • 函数拼写错误导致请求地址失效:
    代码里写了url_setopt($ch, CURLOPT_URL, "..."),正确的函数名是curl_setopt,这个错误会让Curl使用默认空URL发起请求,根本没拿到目标页面的内容。

  • 未处理会话Cookie:
    Moodle的logintoken和用户会话是绑定的,每次新会话都会生成新令牌。Curl默认不会保存和复用Cookie,你获取的令牌和浏览器里的不属于同一个会话,自然不匹配。必须开启Cookie的保存与复用。

  • 缺少浏览器标识(User-Agent):
    包括Moodle在内的很多网站会验证请求的User-Agent,缺少这个标识可能返回不同内容,甚至被判定为非浏览器请求,导致令牌生成逻辑异常。

  • 没有提取令牌的逻辑:
    你只是直接输出了请求结果$answer,但没有从返回的HTML里解析出logintoken赋值给$vlLoginToken,表单里的$vlLoginToken根本没拿到正确值。


修正后的完整代码

<?php
// 初始化Curl句柄
$ch = curl_init();

// 设置Cookie保存路径(确保该目录有写入权限)
$cookieFile = __DIR__ . '/cookie.txt';

// 配置Curl核心选项
curl_setopt($ch, CURLOPT_URL, "https://grprek.jeddahknowledgeschool.com/login/index.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 将返回内容存入变量而非直接输出
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); // 保存会话Cookie
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); // 读取已保存的Cookie
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"); // 模拟浏览器标识
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 自动跟随页面跳转

// 执行请求
$answer = curl_exec($ch);

// 捕获Curl错误
if (curl_error($ch)) {
    die('Curl错误: ' . curl_error($ch));
}

// 关闭Curl句柄,释放资源
curl_close($ch);

// 从HTML中提取logintoken(适配Moodle的令牌格式)
preg_match('/name="logintoken" value="([^"]+)"/', $answer, $matches);
$vlLoginToken = $matches[1] ?? '';

// 以下变量需根据实际业务赋值
$virtualLink = "https://grprek.jeddahknowledgeschool.com/login/index.php";
$username = "你的用户名";
$vlPassword = "你的密码";
?>

<form action="<?php echo $virtualLink; ?>" method="post" target="_new" id="login">
    <input name="logintoken" type="hidden" value="<?php echo $vlLoginToken;?>" />
    <input style="background-color: transparent;" id="username" name="username" type="hidden" value="<?php echo $username;?>" >
    <input id="password" name="password" type="hidden" value="<?php echo $vlPassword;?>">
    <input style=" width:100px; height:100px;  margin-right:auto; margin-left:auto; display:block; border:none; background-color: transparent;" 
        src="" 
        type="image" 
        alt="turnitin" 
        title="turnitin">
</form>

额外注意事项

  • 确保cookie.txt所在目录有写入权限,否则Cookie无法正常保存。
  • 正则匹配规则可能需要根据目标Moodle版本的HTML结构调整,如果页面令牌的标签格式有变化,要同步修改正则表达式。
  • 如果目标网站有反爬机制,可能还需要添加Accept-Language、Referer等请求头,或处理验证码等额外验证步骤。

内容的提问来源于stack exchange,提问作者Haya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:03:34