curlopt_cookie cookie php cookies curl setcookie

curlopt_cookie - curl cookie php



¿Cómo puedo enviar cookies usando PHP curl además de CURLOPT_COOKIEFILE? (2)

Estoy raspando un poco de contenido de un sitio web después de un envío de formulario. El problema es que la secuencia de comandos está fallando de vez en cuando, digamos que 2 veces de cada 5 falla la secuencia de comandos. Estoy usando php curl, COOKIEFILE y COOKIEJAR para manejar la cookie. Sin embargo, cuando observé los encabezados enviados de mi navegador (al visitar el sitio web de destino desde mi navegador y el uso de encabezados http en vivo) y los encabezados enviados por php y vi que hay muchas diferencias.

Mi navegador envió muchas más variables de cookies que php curl. Creo que esta diferencia puede deberse a que javascript es responsable de configurar la mayoría de las cookies, sin embargo, no estoy seguro de esto.

Estoy utilizando el siguiente código para hacer el raspado y estoy mostrando los encabezados enviados de mi navegador y de php curl:

$ckfile = tempnam ("/tmp", ''cookiename''); $url = ''https://www.domain.com/firststep''; $poststring = ''variable1=4&variable2=5''; $ch = curl_init ($url); curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile); curl_setopt ($ch, CURLOPT_COOKIEFILE, $ckfile); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt ($ch, CURLOPT_POST, 1); curl_setopt ($ch, CURLOPT_POSTFIELDS, $poststring); $output = curl_exec ($ch); curl_close($ch); $url = ''https://www.domain.com/nextstep''; $poststring = ''variableB1=4&variableB2=5''; $ch = curl_init ($url); curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile); curl_setopt ($ch, CURLOPT_COOKIEFILE, $ckfile); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt ($ch, CURLOPT_POST, 1); curl_setopt ($ch, CURLOPT_POSTFIELDS, $poststring); curl_setopt($ch, CURLINFO_HEADER_OUT, true); $output = curl_exec ($ch); $headers = curl_getinfo($ch, CURLINFO_HEADER_OUT); curl_close($ch); print_r($headers); // Gives: POST /d-cobs-web/doffers.html;jsessionid=7BC2A5277A4EB07D9A7237A707BE1366 HTTP/1.1 User-Agent: Mozilla Host: domain.subdomain.nl Accept: */* Cookie: JSESSIONID=7BC2A5277A4EB07D9A7237A707BE1366; www-20480=MIFBNLFDFAAA Content-Length: 187 Content-Type: application/x-www-form-urlencoded // Where live http headers gives: POST /d-cobs-web/doffers.html;jsessionid=7BC2A5277A4EB07D9A7237A707BE1366 HTTP/1.1 Host: domain.subdomain.nl User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: nl,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip, deflate Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Referer: https://domain.subdomain.nl/dd/doffers.html?returnUrl=https%3A%2F%2Fttcc.subdomain.nl%2Fdd%2Fpreferences.html%3FValueChanged%3Dfalse&BEGBA=&departureDate=13-06-2013&extChangeTime=&pax2=0&bp=&pax1=1&pax4=0&bk=&pax3=0&shopId=&xtpage=&partner=NSINT&bc=&xt_pc=&ov=&departureTime=&comfortClass=2&destination=DEBHF&thalysTicketless=&beneUser=&debugDOffer=&logonId=&valueChanged=&iDomesticOrigin=&rp=&returnTime=&locale=nl_NL&vu=&thePassWeekend=false&returnDate=&xtsite=&pax=A&lc2=&lc1=&lc4=&lc3=&lc6=&lc5=&BECRA=&passType2=&custId=&lc9=&iDomesticDestination=&passType1=A&lc7=&lc8=&origin=NLASC&toporef=&pid=&passType4=&returnTimeType=1&passType3=&departureTimeType=1&socusId=&idr3=&xtn2=&loyaltyCard=&idr2=&idr1=&thePassBusiness=false&cid=14812 Content-Length: 219 Cookie: subdomainPARTNER=NSINT; JSESSIONID=CB3FEB3AC72AD61A80BFED91D3FD96CA; www-20480=MHFBNLFDFAAA; campaignPos=5; www-47873=MGFBNLFDFAAA; __utma=1.993399624.1370027094.1370040145.1370082133.5; __utmc=1; __utmz=1.1370027094.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); BCSessionID=5dc05787-c2c8-43e1-9abe-93989970b087; BCPermissionLevel=PERSONAL; __utmb=1.1.10.1370082133 Connection: keep-alive Pragma: no-cache Cache-Control: no-cache AJAXREQUEST=_viewRoot&doffersForm=doffersForm&doffersForm%3AvalueChanged=&doffersForm%3ArequestValid=true&javax.faces.ViewState=j_id3&doffersForm%3Aj_id937=doffersForm%3Aj_id937&valueChanged=false&AJAX%3AEVENTS_COUNT=1&

Me gustaría usar:

$headers = array(); $headers[] = ''Cookie: '' . $cookie;

y:

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

dónde:

$cookie = ''subdomainPARTNER=NSINT; JSESSIONID=CB3FEB3AC72AD61A80BFED91D3FD96CA; www-20480=MHFBNLFDFAAA; campaignPos=5; www-47873=MGFBNLFDFAAA; __utma=1.993399624.1370027094.1370040145.1370082133.5; __utmc=1; __utmz=1.1370027094.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); BCSessionID=5dc05787-c2c8-43e1-9abe-93989970b087; BCPermissionLevel=PERSONAL; __utmb=1.1.10.1370082133'';

Es posible que algunos de los parámetros en la cookie de arriba sean capaces de eliminar el contenido del sitio web, pero no todos. Algunos de ellos podría leer desde $ ckfile, pero no sé cómo hacer eso. Especialmente los utma utmc, utmz, utmcsr, utmccn, utmcmd que no puedo obtener de ningún lado, creo que estos son generados por el javascript.

Pregunta 1: ¿Estoy haciendo algo mal con el manejo de las cookies en el código actual, ya que muy pocas variables de cookies son enviadas por php curl y mucho más por el navegador? Además: ¿pueden otras diferencias entre los encabezados enviados por el navegador y el curr de php ser un problema para devolver el contenido correcto?

Pregunta 2: ¿Las variables de cookies faltantes se deben a que javascript establece esas cookies?

Pregunta 3: ¿Cuál es la mejor manera de manejar las cookies para asegurarse de que se envíen todas las cookies requeridas al servidor remoto?

¡Tu ayuda es bienvenida!


Creo que la única cookie que necesitas es JSESSIONID = xxx ...

NUNCA comparta sus cookies, ya que alguien puede acceder a sus datos personales de esa manera. Especialmente cuando las cookies son sesión. Estas cookies dejarán de funcionar una vez que cierre la sesión del sitio.


Si la cookie se genera a partir de una secuencia de comandos, puede enviar la cookie manualmente junto con la cookie del archivo (utilizando la opción cookie-file). Por ejemplo:

# sending manually set cookie curl_setopt($ch, CURLOPT_HTTPHEADER, array("Cookie: test=cookie")); # sending cookies from file curl_setopt($ch, CURLOPT_COOKIEFILE, $ckfile);

En este caso, curl enviará su cookie definida junto con las cookies del archivo.

Si la cookie se genera a través de javascrript, entonces tiene que rastrear cómo se genera y luego puede enviarlo utilizando el método anterior (a través de http-header).

El utma utmc, utmz se ve cuando las cookies se envían desde Mozilla. No deberías apostar a preocuparte por estas cosas nunca más.

Finalmente, la forma en que lo estás haciendo está bien. Solo asegúrate de utilizar la ruta absoluta para los nombres de los archivos (es decir, /var/dir/cookie.txt ) en lugar de la relativa.

Siempre habilite el modo detallado cuando se trabaja con curl. Te ayudará mucho a rastrear las solicitudes. También ahorrará gran parte de tu tiempo.

curl_setopt($ch, CURLOPT_VERBOSE, true);