K-wi média

Comment poster un formulaire avec curl et php

sept 11th 2008
Pas de commentaires
répondre
trackback

prérequis:

  • serveur web php5 avec libcurl activée (dans les modules php)
  • quelques connaissances sur la librairie cURL, et sur xpath de php
  • un compte sur technocrati

dans mon post d’aujourd’hui je vais vous expliquer comment poster un formulaire avec l’extension cURL de php.
mon but n’est pas d’expliquer toutes les options de cette librairie, mais simplement d’essayer de vous faire découvrir les capacités de cette formidable extension de php au travers d’un exemple simple mais assez sympa pour pouvoir montrer la puissance de cURL.

dans cet exemple on va tout simplement se connecter sur technocrati (exemple de login classique), récupérer un token, et poster le formulaire d’ajout de tags des favoris, pour finir on affichera le résultat.

comme avec cURL on est assez souvent ammenés a refaire le même chose alors j’ai fini par écrire 2 fonctions:
la premiére qui affiche simplement une page:

notre fonction hitPage:
  1. function hitPage($page) {
  2.     $ch = curl_init();
  3.      curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies.txt");
  4.      curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies.txt");
  5.      curl_setopt($ch, CURLOPT_URL, $page);
  6.      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  7.      $ret = curl_exec($ch);
  8.      curl_close($ch);
  9.      return $ret;
  10. }

comme vous le voyez cette fonction peut simuler le cookies, ici cela implique que vous ayez au préalable créé un fichier cookies.txt et qu’il soit accessible par cette fonction.

la seconde, un peu plus élaborée quant-a elle poste un formulaire: en effet elle envoie de données post sur une page que l’on choisit (notez que elle aussi est capable de simuler des cookies mais aussi un navigateur: du coup vous connaissez mon navigateur ainisi que mon os ;-) ).

notre fonction hitForm:
  1.  
  2. function hitForm($loginURL, $loginFields, $referer="") {
  3.     $ch = curl_init();
  4.     $agent = "Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.0.1) Gecko/2008072820 Firefox/3.0.1";
  5.      curl_setopt($ch, CURLOPT_URL, $loginURL);
  6.      curl_setopt($ch, CURLOPT_USERAGENT, $agent);
  7.      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  8.      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  9.      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  10.      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
  11.      curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies.txt");
  12.      curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies.txt");
  13.      curl_setopt($ch, CURLOPT_POSTFIELDS, $loginFields);
  14.      curl_setopt($ch, CURLOPT_REFERER, $referer);
  15.  
  16.      $ret = curl_exec($ch);
  17.      curl_close($ch);
  18.      return $ret;
  19. }

a part ça?

comme vous avez surement put le voir si vous vous êtes un peu documentés sur cURL il existe une extension trés utile pour firefox qui s’appelle live http headers qui permet de voir ce que l’on envoie et ce que l’on reçoit.
je ne saurais trop vous conseiller de la télécharger (un coup de google devrait suffir pour la trouver).

ok si tout le monde est la, on peut y aller:

on va commencer par créer ce fichier pour contenir nos cookies

  $fp = fopen(”cookies.txt”,'wb');
  1.      fclose($fp);

a présent il nous suffit d’envoyer nos coordonnées(login&pass) afin de pouvoir nous connecter

on se connecte :
  1.  
  2.     $username = "VOTRE_LOGIN_ICI";
  3.     $password = "VOTRE_MOT_DE_PASSE_LA";
  4.     //on poste le formulaire de login
  5.  
  6.     $loginURL    = "http://technorati.com/account/login";
  7.     $loginFields = "username=$username&password=$password";
  8.     hitForm($loginURL, $loginFields);

nous sommes donc connectés a présent il nous faut récupérer un token pour pouvoir ajouter notre favori:

//comment recupérér le token?
  1.     $addURL = "http://technorati.com/faves/$username?add=http%3A%2F%2Fk-wi.com%2Fblog";
  2.     $html = hitPage($addURL);
  3.     $dom  = new DOMDocument();
  4. // grace a xpath on va pouvoir recupérer le html sous forme de noeuds DOM
  5.  
  6.     @$dom->loadHTML($html);
  7.     $xpath = new DOMXPath($dom);
  8. //
  9.  
  10.     $inputs  = $xpath->evaluate("/html/body//input");
  11.     $myinput = $inputs->item(4);
  12.     $myvalue = $myinput->getAttribute('value');

au cas ou tout ne serait pas clair un peu de “googling” sur xpath va vous aider a comprendre ce bout de code
vous avez un trés bon article ici :
et un autre la

qui sont tous les 2 trés interessants.

a présent on va enfin pouvoir poster ce formulaire de favoris:

//on poste le formulaire de favoris
  1.  
  2.     $favesURL   = "http://technorati.com/faves/$username";
  3.  
  4.     $favesFieldz = "add=http%3A%2F%2Fk-wi.com%2Fblog&c=$myvalue&tag=%22agence+web%22%2C+perpignan%2C+internet%2C+php";
  5.  
  6.     hitForm($favesURL, $favesFieldz);

voila il ne reste plus qu’a afficher le resultat!

echo hitPage("http://technorati.com/faves/$username");

le code complet ici


Cet article a des tags , ,

0 commentaires