
Hello tout le monde je vous ai préparé un petit tuto qui parcourt les principaux concepts de CURL. A la fin de cet article, vous serez donc capable de créer votre bibliothèque pour gérer vos blogs (du moins, en partie). J’ai choisi ici la plateforme Cowblog car la connexion et la création d’articles est ultra simple à développer avec CURL mais cela […]
Hello tout le monde
je vous ai préparé un petit tuto qui parcourt les principaux concepts de CURL. A la fin de cet article, vous serez donc capable de créer votre bibliothèque pour gérer vos blogs (du moins, en partie). J’ai choisi ici la plateforme Cowblog car la connexion et la création d’articles est ultra simple à développer avec CURL mais cela permet de bien comprendre les bases.
Les bases de CURL
Bon, on va commencer avec les bases de CURL.
Tout d’abord, il y a trois fonctions de bases qu’il faut connaître avant de démarrer :
- La fonction « curl_init » qui permet d’initialiser une session CURL
- La fonction « curl_setopt » qui permet de spécifier différentes options (on verra ça plus tard)
- La fonction « curl_exec » qui permet d’exécuter une requête
Pour commencer, nous allons simplement afficher le contenu du site http://www.devandseo.fr.
Voici donc le code qui montre les principales étapes d’une requête CURL:
1 2 3 4 5 6 7 8 |
/** 1) On initialise la session **/ $ch = curl_init() ; /** 2) On définit les options **/ curl_setopt($ch, CURLOPT_URL, 'http://www.devandseo.fr') /** 3) Exécution de la requête **/ curl_exec($ch) ; /** 4) Enfin, on ferme la session CURL **/ curl_close($ch) ; |
Normalement, en écrivant ce code, vous devez voir le contenu de mon blog sur votre écran.
Récupération d’informations (POST et GET)
Les options
Pour spécifier une option à CURL, on utilise, comme dit plus haut, la fonction « curl_setopt », dont les paramètres sont les suivants :
- 1er paramètre : la ressource CURL
- 2ème paramètre : l’option que l’on veut spécifier
- 3ème paramètre : la valeur à setter à l’option
Récupérer des informations
Dans l’exemple précédent, le contenu de la page est affiché directement dans le navigateur. On va maintenant voir comment récupérer ce contenu dans une variable (très simple également).
L’option à utiliser est : « CURLOPT _RETURNTRANSFER ».
Définie à true, le contenu de la page est renvoyé par la fonction curl_exec. Définie à false, la fonction curl_exec renvoi un booléen qui permet de vérifier la bonne exécution de la requête.
Donc, pour récupérer le contenu de mon blog dans une variable, il suffit d’écrire :
1 2 3 4 5 6 7 8 9 10 11 |
/** 1 ) On initialise la session **/ $ch= curl_init() ; /** 2) On définit les options **/ curl_setopt($ch, CURLOPT_URL, "http://www.devandseo.fr"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); /** 3) Exécution de la requête **/ $content = curl_exec($ch) ; /** 4) Enfin, on ferme la session CURL **/ curl_close($ch) ; /** 5) On affiche le contenu **/ echo $content ; |
Soumission de formulaire
Voilà, on a vu les bases, maintenant on va rentrer un peu plus dans le vif du sujet, en commençant par la soumission de formulaire.
Les options à connaître sont les suivantes :
- CURLOPT_POST : true pour « POST », false pour « GET » (par défaut)
- CURLOPT_POSTFIELDS : pour spécifier les données du formulaire
Pour récupérer les champs du formulaire à soumettre, je vous conseille d’installer le plugin « Web Developer ». Une fois sur la page du formulaire, faites un clic droit sur la page, choisissez « Web Developer », puis « Form » et enfin cliquez sur « Informations sur les formulaires ». Cela vous permettra de récupérer tous les champs du formulaires.
On va maintenant essayer de se connecter à notre blog Cowblog.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// Url du champ action du formulaire $urlLogin = 'http://www.cowblog.fr/auth.php'; $postField = array( 'user_id' => 'username', 'user_pwd' => 'password', ); $ch = curl_init($urlLogin); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $postField); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); curl_close($ch); echo $result; |
Comme vous pouvez le voir, c’est relativement simple … mais un peu dégueulasse. A la fin de ce tuto, vous trouverez le code complet un peu plus clean.
Les options
Les options dans CURL sont indispensables; il en existe une centaine si je ne dis pas de bêtise. On verra donc seulement les plus importantes, notamment celles concernant les proxies et les cookies.
Les proxies
Pour utiliser des proxies, trois fonctions sont utiles :
- CURLOPT_PROXY : le nom du proxy (IP:port)
- CURLOPT_PROXYUSERPWD : si le proxy nécessite une authentification (login:password)
- CURLOPT_HTTPPROXYTUNNEL : proxy de type HTTP
Les cookies
L’utilisation de cookie avec CURL va nous être utile car nous ne voulons nous reconnecter à chaque fois pour poster un article. On va donc, grâce aux cookies, mémoriser l’identification.
Voici un exemple de processus illustrant l’utilisation de cookies avec CURL :
- On se connecte sur son blog Cowblog et on sauvegarde les cookies contenant les données de connexion
- On ferme la session courante CURL
- On veut écrire un article sans se reconnecter : on initialise une session CURL et on charge les cookies stockés précédemment pour s’identifier
- On a maintenant accès aux pages nécessitant une identification
Trois options nous intéressent ici :
- CURLOPT_COOKIE : le contenu du cookie (nom=valeur)
- CURLOPT_COOKIJAR : le nom du fichier dans lequel curl va stocker les cookies internes.
- CURLOPT_COOKIFILE : le nom du fichier contenant les données des cookies à utiliser pour la session et qui ont été sauvegardés grâce à l’option CURLOPT_COOKIJAR.
Options utiles
Les autres options qui me semblent utiles et importantes sont les suivantes :
- CURLOPT_FRESH_CONNECT : forcer l’établissement d’une nouvelle connexion plutôt que celle en cache
- CURLOPT_HEADER : permet d’inclure les informations d’en-tête dans la valeur de retour (Content-Type, Transfer-Encoding, etc..)
- CURLOPT_HTTPHEADER : Permet de spécifier les valeurs d’en-têtes
- CURLOPT_NOBODY : pour indiquer à curl de ne pas lire le contenu (même si la variable Content-Lenght est définie)
- CUTLOPT_TIMEOUT : temps maximal d’exécution de la requête (en secondes), et donc de la fonction curl_exec
- CURLOPT_FOLLOWLOCATION : pour suivre les redirections de type ‘Location:’
- CURLOPT_MAXREDIRS : Nombre maximal de redirections http à suivre (si l’option CURLOPT_FOLLOWLOCATION est à true)
- CURLOPT_CONNECTTIMEOUT : durée maximale d’établissement de la connexion vers l’hôte (en secondes)
- CURLOPT_PORT : le port à utiliser pour la requête
- CURLOPT_AUTOREFERER : pour que CURL définisse automatiquement le referer (lors d’une redirection par exemple)
- CURLOPT_REFERER : pour spécifier votre propre referer
- CURLOPT_USERAGENT : pour spécifier un user-agent
Gestion des erreurs
Enfin, le dernier point avant l’exemple concret est la gestion des erreurs avec CURL. Avec CURL, j’ai déjà eu des bugs mystiques (type page blanche ou autres), et les fonctions d’erreurs de CURL m’ont souvent bien aidées, car elle permettent de récupérer de précieuses informations.
En gros, les fonctions sont les suivantes :
– La fonction « curl_errno » renvoi le code d’erreur de la requête (plus d’infos ici :codes d’erreur CURL)
– La fonction « curl_error » renvoi un string contenant le dernier message d’erreur.
– La fonction « curl_getinfo » permet de récupérer de nombreuses informations sur la requête (nombres d’octets envoyés ou reçus, vitesse de téléchargement, code HTTP, etc..)
Exemple concret
Maintenant que l’on a vu les bases de CURL et son utilisation générale, nous allons développer un script complet qui va nous permettre :
- De vous connecter sur votre blog Cowblog
- De poster un article récupérer le lien de ce dernier
J’ai utilisé l’héritage PHP car dans notre cas, il va nous permettre d’ajouter de nouvelles plateformes de blogs facilement en implémentant simplement les fonctions de connexion et de créations d’articles.
Notre classe mère :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?php abstract class Plateforme { protected $_username; protected $_password; protected $_cookieFilename; protected $_proxies; public function __construct($username, $password, $proxies) { $this->_username = $username; $this->_password = $password; $this->_proxies = $proxies; $this->_cookieFilename = realpath('cookies') . '/' . uniqid() . '.txt'; touch($this->_cookieFilename); } public function cleanResources() { if (file_exists($this->_cookieFilename)) unlink($this->_cookieFilename); } abstract function login(); abstract function createPost($title, $content); } ?> |
La classe Cowblog :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
<?php require_once 'Plateforme.php'; class Cowblog extends Plateforme { public function __construct($username = null, $password = null, $proxies = array()) { parent::__construct($username, $password, $proxies); } public function login($useProxy = false) { /* Identification */ $urlLogin = 'http://www.cowblog.fr/auth.php'; $postField = array( 'user_id' => $this->_username, 'user_pwd' => $this->_password, ); $ch = curl_init($urlLogin); curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $postField); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_COOKIE, true); curl_setopt($ch, CURLOPT_COOKIEJAR, $this->_cookieFilename); if ($useProxy && !empty($this->_proxies)) { curl_setopt($ch, CURLOPT_PROXY, $this->_proxies[rand(0, count($this->_proxies) - 1)]); curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, true); } $result = curl_exec($ch); $codeError = curl_errno($ch); $msgError = curl_error($ch); curl_close($ch); if (preg_match('/mauvais mot de passe./Ui', $result)) { return array( 'error' => true, 'msgError' => 'Error while connecting : username or password invalid', 'curlError' => array( 'msgError' => $msgError, 'codeError' => $codeError, ), ); } return array( 'error' => false, ); } public function createPost($title, $content, $useProxy = false) { $urlPost = 'http://www.cowblog.fr/post.php'; $postField = array( 'post_title' => $title, 'post_content' => $content, 'post-sub' => "Enregistrer l'article", 'post_status' => 1, 'post_dt' => date('Y-m-d'), 'open_comment' => 0, ); $ch = curl_init($urlPost); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $postField); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_COOKIE, true); curl_setopt($ch, CURLOPT_COOKIEFILE, $this->_cookieFilename); if ($useProxy && !empty($this->_proxies)) { curl_setopt($ch, CURLOPT_PROXY, $proxyRandom); curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, true); } $result = curl_exec($ch); $codeError = curl_errno($ch); $msgError = curl_error($ch); curl_close($ch); if (!preg_match('/a bien été créé./Ui', $result)) { return array( 'error' => true, 'msgError' => 'Error while posting', 'curlError' => array( 'msgError' => $msgError, 'codeError' => $codeError, ), ); } $permalink = null; $dom = new DOMDocument(); @$dom->loadHTML($result); $this->_domxpath = new DOMXPath($dom); $nodeList = $this->_domxpath->query('//div[@class="facebook"]/a/@href'); foreach ($nodeList as $node) { if ($node->nodeValue != '') { $permalink = $node->nodeValue; } } if ($permalink) { // Une petite regexp (faite à l'arrache :p) pour récupérer le lien de l'article preg_match('/http:\/\/www\.facebook\.com\/share\.php\?u\=(.*\.cowblog.fr.*\.html)/Ui', $permalink, $match); $permalink = !empty($match[1]) ? $match[1] : null; } $result = array( 'error' => false, 'permalink' => empty($permalink) ? 'cannot retrieve link' : $permalink, ); return $result; } } ?> |
Et enfin notre page index :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?php require_once 'Cowblog.php'; $cowblogInstance = new Cowblog('username', 'password'); $resultLogin = $cowblogInstance->login(); if ($resultLogin['error']) { echo '<strong>Error</strong> : ' . $resultLogin['msgError'] . '<br/>'; echo !empty($resultLogin['curlError']['msgError']) ? 'Curl message error = ' . $resultLogin['curlError']['msgError'] : '' . '<br/>'; echo !empty($resultLogin['curlError']['msgError']) ? 'with code ' . $resultLogin['curlError']['codeError'] : ''; } else { $resultPosting = $cowblogInstance->createPost('Mon super titre', 'Mon super contenu'); if ($resultPosting['error']) { echo '<strong>Error</strong> : ' . $resultPosting['msgError'] . '<br/>'; echo !empty($resultPosting['curlError']['msgError']) ? 'Curl message error = ' . $resultPosting['curlError']['msgError'] : '' . '<br/>'; echo !empty($resultPosting['curlError']['msgError']) ? 'with code ' . $resultPosting['curlError']['codeError'] : ''; } else { echo '<strong>Post was created</strong> : ' . $resultPosting['permalink']; } } $cowblogInstance->cleanResources(); ?> |
Pour aller plus loin
Bon, j’éspère que ce tuto vous a plu. Un dernier conseil, jetez un oeil à la fonction curl_multi_exec
Leave Your Response