2013-03-12 114 views
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; 

與第一請求我得到這個對象:如何使用mediawiki API登錄?

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

) 

我使用的令牌做了第二次請求,但我得到的結果= NeedToken。因爲我現在發送令牌應該是成功的。

我注意到了文件說:

發送的登錄請求與POST,有身體的確認標誌和標頭中的會話cookie(例如enwiki_session)從之前的請求返回。

我對此並不完全清楚。我假設我遇到了問題,因爲我沒有在頭中發送會話cookie。我需要在第二次請求之前設置cookie嗎?

回答

1

是的,您需要處理所有Set-Cookie Headers才能成功登錄。 文檔是very specific在此:

這個請求也將在HTTP報頭 返回的會話cookie(設置Cookie:enwikiSession = 17ab96bd8ffbe8ca58a78657a918558e;路徑= /; 域= .wikipedia.org;僅Http),該你必須返回該 第二個請求,如果你的框架並沒有這樣做自動

一個成功的動作=登錄請求將設置爲 需要餅乾視爲登陸,許多框架會自動處理這些餅乾 (如在cURL中的cookiejar)。如果是這樣,通過所有手段 利用這一點。如果不是,最可靠的方法是從HTTP響應的Set-Cookie標頭解析 。

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

當運行這個你應該會看到一個成功的這段時間:)

+0

但是你如何保存cookie來保持登錄後? – josh123a123 2016-07-26 16:19:28