2015-08-17 76 views
0

我正在使用mediawiki API,並且我想使用API​​創建用戶登錄。我提到這個link。但我無法創建會話。如何在mediawiki API中使用php curl創建會話

這裏是我的代碼

第一步

與此

session_start(); 
    $data = "action=login&lgname=Wiki&lgpassword=gjnlt&lgtoken=5ae555656110dd20a2b0504e4d7e35e0"; // login 
    $result=call($data); // get the session id 
    function call($data=null) 
    { 
     $ch = curl_init('http://192.168.1.32/Eb_new/mediawiki/api.php?format=json'); 
     curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($ch, CURLOPT_HTTPHEADER, array(
      'Accept: application/json', 
      'Content-Length: ' . strlen($data)) 
     ); 

     $result = curl_exec($ch); 
     return $result=json_decode($result); 
    } 

我得到的迴應是我創建了一個會話ID。

{"login":{"result":"Success","lguserid":5,"lgusername":"Wiki","lgtoken":"d85fd0201276632858ce4ad3ac351de4","cookieprefix":"EB_new_wiki_","sessionid":"3b8cdab43d4cda6b4548a3cc27604e20"}} 

第二步

現在我有$result->login->sessionid會話ID。要設置我又呼叫設置會話這樣

setsession($result->login->sessionid); // set the session 

function setsession($sessionid) 
{ 
     $field_array= array(
     'Accept' => 'HTTP_ACCEPT', 
     'Accept-Charset' => 'HTTP_ACCEPT_CHARSET', 
     'Accept-Encoding' => 'HTTP_ACCEPT_ENCODING', 
     'Accept-Language' => 'HTTP_ACCEPT_LANGUAGE', 
     'Connection' => 'HTTP_CONNECTION', 
     'Host' => 'HTTP_HOST', 
     'Referer' => 'HTTP_REFERER', 
     'User-Agent' => 'HTTP_USER_AGENT', 
     'Set-Cookie'=>'enwikiSession='.$sessionid.' ;domain=http://192.168.1.32/Eb_new/mediawiki' 
    ); 

    $curl_request_headers=array(); 

    foreach ($field_array as $key => $value) { 
     if(isset($_SERVER["$value"])) { 
      $server_value=$_SERVER["$value"]; 
      $curl_request_headers[]="$key: $server_value"; 
     } 
    }; 
    $curl_request_headers[]="Expect: "; 

    session_write_close(); 
    $data = "action=login&lgname=Wiki&lgpassword=gjnlt&lgtoken=5ae555656110dd20a2b0504e4d7e35e0"; // login 
    $ch = curl_init('http://192.168.1.32/Eb_new/mediawiki/api.php?format=json'); 
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
    curl_setopt($curl_handle, CURLOPT_HTTPHEADER, $curl_request_headers); 
    //curl_setopt($curl_handle, CURLOPT_COOKIE, 'enwikiSession='.$sessionid.' ;domain=http://192.168.1.32/Eb_new/mediawiki'); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    echo $result = curl_exec($ch); 
} 

會話,但用戶沒有登錄中。我錯在哪裏。任何幫助將不勝感激 。謝謝

+0

您省略了第二個響應。它可能包含一個'NeedCaptcha'錯誤。另外,您正在設置一個'enwikiSession' cookie,但是您的目標wiki實際上是否被稱爲enwiki?通常,[OAuth](https://www.mediawiki.org/wiki/OAuth/For_Developers)(例如[Extension:OAuthAuthentication](https://www.mediawiki.org/wiki/Extension:OAuthAuthentication))通常比使用登錄API更好的方法。 – Tgr

回答

0

登錄請求的結構

使用POST發送登錄請求(GET請求將導致錯誤)。

api.php?行動=登錄& lgname =鮑勃& lgpassword =祕密[嘗試在[ApiSandbox] ] [1] 結果

{ 
"login": { 
    "result": "NeedToken", 
    "token": "b5780b6e2f27e20b450921d9461010b4", 
    "cookieprefix": "enwiki", 
    "sessionid": "17ab96bd8ffbe8ca58a78657a918558e" 
} 
} 

所述POST的主體可以是空的。這個請求也將在HTTP報頭

(Set-Cookie: enwikiSession=17ab96bd8ffbe8ca58a78657a918558e; path=/; domain=.wikipedia.org; HttpOnly) 

,你必須返回第二個請求,如果你的框架並不自動執行此操作返回一個會話cookie。 sessionid參數已添加到MediaWiki 1.17及更高版本中。

https://en.wikipedia.org/wiki/Special:ApiSandbox#action=login&lgname=Bob&lgpassword=secret

+0

我正在使用post方法。檢查我的問題 – MKD

+0

我給了post方法的示例,上面的請求將通過Post方法發送 –

0

我發現你沒有在上面的代碼中的任何地方啓動會話。

你必須要檢索值會話設定值會話每一頁上添加session_start()

Ref

+0

我已經在頂部啓動它,但沒有提到有問題。對不起 – MKD