136 votes

comment obtenir les cookies d'un php curl dans une variable

Si un mec à une autre entreprise pensais que ce serait génial si au lieu d'utiliser soap ou xml-rpc ou de repos ou tout autre protocole de communication, il a juste intégré l'ensemble de son intervention en tant que témoins dans l'en-tête.

J'ai besoin de tirer sur ces cookies comme on l'espère un tableau à partir de ce roulage de réponse. Si je dois perdre un tas de ma vie à écrire un analyseur syntaxique pour cela, je vais être très malheureux.

Personne ne sait comment cela peut être fait, de préférence sans avoir à écrire quelque chose dans un fichier?

Je serai très reconnaissant si quelqu'un peut m'aider avec cela.

183voto

TML Points 6469
$ch = curl_init('http://www.google.com/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// get headers too with this line
curl_setopt($ch, CURLOPT_HEADER, 1);
$result = curl_exec($ch);
// get cookie
preg_match('/^Set-Cookie:\s*([^;]*)/mi', $result, $m);

parse_str($m[1], $cookies);
var_dump($cookies);

42voto

Googol Points 371

Bien que cette question est assez vieux, et que la réponse est valide, je trouve ça un peu inconfortable parce que le contenu de la réponse HTTP (HTML, XML, JSON, binaire ou quoi que ce soit) se mélange avec les en-têtes.

J'ai trouvé une autre alternative. CURL fournit une option (CURLOPT_HEADERFUNCTION) pour définir une fonction de callback qui sera appelée pour chaque en-tête de réponse de la ligne. La fonction recevra la boucle de l'objet et une chaîne avec la ligne d'en-tête.

Vous pouvez utiliser un code comme celui-ci (adapté de TML réponse):

$cookies = Array();
$ch = curl_init('http://www.google.com/');
// Ask for the callback.
curl_setopt($ch, CURLOPT_HEADERFUNCTION, "curlResponseHeaderCallback");
$result = curl_exec($ch);
var_dump($cookies);

function curlResponseHeaderCallback($ch, $headerLine) {
    global $cookies;
    if (preg_match('/^Set-Cookie:\s*([^;]*)/mi', $headerLine, $cookie) == 1)
        $cookies[] = $cookie;
    return strlen($headerLine); // Needed by curl
}

Cette solution a l'inconvénient de l'utilisation d'une variable globale, mais je suppose que ce n'est pas un problème à court scripts. Et vous pouvez toujours utiliser des méthodes et des attributs si curl est enveloppé dans une classe.

13voto

Alex P Points 71

Cela le fait sans expressions rationnelles, mais nécessite l'extension HTTP PECL, peut aider quelqu'un. À votre santé

 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_HEADER, 1);

$result = curl_exec($ch);


curl_close($ch);


$headers = http_parse_headers($result);

$cookobjs = Array();

foreach($headers AS $k => $v){
    if (strtolower($k)=="set-cookie"){
        foreach($v AS $k2 => $v2){
            $cookobjs[] = http_parse_cookie($v2);
        }
    }
}

$cookies = Array();

foreach($cookobjs AS $row){
    $cookies[] = $row->cookies;
}

$tmp = Array();

///sort k=>v format
foreach($cookies AS $v){
    foreach ($v  AS $k1 => $v1){
        $tmp[$k1]=$v1;
    }
}




$cookies = $tmp;
print_r($cookies);
 

11voto

SoapBox Points 14183

Si vous utilisez CURLOPT_COOKIE_FILE et CURLOPT_COOKIE_JAR, curl lira / écrira les cookies de / dans un fichier. Vous pouvez, après avoir terminé, lisez et / ou modifiez-le comme vous le souhaitez.

4voto

Daniel Stenberg Points 9116

libcurl fournit également CURLOPT_COOKIELIST qui extrait tous les cookies connus. Tout ce dont vous avez besoin est de vous assurer que la liaison PHP / CURL peut l'utiliser.

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