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

本地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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 11:15:26