2012-02-08 4 views
4

Je crée une application qui récupère les données d'un site, les formate au besoin et les affiche à l'utilisateur. Maintenant, le site ne permet pas les requêtes de script intersite, donc j'utilise le curl de PHP pour récupérer la page.PHP curl, préserver la session

  • Avec un navigateur, le site vous donne un cookie lors de la première visite, vous demandant de vous connecter, et les demandes ultérieures vous donnera la page réelle demandée.

  • Avec le curl de PHP, le site me donnera juste la page me demandant de me connecter. Et, je présume, donner un cookie à mon serveur PHP. Comment puis-je sauvegarder ce cookie et le présenter lors de demandes ultérieures?

+2

Ajouter 'curl_setopt ($ ch, CURLOPT_COOKIEFILE, 'cookiefile.txt'); curl_setopt ($ ch, CURLOPT_COOKIEJAR, 'cookiefile.txt'); 'avant l'authentification et dans toutes les requêtes après celle-ci. – Cheery

Répondre

5

utiliser quelques setopts pour régler le cookie.

Exemple:

$ch=curl_init(); 
curl_setopt($ch, CURLOPT_COOKIEFILE, "c:/cookies/cookie.txt"); 
curl_setopt($ch, CURLOPT_COOKIEJAR, "-"); 
1

Vous devez utiliser le cookie. Voilà comment je fais (je retourne un tableau avec le contenu html et le codage qui peut être utile pour gratter):

$curl_options = array(
    CURLOPT_RETURNTRANSFER => true,  /* return web page */ 
    CURLOPT_HEADER   => false, /* don't return headers */ 
    CURLOPT_FOLLOWLOCATION => true,  /* follow redirects */ 
    CURLOPT_ENCODING  => "",  /* handle all encodings */ 
    CURLOPT_AUTOREFERER => true,  /* set referer on redirect */ 
    CURLOPT_CONNECTTIMEOUT => 120,  /* timeout on connect */ 
    CURLOPT_TIMEOUT  => 120,  /* timeout on response */ 
    CURLOPT_MAXREDIRS  => 10,  /* stop after 10 redirects */ 
    CURLOPT_SSL_VERIFYHOST => 0, 
    CURLOPT_SSL_VERIFYPEER => 0 
); 
if ($ch = curl_init($url)) 
{ 
    curl_setopt_array($ch,self::$curl_options); 
    if ($cookie) 
     curl_setopt($ch,CURLOPT_COOKIEJAR,$cookie); 
     $r = curl_exec($ch); 
     curl_close($ch); 
    } 
} 
+1

Pouvez-vous couper le croc de l'exemple et juste garder les parties pertinentes? –

3

J'ai modifié le code de nabab, essayé et cela a fonctionné parfaitement que je voulais:

$loginData = array('username'=>'myuser', 'password'=>'mypassword'); 
$postData = array('url'=>'http://stackoverflow.com'); 
$loginURL = "http://stackoverflow.com/login.php"; 
$addURL = "http://stackoverflow.com/addUrl.php"; 

$curl_options = array(
    CURLOPT_RETURNTRANSFER => true,  /* return web page */ 
    CURLOPT_HEADER   => false, /* don't return headers */ 
    CURLOPT_FOLLOWLOCATION => true,  /* follow redirects */ 
    CURLOPT_ENCODING  => "",  /* handle all encodings */ 
    CURLOPT_AUTOREFERER => true,  /* set referer on redirect */ 
    CURLOPT_CONNECTTIMEOUT => 120,  /* timeout on connect */ 
    CURLOPT_TIMEOUT  => 120,  /* timeout on response */ 
    CURLOPT_MAXREDIRS  => 10,  /* stop after 10 redirects */ 
    CURLOPT_SSL_VERIFYHOST => 0, 
    CURLOPT_SSL_VERIFYPEER => 0 
); 

$cookie = "cookie.txt"; 
if ($ch = curl_init()) 
{ 
    curl_setopt_array($ch,$curl_options); 
    if ($cookie) 
    { 
     curl_setopt($ch,CURLOPT_COOKIEJAR,$cookie); 
     curl_setopt($ch, CURLOPT_POST, true); 
     curl_setopt($ch, CURLOPT_URL, $loginURL); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($loginData)); 
     $r = curl_exec($ch); 
     curl_setopt($ch, CURLOPT_URL, $addURL); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); 
     $r = curl_exec($ch); 

    } 
    curl_close($ch); 
}