comment pouvons-nous maintenir la session dans cURL?
j'ai un code qui envoie les détails de connexion d'un site et que je me connecte avec succès; il faut que la session soit maintenue sur le site pour continuer.
voici mon code qui permettait de se connecter au site en utilisant cURL
<?php
$socket = curl_init();
curl_setopt($socket, CURLOPT_URL, "http://www.XXXXXXX.com");
curl_setopt($socket, CURLOPT_REFERER, "http://www.XXXXXXX.com");
curl_setopt($socket, CURLOPT_POST, true);
curl_setopt($socket, CURLOPT_USERAGENT, $agent);
curl_setopt($socket, CURLOPT_POSTFIELDS, "form_logusername=XXXXX&form_logpassword=XXXXX");
curl_setopt($socket, CURLOPT_COOKIESESSION, true);
curl_setopt($socket, CURLOPT_COOKIEJAR, "cookies.txt");
curl_setopt($socket, CURLOPT_COOKIEFILE, "cookies.txt");
$data = curl_exec($socket);
curl_close($socket);
?>
Voici le meilleur moyen que j'ai trouvé pour le faire lien :
le texte ci-dessous est une version "remixée" du contenu de la blogpost :
$useragent = $_SERVER['HTTP_USER_AGENT'];
$strCookie = 'PHPSESSID=' . $_COOKIE['PHPSESSID'] . '; path=/';
session_write_close();
$ch = curl_init();
$ch = curl_init($rssFeedLink);
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_USERAGENT, $useragent);
curl_setopt( $ch, CURLOPT_COOKIE, $strCookie );
$response = curl_exec($ch);
curl_close($ch);
Que fait session_write_close()
? Cela met fin à la session en cours et stocke les données de la session. Apparemment, PHP n'aime pas que plusieurs scripts jouent avec la session, elle est donc verrouillée. En mettant session_write_close, vous vous assurez que votre session actuelle est stockée afin que vous puissiez la récupérer et l’utiliser.
si vous n'utilisez pas session_write_close()
, un nouvel identifiant de session sera généré au lieu d'utiliser l'identifiant de session actuel.
De plus,PHPSESSIDdoit être remplacé par le nom de la variable de session. Selon recommandations OWSAP il devrait être quelque chose de plus général comme anId .
Parfois, vous aurez besoin d’envoyer un agent utilisateur avec le message, j’ai donc inclus le paramètre CURLOPT_USERAGENT
.
Voici comment vous faites CURL avec des sessions
//initial request with login data
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/login.php');
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/32.0.1700.107 Chrome/32.0.1700.107 Safari/537.36');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "username=XXXXX&password=XXXXX");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIESESSION, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie-name'); //could be empty, but cause problems on some hosts
curl_setopt($ch, CURLOPT_COOKIEFILE, '/var/www/ip4.x/file/tmp'); //could be empty, but cause problems on some hosts
$answer = curl_exec($ch);
if (curl_error($ch)) {
echo curl_error($ch);
}
//another request preserving the session
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/profile');
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, "");
$answer = curl_exec($ch);
if (curl_error($ch)) {
echo curl_error($ch);
}
J'ai vu ça sur ImpressPages
Puisque vous faites référence à un fichier cookies.txt sans aucune référence à un dossier, je suppose que vous essayez d’écrire dans un fichier situé dans un dossier qui n’est pas accessible en écriture. Commencez donc par vérifier si vous trouvez réellement un fichier cookies.txt et s'il contient le ou les cookies de session auxquels vous vous attendez.
Je déplacerais probablement ce code dans une fonction. Après une connexion réussie, vous avez maintenant la session associée au cookie que vous avez dans votre fichier cookie.txt. Lors des demandes suivantes, continuez simplement à utiliser ce fichier de cookie et vous devriez avoir une session valide sur ce site.