如何使用mediawiki API登录?

时间:2013-03-12 22:57:25

标签: api curl mediawiki wiki wikipedia

$ch=curl_init();
$postfield = "action=login&lgname=d&lgpassword=Password&format=json";
$url = "http://wiki.signa.com/api.php"; //url to wiki's api

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfield);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);


$output = json_decode(curl_exec($ch));
curl_close($ch);

print_r($output);
$token = $output->login->token;
$session = $output->login->sessionid;

$ch=curl_init();

$postfield = "action=login&lgname=d&lgpassword=Password&lgtoken={$token}";
$url = "http://wiki.signa.com/api.php"; //url to wiki's api

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfield);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$output = curl_exec($ch);
curl_close($ch);

print_r($output);
die;

第一个请求我得到了这个对象:

stdClass Object
(
    [login] => stdClass Object
        (
            [result] => NeedToken
            [token] => ad61fadb829e5cd44b0062463b7cc2d2
            [cookieprefix] => wikisign_mediawiki
            [sessionid] => ebb892881eed27554161234916d00480
        )

)

我正在使用令牌执行第二次请求,但我得到result = NeedToken。它应该是成功的,因为我现在正在发送令牌。

我注意到文档说:

  

使用POST发送登录请求,正文中包含确认令牌,并且从上一个请求返回的标题中包含会话Cookie(例如enwiki_session)。

我对此并不完全清楚。我假设我遇到了问题,因为我没有在标题中发送会话cookie。我是否需要在第二次请求之前设置cookie?

2 个答案:

答案 0 :(得分:1)

是的,您需要处理所有Set-Cookie标头才能成功登录。 文档是very specific

  

此请求还将在HTTP标头中返回会话cookie   (Set-Cookie:enwikiSession = 17ab96bd8ffbe8ca58a78657a918558e; path = /;   域= .wikipedia.org; HttpOnly)你必须返回   第二个请求,如果你的框架没有自动执行此操作

     

成功的操作=登录请求将设置需要的cookie   考虑登录。许多框架将处理这些cookie   自动(例如cURL中的cookiejar)。如果是这样,一定要   利用这一点。如果没有,最可靠的方法是解析   它们来自HTTP响应的Set-Cookie标头。

答案 1 :(得分:1)

这是一个古老的主题,但我会回答那些感兴趣的人:) 实际上,您需要将cookie保存在文件中,并在第二次尝试登录时再次使用它们。 这样的事情:

$path_cookie = 'connexion_temporaire.txt';
if (!file_exists($path_cookie)) touch($path_cookie); 


$postfields = array(
        'action' => 'login',
        'format'=> 'json',
        'lgname' => $login,
        'lgpassword' => $pass
);

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $lienTestWiki);
curl_setopt($curl, CURLOPT_COOKIESESSION, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postfields);
curl_setopt($curl, CURLOPT_COOKIEJAR, $path_cookie); // you put your cookie in the file
$connexion=curl_exec($curl);
$json_connexion = json_decode($connexion, true);
$tokenConnexion=$json_connexion['login']['token']; // you take the token and keep it in a var for your second login

// /!\ don't close the curl conection or initialize a new one or your session id will change !

$postfields = array(
        'action' => 'login',
        'format'=> 'json',
        'lgtoken' => $tokenConnexion,
        'lgname' => $login,
        'lgpassword' => $pass

);


curl_setopt($curl, CURLOPT_URL, $lienTestWiki);
curl_setopt($curl, CURLOPT_COOKIESESSION, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postfields);
curl_setopt($curl, CURLOPT_COOKIEFILE, $path_cookie); //get the previous cookie
$connexionToken=curl_exec($curl);

var_dump($connexionToken); 

运行时,你应该看到这次成功:)