6 votes

Lire un cookie en utilisant Curl en php, comment faire ?

Je me connecte à un service API qui authentifie les utilisateurs à l'aide de cookies. Je fais ces deux déclarations à partir de l'invite de commande et cela fonctionne.

curl -d "u=username&p=password" -c ~/cookiejar https://domain/login

curl -b https://domain/getData

Je veux maintenant créer deux fichiers php équivalents login.php y get_data.php en utilisant curl.

J'utilise

curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile);

sur login.php

y

curl_setopt($ch, CURLOPT_COOKIEFILE, $ckfile);

sur get_data.php

Il ne fonctionne pas. Le fichier Cookie est créé mais le second curl ne le lit pas. Est-ce la bonne façon de procéder ? Dois-je lire le fichier cookie séparément et définir l'en-tête ? Cookie ? Toute aide serait appréciée. Merci.

17voto

Joseph Lust Points 4961

Cela fera l'affaire. Je l'exécute contre Google.com à titre d'exemple :

<?PHP

// open a site with cookies
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.google.com");
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0');
curl_setopt($ch, CURLOPT_HEADER  ,1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER  ,1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION  ,1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$content = curl_exec($ch);

// get cookies
$cookies = array();
preg_match_all('/Set-Cookie:(?<cookie>\s{0,}.*)$/im', $content, $cookies);

print_r($cookies['cookie']); // show harvested cookies

// basic parsing of cookie strings (just an example)
$cookieParts = array();
preg_match_all('/Set-Cookie:\s{0,}(?P<name>[^=]*)=(?P<value>[^;]*).*?expires=(?P<expires>[^;]*).*?path=(?P<path>[^;]*).*?domain=(?P<domain>[^\s;]*).*?$/im', $content, $cookieParts);
print_r($cookieParts);

?>

Ver autres exemples pour savoir comment analyser efficacement une telle chaîne.

3voto

tameren Points 31

Existe-t-il une méthode pour voir les en-têtes de la requête curl ? Puis-je les obtenir à partir de l'instance curl ? ou existe-t-il un outil comme fiddler pour Mac (je travaille sur Mac OS) ?

Oui, vous pouvez obtenir les en-têtes de la requête avec ce qui suit :

<?php
  ...
  curl_setopt($ch, CURLINFO_HEADER_OUT, true); // enable tracking
  $result = curl_exec($ch);
  var_dump(curl_getinfo($ch, CURLINFO_HEADER_OUT)); // request headers
?>

2voto

Adam Points 1984

En PHP 5.5.0, il semble que vous puissiez maintenant obtenir les cookies en une seule ligne, mais je n'obtiens qu'un tableau vide en utilisant cette méthode avec PHP 7.1.0 :

CURLINFO_COOKIELIST - obtenir tous les cookies connus

$cookies = curl_getinfo($curl, CURLINFO_COOKIELIST);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X