使用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
相关产品推荐
相关产品推荐

