Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] No crea cookie con CURL

Estas en el tema de No crea cookie con CURL en el foro de PHP en Foros del Web. Buenos días. Estoy usando la siguiente clase de "ontuts . com" para enviar mediante post usuario y contraseña y guardar una cookie. Todo ello para ...
  #1 (permalink)  
Antiguo 15/09/2014, 02:28
 
Fecha de Ingreso: abril-2014
Ubicación: Almería
Mensajes: 58
Antigüedad: 10 años
Puntos: 2
No crea cookie con CURL

Buenos días.

Estoy usando la siguiente clase de "ontuts . com" para enviar mediante post usuario y contraseña y guardar una cookie. Todo ello para posteriormente obtener otra URL que precisa de ese inicio de sesión. El problema es que no me guarda la cookie. He descartado el tema de los permisos, ya que se trata de un servidor Windows.
El código de la clase es el siguiente:

Código PHP:
<?php
/**
 * Clase para gestionar las conexesiones y peticiones a servidores remotos
 */
class HttpConnection {
    private 
$curl;
    private 
$cookie;
    private 
$cookie_path="/cookies";
    private 
$id;

    public function 
__construct() {
        
$this->id time();
    }
    
/**
     * Inicializa el objeto curl con las opciones por defecto.
     * Si es null se crea
     * @param string $cookie a usar para la conexion
     */
    
public function init($cookie=null) {
        if(
$cookie)
            
$this->cookie $cookie;
        else
            
$this->cookie $this->cookie_path $this->id;

        
$this->curl=curl_init();
        
curl_setopt($this->curlCURLOPT_USERAGENT,"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1");
        
curl_setopt($this->curlCURLOPT_HEADERfalse);
        
curl_setopt($this->curlCURLOPT_COOKIEFILE,$this->cookie);
        
curl_setopt($this->curlCURLOPT_HTTPHEADER, array("Accept-Language: es-es,en"));
        
curl_setopt($this->curlCURLOPT_COOKIEJAR$this->cookie);
        
curl_setopt($this->curlCURLOPT_SSL_VERIFYPEERfalse);
        
curl_setopt($this->curlCURLOPT_SSL_VERIFYHOSTfalse);
        
curl_setopt($this->curlCURLOPT_HTTP_VERSIONCURL_HTTP_VERSION_1_0);
        
curl_setopt($this->curlCURLOPT_RETURNTRANSFER,true);
        
curl_setopt($this->curlCURLOPT_CONNECTTIMEOUT5);
        
curl_setopt($this->curlCURLOPT_TIMEOUT60);
        
curl_setopt($this->curlCURLOPT_AUTOREFERERTRUE);
}
    
/**
     * Establece en que ruta se guardan las cookies.
     * Importante: El usuario de apache debe tener acceso de lectura y escritura
     * @param string $path
     */
    
public function setCookiePath($path){
        
$this->cookie_path $path;
    }
    
/**
     * Envía una peticion GET a la URL especificada
     * @param string $url
     * @param bool $follow
     * @return string Respuesta generada por el servidor
     */
    
public function get($url,$follow=false) {
        
$this->init();
        
curl_setopt($this->curlCURLOPT_URL$url);
        
curl_setopt($this->curlCURLOPT_POST,false);
        
curl_setopt($this->curlCURLOPT_HEADER$follow);
        
curl_setopt($this->curlCURLOPT_REFERER'');
        
curl_setopt($this->curlCURLOPT_FOLLOWLOCATION$follow);
        
$result=curl_exec ($this->curl);
        if(
$result === false){
            echo 
curl_error($this->curl);
        }
        
$this->_close();
        return 
$result;
    }
    
/**
     * Envía una petición POST a la URL especificada
     * @param string $url
     * @param array $post_elements
     * @param bool $follow
     * @param bool $header
     * @return string Respuesta generada por el servidor
     */
    
public function post($url,$post_elements,$follow=false,$header=false) {
        
$this->init();
        
$elements=array();
        foreach (
$post_elements as $name=>$value) {
            
$elements[] = "{$name}=".urlencode($value);
        }
        
$elements join("&",$elements);
        
curl_setopt($this->curlCURLOPT_URL$url);
        
curl_setopt($this->curlCURLOPT_POST,true);
        
curl_setopt($this->curlCURLOPT_REFERER'');
        
curl_setopt($this->curlCURLOPT_HEADER$header OR $follow);
        
curl_setopt($this->curlCURLOPT_POSTFIELDS$elements);
        
curl_setopt($this->curlCURLOPT_FOLLOWLOCATION$follow);
        
$result=curl_exec ($this->curl);
        
$this->_close();
        return 
$result;
    }
    
/**
     * Descarga un fichero binario en el buffer
     * @param string $url
     * @return string
     */
    
public function getBinary($url){
        
$this->init();
        
curl_setopt($this->curlCURLOPT_URL$url);
        
curl_setopt($this->curlCURLOPT_BINARYTRANSFER,1);
        
$result curl_exec ($this->curl);
        
$this->_close();
        return 
$result;
    }
    
/**
     * Cierra la conexión
     */
    
private function _close() {
        
curl_close($this->curl);
    }
    public function 
close(){
        if(
file_exists($this->cookie))
            
unlink($this->cookie);
    }
}
?>
Por otro lado, la petición la hago de la siguiente forma:

Código PHP:
<?php
require_once("HttpConnection.php");
$http = new HttpConnection();  
$http->setCookiePath("/cookies/");  
$http->init();  
 
$apost = array('usuario' =>"usuario"'password' => "pass");
 
echo (
$http->post("https://dominio/entrada.asp"$apost));
 
$http->close();
?>
Si alguien puede ayudarme le estaría muy agradecido, estoy bastante desesperado.

Un saludo y gracias de antemano.
  #2 (permalink)  
Antiguo 15/09/2014, 03:45
 
Fecha de Ingreso: abril-2014
Ubicación: Almería
Mensajes: 58
Antigüedad: 10 años
Puntos: 2
Respuesta: No crea cookie con CURL

Me realiza el log correctamente, el problema viene cuando intento hacer una segunda petición.
¿Cómo mantengo la sesión?
  #3 (permalink)  
Antiguo 15/09/2014, 04:35
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: No crea cookie con CURL

¿Cómo intentas hacer la segunda petición? ;)
__________________
>> Eleazan's Source
>> @Eleazan
  #4 (permalink)  
Antiguo 15/09/2014, 05:15
 
Fecha de Ingreso: abril-2014
Ubicación: Almería
Mensajes: 58
Antigüedad: 10 años
Puntos: 2
Respuesta: No crea cookie con CURL

La realizo de esta forma:

Código PHP:
require_once("HttpConnection.php");
$http = new HttpConnection();  
$http->setCookiePath("/cookies/");  
$http->init();  
echo (
$http->get("https://dominio/documento.asp?var=var")); 
Quizá es aquí donde lo estoy haciendo mal.
  #5 (permalink)  
Antiguo 15/09/2014, 09:33
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: No crea cookie con CURL

Prueba así:

Código PHP:
<?php 
require_once("HttpConnection.php"); 
$http = new HttpConnection();   
$http->setCookiePath("/cookies/");   
$http->init();   
  
$apost = array('usuario' =>"usuario"'password' => "pass"); 
  
echo (
$http->post("https://dominio/entrada.asp"$apost)); 
echo (
$http->get("https://dominio/documento.asp?var=var"));  

$http->close();
El close() te borra las cookies
__________________
>> Eleazan's Source
>> @Eleazan
  #6 (permalink)  
Antiguo 15/09/2014, 09:58
 
Fecha de Ingreso: abril-2014
Ubicación: Almería
Mensajes: 58
Antigüedad: 10 años
Puntos: 2
Respuesta: No crea cookie con CURL

No me guarda tampoco la sesión. La primera llamada bien, se loguea, pero la segunda nada.
  #7 (permalink)  
Antiguo 16/09/2014, 03:43
 
Fecha de Ingreso: abril-2014
Ubicación: Almería
Mensajes: 58
Antigüedad: 10 años
Puntos: 2
Respuesta: No crea cookie con CURL

SOLUCIONADOOOO!!!!!
Mil pruebas pero al final me guardó la cookie. Eso sí, he tenido que cambiar todo el código. El resultante aquí:

Código PHP:
Ver original
  1. <?php
  2. $user = 'usuario';
  3. $pass = 'password';
  4.  
  5. $ch = curl_init("https://dominio/entrada.asp");
  6. $cookies = getcwd() . "/cookies.txt";
  7.  
  8. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  9. curl_setopt($ch, CURLOPT_COOKIEFILE, $cookies);
  10. curl_setopt($ch, CURLOPT_COOKIEJAR, $cookies);
  11. curl_setopt($ch, CURLOPT_POSTFIELDS, 'usuario=' . urlencode($user) . '&password=' . urlencode($pass));
  12. curl_setopt($ch, CURLOPT_POST, true);
  13.  
  14. curl_exec($ch);
  15.  
  16.  
  17. $curl = curl_init();
  18. $otherPage = 'https://dominio/documento.asp?var=var';
  19. curl_setopt($curl, CURLOPT_URL, $otherPage);
  20. curl_setopt($curl, CURLOPT_COOKIEJAR, $cookies);
  21. curl_setopt($curl, CURLOPT_COOKIEFILE, $cookies);
  22. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  23. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  24. curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.12) Gecko/2009070611 Firefox/3.0.12");
  25. curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
  26. $contenido = curl_exec($curl);
  27. echo "<pre>";
  28. echo "<table border='1' align='center'><tr><td><textarea cols='120' rows='25'>".$contenido."</textarea>";
  29. echo "</pre>";
  30.  
  31. curl_close($curl);
  32.  
  33. ?>

Me loguea y luego realiza la segunda consulta perfecta. Estoy muy feliz!! jaja

Muchas gracias a todos.

Etiquetas: cookie, crea, curl
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:44.