Utiliser cURL (PHP)

Présentation de cURL

Cette bibliothèque vous permet de communiquer avec des sites distants.

Par exemple, il vous est possible via cURL de récupérer la source d'une page externe, d'envoyer une requête POST, ...

À la fin de ce tutoriel, vous serez capable de :

  • Récupérer la source d'une page
  • Envoyer des requêtes POST à une page (y comprit l'envoi de fichiers)
  • Se connecter à un site, puis visiter des pages en gardant la connexion

Le tutoriel sera accompagné d'exemples, permettant d'interagir avec l'hébergeur MegaUpload.

Update : le site étant fermé, mes exemples aux travers de cet article ne fonctionne plus. Je les ai cependant laissé pour que vous puissiez comprendre les différentes fonctions de cURL.

Récupérer la source d'une page

Première étape, initialiser une nouvelle session cURL.

1 $curl = curl_init();

Cette fonction retourne un identifiant de session cURL, que nous utiliserons plus tard avec les fonctions curl_setopt, curl_exec, et curl_close.

Maintenant, nous allons devoir définir des options de transmission à cette session.

Il va par exemple falloir lui fournir l'url de la page à récupérer.

1 curl_setopt($curl, CURLOPT_URL, 'http://google.fr');

Cette session interagira alors avec l'adresse : http://google.fr.

Il est aussi possible de définir cette option directement en initialisant la session :

1 $curl = curl_init('http://google.fr');

Deuxième option à définir :

1 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

Cette option permet d'indiquer que nous voulons recevoir le résultat du transfert au lieu de l'afficher.

Nous pouvons (et je vous le recommande) de définir une autre option :

1 curl_setopt($curl, CURLOPT_COOKIESESSION, true);

Cette option permet de dire à cURL de démarrer un nouveau cookie session.

Cela lui force alors à ignorer tous les cookies provenant de sessions antérieures.

Pour récupérer la source d'une page, nous n'avons pas besoin d'utiliser plus d'options.

Il suffit ensuite d'exécuter la requête :

1 $return = curl_exec($curl);

La variable $return a alors récupéré la source de la page distante.

Il nous reste maintenant plus qu'à fermer la session cURL :

1 curl_close($curl);

Cela ferme la session cURL et libère toutes ses ressources réservées.

Envoyer une requête POST

Introduction

Le code de base est le même que précédemment. Nous allons juste à lui ajouter de nouvelles options.

Rappel du code de base :

 1 $lien = 'http://google.fr';
 2 
 3 $curl = curl_init();
 4 
 5 curl_setopt($curl, CURLOPT_URL, $lien);
 6 curl_setopt($curl, CURLOPT_COOKIESESSION, true);
 7 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
 8 
 9 $return = curl_exec($curl);
10 curl_close($curl);

Nous allons alors ajouter de nouvelles options, toujours via la fonction curl_setopt.

Pour envoyer une requête POST, il va alors tout d'abord dire à la fonction de faire un HTTP POST (comme pour les formulaires) :

1 curl_setopt($curl, CURLOPT_POST, true);

Ensuite, il va falloir définir via un array sur les requêtes POST à envoyer.

Pour que vous compreniez bien, nous allons utiliser un exemple concret : Se connecter à son compte MegaUpload.

En regardant d'un peu plus près le code source de la page de connexion (http://megaupload.com/?c=login), on remarque qu'il nous faut envoyer 3 informations :

  • username : le pseudo de votre compte
  • password : le mot de passe de votre compte
  • login : C'est une spécialité pour le site MegaUpload, cela doit toujours valoir "1"

Sous forme d'array, on obtient :

1 $postfields = array(
2     'username' => $login,
3     'password' => $password,
4     'login' => '1'
5 );

Il suffit alors ensuite d'ajouter une nouvelle option contenant ces données :

1 curl_setopt($curl, CURLOPT_POSTFIELDS, $postfields);

Et si les données sont correctes, cela vous connecte à votre compte MegaUpload.

 1 $lien = 'http://megaupload.com/?c=login';
 2 $postfields = array(
 3     'username' => 'test',
 4     'password' => 'test',
 5     'login' => '1'
 6 );
 7 
 8 $curl = curl_init();
 9 
10 curl_setopt($curl, CURLOPT_URL, $lien);
11 curl_setopt($curl, CURLOPT_COOKIESESSION, true);
12 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
13 curl_setopt($curl, CURLOPT_POST, true);
14 curl_setopt($curl, CURLOPT_POSTFIELDS, $postfields);
15 
16 $return = curl_exec($curl);
17 curl_close($curl);
18 
19 if (!preg_match('#Username and password do not match#i', $return))
20 {
21     echo 'Connexion ok.';
22 }
23 else
24 {
25     echo 'Connexion échoué.';
26 }

Garder la connexion

Avec l'exemple précédent, nous nous sommes connectés.

Ok, c'est bien, sauf que si vous refaites une requête avec cURL, vous aurez perdu la connexion.

Pour ne pas perdre la connexion, nous allons alors sauvegarder les cookies lors de la connexion.

Pour cela, nous allons ajouter une nouvelle option qui va sauvegarder les cookies récupérés dans un fichier :

1 $path_cookie = 'connexion_megaupload_temporaire.txt';
2 if (!file_exists(realpath($path_cookie))) touch($path_cookie);
3 
4 curl_setopt($curl, CURLOPT_COOKIEJAR, realpath($path_cookie));

Attention cependant de bien avoir les permissions pour créer ce fichier.

Il nous suffira alors récupérer le contenu de ce fichier pour être encore connecté lors de la prochaine requête.

Donc lors de la deuxième requête, on ajoute ceci : php curl_setopt($curl, CURLOPT_COOKIEFILE, $path_cookie);

Ne pas oublier à la fin de supprimer ce fichier :

1 unlink($path_cookie);

Exemple complet :

 1 $lien = 'http://megaupload.com/?c=login';
 2 $postfields = array(
 3     'username' => 'test',
 4     'password' => 'test',
 5     'login' => '1'
 6 );
 7 $path_cookie = 'connexion_megaupload_temporaire.txt';
 8 if (!file_exists(realpath($path_cookie))) touch($path_cookie);
 9 
10 $curl = curl_init();
11 
12 curl_setopt($curl, CURLOPT_URL, $lien);
13 curl_setopt($curl, CURLOPT_COOKIESESSION, true);
14 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
15 curl_setopt($curl, CURLOPT_POST, true);
16 curl_setopt($curl, CURLOPT_POSTFIELDS, $postfields);
17 curl_setopt($curl, CURLOPT_COOKIEJAR, realpath($path_cookie));
18 
19 $return = curl_exec($curl);
20 curl_close($curl);
21 
22 if (preg_match('#Username and password do not match#i', $return))
23 {
24     echo 'Connexion échoué.';
25     exit;
26 }
27 
28 $lien2 = 'http://megaupload.com/?c=account';
29 
30 $curl = curl_init();
31 
32 curl_setopt($curl, CURLOPT_URL, $lien2);
33 curl_setopt($curl, CURLOPT_COOKIESESSION, true);
34 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
35 curl_setopt($curl, CURLOPT_POST, true);
36 curl_setopt($curl, CURLOPT_POSTFIELDS, $postfields);
37 curl_setopt($curl, CURLOPT_COOKIEFILE, realpath($path_cookie));
38 
39 $return = curl_exec($curl); // On récupère alors la source de la page "account" de votre compte MegaUpload
40 curl_close($curl);
41 
42 unlink($path_cookie);

Envoyer des fichiers

Il est bien entendu aussi possible d'envoyer des fichiers.

Nous allons prendre comme exemple d'héberger un nouveau fichier sur votre compte MegaUpload.

Nous utiliserons la page : http://www.megaupload.com/multiupload/index.php

En analysant la page, vous remarquerez que l'action du formulaire est dynamique. En effet, MegaUpload attribut un UPLOAD_IDENTIFIER à chaque chargement de page.

Nous allons donc devoir procéder en deux étapes :

  • Récupérer une première fois la source de la page pour récupérer un UPLOAD_IDENTIFIER
  • Envoyer notre fichier sur le compte MegaUpload

A savoir qu'il faut tout d'abord être connecté.

 1 // ... Code permettant de se connecter à notre compte
 2 
 3 $curl = curl_init();
 4 
 5 curl_setopt($curl, CURLOPT_URL, 'http://www.megaupload.com/multiupload/index.php');
 6 curl_setopt($curl, CURLOPT_COOKIESESSION, true);
 7 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
 8 curl_setopt($curl, CURLOPT_COOKIEFILE, realpath($path_cookie));
 9 
10 $action_dynamique = preg_match('#action="(http://www[0-9]{0,5}.megaupload.com\/upload_done.php\?UPLOAD_IDENTIFIER=[0-9]{1,20})"#i', $result, $matches);
11 $action = $action_dynamique[1];

Ce code a pour but donc de récupérer l'url de l'action dynamique (dans la variable $action). Rien de nouveau sur l'utilisation de cURL.

Il nous suffit alors maintenant d'envoyer notre fichier.

En analysant le code source une fois de plus de cette même page, vous verrez qu'il faut envoyer en données :

  • multifile_0 : notre fichier
  • multimessage_0 : la description de notre fichier
  • accept : doit toujours valoir "on", c'est le champ qui permet de dire que vous acceptez les conditions

Pour ajouter notre fichier :

1 $fichier = 'mon_fichier_a_up.txt';
2 $postfields["multifile_0"] = '@' . realpath($fichier);

Il faut donc comme vous le voyez, ajouter un arrobase suivi du chemin vers le fichier à uploader (uploader = héberger).

Nous avons donc tout pour pouvoir faire notre code :

 1 // ... Code permettant de se connecter à notre compte
 2 
 3 $curl = curl_init();
 4 
 5 curl_setopt($curl, CURLOPT_URL, 'http://www.megaupload.com/multiupload/index.php');
 6 curl_setopt($curl, CURLOPT_COOKIESESSION, true);
 7 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
 8 curl_setopt($curl, CURLOPT_COOKIEFILE, realpath($path_cookie));
 9 
10 $action_dynamique = preg_match('#action="(http://www[0-9]{0,5}.megaupload.com\/upload_done.php\?UPLOAD_IDENTIFIER=[0-9]{1,20})"#i', $result, $matches);
11 $action = $action_dynamique[1];
12 
13 $fichier = 'fichier_a_uploader.txt';
14 
15 $postfields = array(
16     'multifile_0' => '@' . realpath($fichier),
17     'multimessage_0' => 'Fichier : ' . $fichier,
18     'accept' => 'on'
19 );
20 
21 $curl = curl_init();
22 
23 curl_setopt($curl, CURLOPT_URL, $lien);
24 curl_setopt($curl, CURLOPT_COOKIESESSION, true);
25 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
26 curl_setopt($curl, CURLOPT_POST, true);
27 curl_setopt($curl, CURLOPT_POSTFIELDS, $postfields);
28 curl_setopt($curl, CURLOPT_COOKIEFILE, realpath($path_cookie));
29 
30 $return = curl_exec($curl);
31 curl_close($curl);
32 
33 preg_match("#var multiresult = new Array \( Array\('(.*)', '(.*)', 'http://www.megaupload.com\/\?d=([[:alnum:]]{8})#i", $result, $matches);
34 
35 unlink($path_cookie);
36 
37 $votre_lien_megauplad_de_votre_fichier = 'http://megaupload.com/?d=' . $matches[3];

Vous savez alors maintenant utiliser toutes les fonctions importantes de cURL.

Vous pouvez trouver d'autres informations sur cette bibliothèque sur php.net.

Et plus précisément si vous souhaitez ajouter d'autres options à votre requête : http://www.php.net/manual/fr/function.curl-setopt.php.


PHP cURL

Article publié le 28 Novembre 2011.

Commentaires