本地MediaWiki使用PHP脚本登录机器人账号时遭遇会话超时错误
本地MediaWiki使用PHP脚本登录机器人账号时遭遇会话超时错误
嘿,这个问题我太熟了!之前帮同事排查过几乎一模一样的MediaWiki API登录问题,报错说会话超时,本质上是你的两次API请求(拿token和登录)没有共享会话状态——默认情况下file_get_contents不会保存和携带Cookie,MediaWiki就会把这两次请求当成完全无关的会话,自然就判定“会话超时”了。
咱们直接来改代码解决问题,推荐用cURL来处理请求,因为它能轻松管理会话Cookie,比file_get_contents靠谱多了。下面是修改后的完整可运行代码:
<?php // Set your MediaWiki API endpoint $apiUrl = 'http://localhost/sportwiki/api.php'; // Set your login credentials $username = 'A.mov09@BulkPages'; $password = '0oa8kohha41hl2uq690cnlfpvbgk6kuf'; // 临时Cookie文件路径,确保PHP有读写权限 $cookieFile = 'temp_mediawiki_cookie.txt'; // 先确保Cookie文件存在且可写 if (!file_exists($cookieFile)) { touch($cookieFile); chmod($cookieFile, 0600); // 设为仅当前用户可读写,更安全 } // Step 1: 获取登录Token $loginToken = getLoginToken($apiUrl, $cookieFile); // Step 2: 执行登录 login($apiUrl, $username, $password, $loginToken, $cookieFile); echo "登录成功!"; // 封装cURL请求的工具函数,复用Cookie function makeCurlRequest($apiUrl, $params, $cookieFile, $isPost = false) { $ch = curl_init(); if ($isPost) { curl_setopt($ch, CURLOPT_URL, $apiUrl); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params)); } else { $url = $apiUrl . '?' . http_build_query($params); curl_setopt($ch, CURLOPT_URL, $url); } // 关键:处理Cookie,保存和携带会话信息 curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); // 禁用SSL验证(本地环境可以开,生产环境别用) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 返回响应内容 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); if (curl_errno($ch)) { die("cURL请求出错:" . curl_error($ch)); } curl_close($ch); return json_decode($response, true); } // 获取登录Token function getLoginToken($apiUrl, $cookieFile) { $params = [ 'action' => 'query', 'meta' => 'tokens', 'type' => 'login', 'format' => 'json' ]; $data = makeCurlRequest($apiUrl, $params, $cookieFile); return $data['query']['tokens']['logintoken']; } // 执行登录操作 function login($apiUrl, $username, $password, $loginToken, $cookieFile) { $params = [ 'action' => 'login', 'lgname' => $username, 'lgpassword' => $password, 'lgtoken' => $loginToken, 'format' => 'json' ]; $data = makeCurlRequest($apiUrl, $params, $cookieFile, true); // 登录用POST请求更规范 // 处理登录结果 if ($data['login']['result'] === 'Success') { echo "登录成功,用户名:" . $data['login']['lgusername'] . "\n"; } else { die("登录失败:" . $data['login']['reason']); } } ?>
另外给你几个额外的排查点,以防还有问题:
- 先确认
temp_mediawiki_cookie.txt所在的目录PHP有读写权限,不然Cookie存不住还是会报错 - 去MediaWiki的LocalSettings.php里,把你的机器人账号加到
$wgBotAccounts数组里(比如$wgBotAccounts = ['A.mov09@BulkPages'];),这样账号能跳过CAPTCHA和一些登录限制 - 检查MediaWiki的会话超时设置
$wgSessionTimeout,本地环境默认值就够用,要是改得特别短可能会触发超时 - 直接在浏览器里访问你的API地址
http://localhost/sportwiki/api.php,确认能正常加载API的说明页面,排除URL写错的问题
备注:内容来源于stack exchange,提问作者Artem Movchan
相关产品推荐
相关产品推荐

