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

)

トークンを使用して 2 番目のリクエストを実行していますが、result = NeedToken が返されます。今トークンを送信しているので、成功するはずです。

ドキュメントに次のように記載されていることに気付きました。

enwiki_session前の要求から返されたように、ボディに確認トークン、ヘッダーにセッション Cookie (例: ) を使用して、POST でログイン要求を送信します。

私はそれについて完全に明確ではありません。ヘッダーでセッション Cookie を送信していないため、問題が発生していると想定しています。2 番目のリクエストの前に Cookie を設定する必要がありますか?

4

2 に答える 2

1

古い話題ですが、興味のある方にはお答えします :) 実際には、Cookie をファイルに保管し、2 回目のログイン試行で再度使用する必要があります。そんな感じ :

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

これを実行すると、今回は成功するはずです:)

于 2015-06-24T12:12:44.293 に答える
1

はい、正常にログインするには、すべての Set-Cookie ヘッダーを処理する必要があります。ドキュメントはこれについて非常に具体的です:

このリクエストは、HTTP ヘッダー (Set-Cookie: enwikiSession=17ab96bd8ffbe8ca58a78657a918558e; path=/; domain=.wikipedia.org; HttpOnly) でセッション Cookie も返します。フレームワークがこれを行わない場合は、2 番目のリクエストでこれを返す必要があります。自動的

action=login リクエストが成功すると、ログインしていると見なされるために必要な Cookie が設定されます。多くのフレームワークは、これらの Cookie を自動的に処理します (cURL の cookiejar など)。もしそうなら、ぜひこれを利用してください。そうでない場合、最も信頼できる方法は、HTTP 応答の Set-Cookie ヘッダーからそれらを解析することです。

于 2015-04-04T21:33:48.867 に答える