2012-03-15 10 views
5

Me estoy conectando a un servicio API que autentica a los usuarios que usan cookies. Realizo estas dos instrucciones desde el símbolo del sistema y funciona.Lectura de cookies cuando usa Curl en php, ¿cómo?

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

curl -b https://domain/getData 

Ahora quiero hacer dos archivos php equivalentes login.php y get_data.php utilizando rizo.

estoy usando

curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile); 

en login.php

y

curl_setopt($ch, CURLOPT_COOKIEFILE, $ckfile); 

en get_data.php

No está funcionando. El archivo de cookies se está creando pero el segundo curl no lo está leyendo. ¿Es esta la manera correcta de hacerlo? ¿Tengo que leer el archivo de cookies por separado y configurar el encabezado Cookie? Cualquier ayuda sería apreciada. Gracias.

+0

Por lo general, es mejor configurar ambas opciones de cookies, independientemente de si el script solo está leyendo o escribiendo las cookies. –

+0

¿El valor del encabezado 'Cookie' se agregará automáticamente a la solicitud curl en' get_data.php'? – Diode

+0

si esa instancia de curl en particular puede leer el archivo de cookie creado por el otro script, entonces sí. –

Respuesta

14

Esto hará el truco. Corro contra Google.com como ejemplo:

<?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 other examples de cómo analizar con eficacia como cadena.

1

hay algún método para ver los encabezados de solicitud de curl. ¿Puedo obtenerlo de la instancia curl? o hay alguna herramienta como el violinista para Mac (estoy trabajando con Mac OS)?

Sí, puede obtener las cabeceras de petición con lo siguiente:

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

En PHP 5.5.0 parece que ahora puede obtener las galletas en una sola línea, pero sólo volver una matriz vacía usando esto con PHP 7.1.0:

CURLINFO_COOKIELIST - conseguir todas las galletas conocidas

$cookies = curl_getinfo($curl, CURLINFO_COOKIELIST); 
+0

También estoy teniendo estos problemas, ¿pudo resolverlos para que CURLINFO_COOKIELIST genere las cookies? Para mí funcionaba pero cuando actualicé recientemente a través de 'yum update -y' el resultado siempre estaba vacío. – maddo7

+0

Intenta configurar 'curl_setopt ($ ch, CURLOPT_COOKIELIST, array (''));' con la primera solicitud. Esto lo resolvió para mí. – maddo7