2010-03-11 63 views
19

¿cómo podemos mantener la sesión en CURL?cómo mantener la sesión en cURL en php?

tengo un código que envía los datos de inicio de sesión de un sitio y se registra con éxito necesito mantener la sesión mantenida en el sitio para continuar.

aquí es mi código que utiliza para acceder al sitio usando cURL

<?php 
     $socket = curl_init(); 
     curl_setopt($socket, CURLOPT_URL, "http://www.XXXXXXX.com"); 
    curl_setopt($socket, CURLOPT_REFERER, "http://www.XXXXXXX.com"); 
    curl_setopt($socket, CURLOPT_POST, true); 
    curl_setopt($socket, CURLOPT_USERAGENT, $agent); 
    curl_setopt($socket, CURLOPT_POSTFIELDS, "form_logusername=XXXXX&form_logpassword=XXXXX"); 
    curl_setopt($socket, CURLOPT_COOKIESESSION, true); 
    curl_setopt($socket, CURLOPT_COOKIEJAR, "cookies.txt"); 
    curl_setopt($socket, CURLOPT_COOKIEFILE, "cookies.txt"); 
    $data = curl_exec($socket); 
    curl_close($socket); 
    ?> 

Respuesta

2

Puesto que usted está haciendo referencia a un archivo cookies.txt sin ninguna referencia a una carpeta de mi primera conjetura sería que eres tratando de escribir en un archivo en una carpeta que no se puede escribir. Así que primero compruebe si realmente encuentra un archivo cookies.txt y si contiene las cookies de sesión que esperaría.

+0

Gracias por la repetición rápida la carpeta contiene archivos cookies.txt y es writble con permisos 777 –

+0

¿Está vacío? Curl trata las cookies de sesión como sin vencimiento. Si no, intente truncarlo primero. También debe establecer la CURLOPT_FOLLOWLOCATION para asegurarse de completar el inicio de sesión – symcbean

0

Probablemente movería ese código a una función. Después de iniciar sesión correctamente, ahora tiene la sesión asociada a la cookie que tiene en su archivo cookie.txt. En solicitudes posteriores, simplemente siga usando ese archivo de cookies y debería tener una sesión válida en ese sitio.

11

Aquí es la mejor manera que he encontrado para hacer esto link:

el fuelle texto es una versión 'remezclado' del contenido de la blogpost:

$useragent = $_SERVER['HTTP_USER_AGENT']; 
$strCookie = 'PHPSESSID=' . $_COOKIE['PHPSESSID'] . '; path=/'; 

session_write_close(); 

$ch = curl_init(); 
$ch = curl_init($rssFeedLink); 
curl_setopt($ch,CURLOPT_URL,$url); 
curl_setopt($ch,CURLOPT_USERAGENT, $useragent); 
curl_setopt($ch, CURLOPT_COOKIE, $strCookie); 

$response = curl_exec($ch); 
curl_close($ch); 

¿Qué session_write_close() hacer? Esto finaliza la sesión actual y almacena los datos de la sesión. Aparentemente, a PHP no le gusta que varias secuencias de comandos jueguen con la sesión, por lo tanto, la bloquea. Poner session_write_close asegura que su sesión actual esté almacenada para que pueda recuperarla y usarla.

si no utiliza session_write_close() se generará una nueva identificación de sesión en lugar de utilizar la identificación de sesión actual.

También PHPSESSID debe sustituirse por el nombre de la variable de sesión. De acuerdo con OWSAP recommandations debería ser algo más general como y.

A veces tendrá que enviar un agente de usuario con la publicación, así que incluí el parámetro CURLOPT_USERAGENT.

8

Así es como se hace con el enrollamiento sesiones

//initial request with login data 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/login.php'); 
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/32.0.1700.107 Chrome/32.0.1700.107 Safari/537.36'); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, "username=XXXXX&password=XXXXX"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_COOKIESESSION, true); 
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie-name'); //could be empty, but cause problems on some hosts 
curl_setopt($ch, CURLOPT_COOKIEFILE, '/var/www/ip4.x/file/tmp'); //could be empty, but cause problems on some hosts 
$answer = curl_exec($ch); 
if (curl_error($ch)) { 
    echo curl_error($ch); 
} 

//another request preserving the session 

curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/profile'); 
curl_setopt($ch, CURLOPT_POST, false); 
curl_setopt($ch, CURLOPT_POSTFIELDS, ""); 
$answer = curl_exec($ch); 
if (curl_error($ch)) { 
    echo curl_error($ch); 
} 

que he visto esto en ImpressPages

Cuestiones relacionadas