2013-03-12 110 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