Entonces, un tipo de otra compañía pensó que sería increíble si en lugar de usar jabón o xml-rpc o descansar o cualquier otro protocolo de comunicación razonable, simplemente incrustara toda su respuesta como cookies en el encabezado.
Necesito sacar estas cookies con suerte como una matriz de esta respuesta de rizo. Si tengo que desperdiciar un montón de mi vida escribiendo un analizador para esto, seré muy infeliz.
¿Alguien sabe cómo se puede hacer esto, preferiblemente sin escribir nada en un archivo?
Estaré muy agradecido si alguien me puede ayudar con esto.
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'callback_SaveHeaders');
parse_str($m[1], $cookies)
, lo que rellenará las cookies en una matriz asociativa en la$cookies
variable ...preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $result, $matches); $cookies = array(); foreach($matches[1] as $item) { parse_str($item, $cookie); $cookies = array_merge($cookies, $cookie); }
Aunque esta pregunta es bastante antigua y la respuesta aceptada es válida, me resulta un poco incómodo porque el contenido de la respuesta HTTP (HTML, XML, JSON, binario o lo que sea) se mezcla con los encabezados.
He encontrado una alternativa diferente. CURL proporciona una opción (
CURLOPT_HEADERFUNCTION
) para establecer una devolución de llamada que se llamará para cada línea de encabezado de respuesta. La función recibirá el objeto curl y una cadena con la línea de encabezado.Puede usar un código como este (adaptado de la respuesta TML):
Esta solución tiene el inconveniente de usar una variable global, pero supongo que esto no es un problema para los scripts cortos. Y siempre puede usar métodos y atributos estáticos si curl se está envolviendo en una clase.
fuente
$cookies
.$curlResponseHeaderCallback = function ($ch, $headerLine) use (&$cookies) {
entoncescurl_setopt($ch, CURLOPT_HEADERFUNCTION, $curlResponseHeaderCallback);
.$class->curlResponseHeaderCallback()
? ¿O simplemente tienescurlResponseHeaderCallback
fuera de la clase?Esto lo hace sin expresiones regulares, pero requiere la extensión HTTP PECL .
fuente
pecl install
realmente funcionara. Grrr.Si usa CURLOPT_COOKIE_FILE y CURLOPT_COOKIE_JAR curl leerá / escribirá las cookies de / a un archivo. Puede, después de terminar el rizo, leerlo y / o modificarlo como desee.
fuente
libcurl también proporciona CURLOPT_COOKIELIST que extrae todas las cookies conocidas. Todo lo que necesita es asegurarse de que el enlace PHP / CURL pueda usarlo.
fuente
alguien aquí puede encontrarlo útil. hhb_curl_exec2 funciona más o menos como curl_exec, pero arg3 es una matriz que se completará con los encabezados http devueltos (índice numérico), y arg4 es una matriz que se completará con las cookies devueltas ($ cookies ["caduca"] => " Vie, 06-May-2016 05:58:51 GMT "), y arg5 se completará con ... información sobre la solicitud sin procesar realizada por curl.
La desventaja es que requiere que CURLOPT_RETURNTRANSFER esté activado, de lo contrario, se producirá un error y sobrescribirá CURLOPT_STDERR y CURLOPT_VERBOSE, si ya los estaba usando para otra cosa ... (podría arreglar esto más adelante)
ejemplo de cómo usarlo:
y la función en sí ..
fuente
Parece que la respuesta aceptada buscará en todo el mensaje de respuesta. Esto podría darle coincidencias falsas para los encabezados de cookies si la palabra "Set-Cookie" está al comienzo de una línea. Si bien debería estar bien en la mayoría de los casos. La forma más segura podría ser leer el mensaje desde el principio hasta la primera línea vacía que indica el final de los encabezados del mensaje. Esta es solo una solución alternativa que debería buscar la primera línea en blanco y luego usar preg_grep en esas líneas solo para encontrar "Set-Cookie".
fuente
Tengo entendido que las cookies
curl
deben escribirse en un archivo (curl -c cookie_file
). Si está ejecutandocurl
PHPexec
osystem
funciones (o cualquier cosa de esa familia), debería poder guardar las cookies en un archivo, luego abrir el archivo y leerlo.fuente