Как войти с помощью mediawiki API?

$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
        )

)

Я использую токен для второго запроса, но получаю результат = NeedToken. Это должно быть успешно, так как я отправляю токен сейчас.

Я заметил, что в документации говорится:

Отправьте запрос на вход с помощью POST, с токеном подтверждения в теле и файлом cookie сеанса (например, enwiki_session) в заголовке, возвращенным из предыдущего запроса.

Я не совсем понимаю это. Я предполагаю, что у меня проблемы, потому что я не отправляю файл cookie сеанса в заголовке. Нужно ли устанавливать куки перед вторым запросом?


person ionfish    schedule 12.03.2013    source источник


Ответы (2)


Да, вам необходимо обработать все заголовки Set-Cookie для успешного входа в систему. Документация очень конкретна по этому вопросу:

Этот запрос также вернет файл cookie сеанса в заголовке HTTP (Set-Cookie: enwikiSession=17ab96bd8ffbe8ca58a78657a918558e; path=/; domain=.wikipedia.org; HttpOnly), который вы должны вернуть для второго запроса, если ваш фреймворк этого не делает. автоматически

Успешный запрос action=login установит файлы cookie, необходимые для входа в систему. Многие фреймворки будут автоматически обрабатывать эти файлы cookie (например, cookiejar в cURL). Если да, то обязательно воспользуйтесь этим. Если нет, то самый надежный метод — проанализировать их из заголовков Set-Cookie ответа HTTP.

person Intracer    schedule 04.04.2015

Это старая тема, но я отвечу тем, кому это интересно :) На самом деле вам нужно хранить свои куки в файле и использовать их снова при второй попытке входа в систему. Что-то подобное :

$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); 

При запуске этого вы должны увидеть успех на этот раз :)

person Ise    schedule 24.06.2015
comment
Но как сохранить в файл cookie, чтобы после этого оставаться в системе? - person josh123a123; 26.07.2016