Forum Clubic

Php & curl

Bonjour,

J’essaye de faire une fonction qui me permette d’acceder a une URL depuis une page PHP.
Pour acceder a cette page, il est necessaire au prealable de se logguer.
Apparemment, j’arrive a me logguer mais a garder la session d’un appel d’url a l’autre.

Voici le code:


function go_to_url($url, $form_method = 'POST', $data = NULL, $open_session = false, $cookie_file = NULL) {
  $curl = curl_init();
  
  curl_setopt($curl, CURLOPT_URL, $url);
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

  if ($form_method == 'POST' && $data) {
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  }
  else {
    curl_setopt($curl, CURLOPT_POST, 0);
    //GET should be handled here
    //add & at the end of the url (check before not already here) and loop on data to add URL parameters
    //TODO
  }

  if ($open_session) {
    curl_setopt($curl, CURLOPT_COOKIESESSION, true); 
    //output cookie file
    curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file);
  }
  elseif ($cookie_file) {
    curl_setopt($curl, CURLOPT_COOKIESESSION, true); 
    //input cookie file
    curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file); 
  }

  $page = curl_exec($curl);
  curl_close($curl);

  return $page;
}

function do_update() {
  $cookies_file = './tmp/1234_cookiefile.txt';

  if (file_exists($cookies_file)) {
    unlink($cookies_file);
  }

  //Open session
  $login_data = array('username' => 'AAAAA', 'password' => 'BBBB');
  go_to_url('http://www.xxxxx.com/login.php', 'POST', $login_data, true, $cookies_file);

  //Get values
  $page = go_to_url('http://www.xxxxx.com/pageY.php', NULL, NULL, false, $cookies_file);

  //Logout
  go_to_url('http://www.xxxxx.com/logout.php', NULL, NULL, false, NULL);

  if (file_exists($cookies_file)) {
    //unlink($cookies_file);
  }

  echo "<pre>".$page."</pre>";
}

do_update();

Quand j’affice le contenu de $page, clairement je ne suis pas loggue alors qu’apres le 1er appel, je le suis. Il doit y avoir un probleme avec le cookie de session mais lequel ?

Merci pour votre aide.

Termos
Edité le 22/11/2011 à 16:57

Il contient quoi ton fichier de cookie ? Est ce que c’est le même résultat que ce que tu as dans un browser pour le même utilisateur ?

(je ne connais pas CURL).

J’ai compare les 2 cookies et ils semblent identiques.
En fait, ce dont j’ai l’impression, c’est qu’il ne faut pas faire de curl_close entre les appels de page.
Les differents exemples que j’ai trouves sont contradictoires.

J’ai remanie le code pour garder le meme handler $curl tout au long de la session et ca semble marcher.
De ce fait, je ne fais le curl_close qu’a la fin.

Voila a quoi ca ressemble desormais :

function open_session($url, $form_method = 'POST', $data = NULL, $cookie_file = NULL) {
  $curl = curl_init();
  
  curl_setopt($curl, CURLOPT_URL, $url);
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 0);

  if ($form_method == 'POST' && $data) {
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  }
  else {
    curl_setopt($curl, CURLOPT_POST, 0);
    //GET should be handled here
    //add & at the end of the url (check before not already here) and loop on data to add URL parameters
    //TODO
  }

  curl_setopt($curl, CURLOPT_COOKIESESSION, true); 
  //output cookie file
  curl_setopt($curl, CURLOPT_COOKIEJAR,  $cookie_file);
  curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file); 

  curl_exec($curl);

  return $curl;
}

function close_session($http_handler, $url) {
  
  curl_setopt($http_handler, CURLOPT_URL, $url);
  curl_setopt($http_handler, CURLOPT_RETURNTRANSFER, 0);

  curl_exec($http_handler);
  curl_close($http_handler);
}

function go_to_url($http_handler, $url) {

  curl_setopt($http_handler, CURLOPT_URL, $url);
  curl_setopt($http_handler, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($curl, CURLOPT_POST, 0);

  $page = curl_exec($http_handler);

  return $page;
}

function do_update() {
  $cookies_file = '/tmp/1234_cookiefile.txt';

  if (file_exists($cookies_file)) {
    unlink($cookies_file);
  }

  //Open session
  $login_data = array('username' => 'AAAAA', 'password' => 'BBBB');
  $ch = open_session('http://www.xxxxx.com/login.php', 'POST', $login_data, $cookies_file);

  //Get values
  $page = go_to_url($ch, 'http://www.xxxxx.com/pageY.php');

  //Logout
  close_session($ch, 'http://www.xxxxx.com/logout.php');


  if (file_exists($cookies_file)) {
    //unlink($cookies_file);
  }

  echo "<pre>".$page ."</pre>";
}