Php 如何使用API登录或clientlogin自动登录mediawiki?

Php 如何使用API登录或clientlogin自动登录mediawiki?,php,curl,cookies,mediawiki,mediawiki-api,Php,Curl,Cookies,Mediawiki,Mediawiki Api,我能找到的大多数指南早于1.27版。对如何设置cookies感到困惑?如何获取sessionid? 这是我的代码,但没有正确获取登录令牌。 系统信息: 软件版本 MediaWiki 1.28.2 PHP 5.6.30 MariaDB 10.1.21 <?php namespace mediawiki; // Start session session_start(); /** * How to log in mediawiki using PHP cURL? * --------

我能找到的大多数指南早于1.27版。对如何设置cookies感到困惑?如何获取sessionid?
这是我的代码,但没有正确获取登录令牌。
系统信息:
软件版本
MediaWiki 1.28.2
PHP 5.6.30
MariaDB 10.1.21

<?php
namespace mediawiki;


// Start session
session_start();

/**
 * How to log in mediawiki using PHP cURL?
 * -------------------------------------------------
 */

//set login username password which already in your mediawiki database
$username = 'abc';
$password = '123';

//setup url
$Root = 'localhost/mediawiki';
$API_Location = "${Root}/api.php";

//setup cookie
$CookieFilePath = tempnam("/tmp", "TMP0");
$expire = 60*60*24*14 + time();
$CookiePrefix = 'theprefix';
$Domain = 'localhost';

// set variables to use in curl_setopts
$PostFields = "action=query&meta=tokens&type=login&format=json";

// first http post to sign in to MediaWiki
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "$API_Location");
curl_setopt($ch, CURLOPT_TIMEOUT, 500);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/x-www-form-urlencoded',
    'Content-Length: ' .strlen($PostFields))
);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "$PostFields");

curl_setopt($ch, CURLOPT_COOKIEJAR, $CookieFilePath);
curl_setopt($ch, CURLOPT_COOKIEFILE, $CookieFilePath);

$Result = curl_exec($ch);
if(curl_exec($ch) === false) echo '<br>Curl error: ' . curl_error($ch).'<br>';
curl_close($ch); // curl closed

$ResultSerialized = json_decode($Result,true);
$Token = $ResultSerialized["query"]["tokens"]["logintoken"];

// cookie must be set using session id from first response
$_SESSION["logintoken"]=$Token;
//How can I get sessionid?
$sessionid=session_id();
$_SESSION["sessionid"] =$sessionid;

setcookie("${CookiePrefix}_Session",$sessionid , $expire, '/', $Domain);
setcookie("${CookiePrefix}UserName",$username,$expire,'/',$Domain);
setcookie("${CookiePrefix}Token", $_SESSION["logintoken"], $expire, '/', $Domain);

// second http post to finish sign in
$ch = curl_init();
$PostFields="action=login&lgname=${username}&lgpassword=${password}&lgtoken=${Token}&format=json";
curl_setopt($ch, CURLOPT_URL, "$API_Location");
curl_setopt($ch, CURLOPT_TIMEOUT, 500);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
       'Content-Type: application/x-www-form-urlencoded',
        'Content-Length: ' .strlen($PostFields))
);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "$PostFields");
curl_setopt($ch, CURLOPT_COOKIE, "${CookiePrefix}_session=$sessionid");

curl_setopt($ch, CURLOPT_COOKIEJAR, $CookieFilePath);
curl_setopt($ch, CURLOPT_COOKIEFILE, $CookieFilePath);

$Result = curl_exec($ch);
if(curl_exec($ch) === false) echo '<br>Curl error: ' . curl_error($ch).'<br>';
curl_close($ch); // curl closed
$ResultSerialized = json_decode($Result,true);

// set persistent cookies
//$LgToken = $ResultSerialized["query"]["tokens"]["logintoken"];
$LgUserID = $ResultSerialized["login"]["lguserid"];
$LgUserName = $ResultSerialized["login"]["lgusername"];
$lgstatus=$ResultSerialized["login"]["result"];
var_dump($lgstatus);

setcookie("${CookiePrefix}UserName", $LgUserName, $expire, '/', $Domain);
setcookie("${CookiePrefix}UserID", $LgUserID, $expire, '/', $Domain);
//setcookie("${CookiePrefix}Token", $Token, $expire, '/', $Domain);

// Delete cURL cookie
unlink($CookieFilePath);

?>

我还尝试通过postman使用clientlogin,发布请求,就像mediawiki.org/wiki/API:Login上的示例一样,但结果是:“authmanager authn no primary”

参考:


    • 要登录,您需要首先获得一个
      logintoken

      $query_string = '?action=query&meta=tokens&type=login&format=json';
      ...// sparing curl_exec details
      $ResultSerialized = json_decode($Result, true);
      $Token = $ResultSerialized['query']['tokens']['logintoken'];
      
      然后,发布
      logintoken
      以及用户名和密码:

      $post_data = "?action=login&lgname=$username&lgpassword=password&logintoken=$Token&format=json";
      

      你应该登录!只要在所有请求之间保持相同的cookie会话,您就应该能够使用登录操作。

      要登录,您需要首先获得一个
      logintoken

      $query_string = '?action=query&meta=tokens&type=login&format=json';
      ...// sparing curl_exec details
      $ResultSerialized = json_decode($Result, true);
      $Token = $ResultSerialized['query']['tokens']['logintoken'];
      
      然后,发布
      logintoken
      以及用户名和密码:

      $post_data = "?action=login&lgname=$username&lgpassword=password&logintoken=$Token&format=json";
      

      你应该登录!只要在所有请求之间保持相同的cookie会话,就应该能够使用登录操作。

      我知道这很旧,但我正在尝试使用ASP.net/C做同样的事情。我很难理解怎么做。我昨天发布了此消息:如果不允许在类似主题上发布我的链接,我深表歉意。我收到以下错误响应:
      “error”:{“code”:“mustpostparams”,“info”:“在查询字符串中找到了以下参数,但必须在帖子正文中:lgpassword.”
      @Yehuda错误消息解释了问题:您需要将POST数据放入POST正文中。这将根据您使用的语言或HTTP库的不同而有所不同;搜索如何为您正在使用的内容指定POST数据。我就是这么做的,我使用了Postman(API客户端/测试仪)。仍然总是出现一些错误[无效的令牌-当我刚得到令牌时]。最后我找到了这个节点包“nodemw”,一切正常。我想这对我来说还是个谜。。。我知道这很旧,但我正在尝试用ASP.net/C做同样的事情。我很难理解怎么做。我昨天发布了此消息:如果不允许在类似主题上发布我的链接,我深表歉意。我收到以下错误响应:
      “error”:{“code”:“mustpostparams”,“info”:“在查询字符串中找到了以下参数,但必须在帖子正文中:lgpassword.”
      @Yehuda错误消息解释了问题:您需要将POST数据放入POST正文中。这将根据您使用的语言或HTTP库的不同而有所不同;搜索如何为您正在使用的内容指定POST数据。我就是这么做的,我使用了Postman(API客户端/测试仪)。仍然总是出现一些错误[无效的令牌-当我刚得到令牌时]。最后我找到了这个节点包“nodemw”,一切正常。我想这对我来说还是个谜。。。