- Introduction aux flux PHP:
Le flux désigne une suite de donnée ; il décrit une continuité, un écoulement. Ils reposent sur le même principe que la gestion des fichiers. Dans ce tutoriel je vais aborder en particulier la bibliothèque cURL ainsi qu'un protocole réseau : HTTP. Nous allons voir ainsi comment envoyer des requêtes à un serveur, en l’occurrence celui d'OGame. Ce sera en soit les tout premiers pas pour commencer à développer un bot pour les jeux sur navigateur.
- Le protocole HTTP 1.1:
Hypertext Transfert Protocol est un protocole d'échange de données entre un client et un serveur web relié au réseau (Bien souvent Apache). Nous l'utilisons tous couramment, avec nos navigateurs web notamment même si d'autres logiciels, tels que les aspirateurs webs ou les bots d’indexation l'utilisent également. Il a besoin d'une connexion fiable pour fonctionner correctement, on utilise donc le protocole de transport TCP pour l'utiliser. Il faut savoir également que par convention, presque tout les serveurs webs utilisent le port 80 part défaut ou le 443 quand la connexion est sécurisée.
Il est possible d'identifier près de 8 commandes différentes :
• GET : Elle permet d'accéder à une ressource sans la modifier.
• HEAD : Demande des informations sur une ressource, sans accéder à la ressource elle-même.
• POST : Permet de modifier une ressource & d'envoyer des données.
• OPTIONS : Permet d'obtenir les options de communication d'une ressource ou du serveur en général.
• TRACE : Demande au serveur de renvoyer ce qu'il vient de recevoir pour effectuer un diagnostique de la connexion.
• PUT : Ajoute une ressource sur le serveur.
• DELETE : Supprime une ressource du serveur. Bien sûr, ces deux dernières commandes ne sont pas accessibles à n'importe qui.
Nous n'utiliserons dans ce tutoriel que les trois plus courantes, à savoir GET, POST & HEAD. Concrètement nous allons analyser les échanges entre notre navigateur web (Chrome ou Mozilla) et les serveurs d'OGame puis, les reproduire. Je pense que si vous comprenez la démarche avec ce jeu, il est possible de la comprendre avec n'importe lequel.
Il existe plusieurs méthodes en PHP pour communiquer avec un serveur via HTTP. Les sockets, la bibliothèque cURL et l'extension HTTP. Dans ce tutoriel je vous montrerais comment exploiter la seconde solution : cURL. Elle est simple à mettre en oeuvre, comprend toutes les fonctions dont nous allons avoir besoin et est très flexible.
/!\ Je tiens à rappeler que ce tutoriel ne traite que de la connexion à Ogame.
- L'utilisation de cURL :
Ajoutée à la mise à jours 4.0.2 de PHP, cURL est une bibliothèque de fonctions développée par Daniel Stenberg. Elle permet de se connecter sur de nombreux serveurs et par de nombreux protocoles (HTTP, HTTPS, FTP, Telnet etc...). Il est avec possible de développer de nombreux types d'applications : automatiser des tâches, rediriger les informations de divers site vers une seule plate-forme, faire son propre proxy etc... Pour la connexion, nous ne développerons ici qu'une fonction. Elle se connectera à oGame. Nous verrons certainement plus tard, dans un autre tutoriel comment parser la réponse du serveur pour en extraire les informations.
Envoyer une requête :
Pour apprendre à utiliser cURL, nous allons commencer par apprendre à envoyer une simple requête GET. Pour commencer nous devons initialiser notre session cURL :
$cURL = curl_init();
Il faut ensuite définir les options à utiliser pour notre requête. Il existe alors deux solutions. La première consiste à utiliser la fonction curl_setopt() ou curl_setopt_array(). La documentation PHP donne toutes les valeurs possibles à transmettre en option. Comme vous vous en doutez, la seconde fonction demande un array comme argument. Celui-ci regroupe toutes les options à définir :
$options = array(
// L'URL de la page que nous allons demander au serveur.
CURLOPT_URL => 'www.cadernis.fr',
// Ne pas inclure l'en-tête HTTP dans la valeur de retour.
CURLOPT_HEADER => false,
// Retourne la valeur de retour dans une variable au lieu de l'afficher directement.
CURLOPT_RETURNTRANSFER => true,
// PHP traite silencieusement les erreurs supérieurs au code 400.
CURLOPT_FAILONERROR => true
);
// On définit nos options à notre ressource cURL.
curl_setopt_array($cURL, $options);
Pour exécuter notre requête il faut employer la fonction curl_exec(). Elle doit toujours être appelée après l'initialisation & le paramétrage de la session. Elle demande comme unique argument la session cURL à exécuter et renvoi la réponse du serveur à notre requête.
$response = curl_exec($cURL);
Nous allons vérifier qu'aucune erreur ne s'est produite lors de l’exécution de la requête via curl_errno().
if (curl_errno($cURL))
{
echo "cUrl_exec : " . curl_error($cURL);
}
Si il n'y a eu aucunes erreurs, alors il faut simplement fermer notre session cURL avec curl_close() puis afficher la valeur de retour de notre requête.
curl_close($cURL);
echo $response;
Si vous exécuter ce script, vous verrez sans aucuns doutes que la page retournée est différente de l'originale. Le fond ainsi que les boutons "entrer" & "sortir", sont transparents. C'est parce que les liens utilisés par le site sont des liens relatifs et non pas des liens absolus. Ils ne contiennent qu'une partie de l'adresse et font donc référence à des ressources locales. La solution est alors de réécrire les liens ! Ce n'est cependant pas l'objet de ce tutoriel. Si vous voulez tout de même vous informer sur ce sujet :
• http://www.php.net/manual/fr/ref.strings.php
• http://fr2.php.net/manual/fr/book.regex.php
Se connecter à oGame :
{U.C}
Code final:
function connection_oGame($username, $password, $idUniverse)
{
// L'URL du script de connexion d'oGame.
$URL = "http://www.ogame.fr/main/login";
// Les champs à envoyer en requête POST.
$postFields = array("kid" =>"", "uni" => "uni" . $idUniverse . ".ogame.fr", "login" => $username, "pass" => $password);
// Les options cURL que nous allons utiliser pour notre requête.
$options =array(
// L'URL de la page.
CURLOPT_URL => $URL,
// Retour de la requête dans une variable au lieu de l'afficher directement.
CURLOPT_RETURNTRANSFER => true,
// Ne pas inclure l'en-tête de réponse du serveur dans la chaine retournée.
CURLOPT_HEADER => false,
// Gestion des codes d'erreur HTTP supérieurs ou égaux à 400.
CURLOPT_FAILONERROR => true,
// Effectuer une requête de type POST.
CURLOPT_POST => true,
// L'array associatif qui contient les informations à envoyer.
CURLOPT_POSTFIELDS => $postFields,
// Spécifie automatiquement le "referer:" pour les requêtes contenant une redirection.
CURLOPT_AUTOREFERER => true,
// Le fichier dans lequel sauvegarder tout les cookies utilisés durant la session.
CURLOPT_COOKIEJAR => 'cookie.txt',
// Force cURL à ignorer les anciens cookies de "session".
CURLOPT_COOKIESESSION => true,
// Permet de suivre automatiquement une redirection.
CURLOPT_FOLLOWLOCATION => true
);
// On initialise notre session cURL.
$cURL = curl_init();
// On paramètre nos options à utiliser pour la requête.
curl_setopt_array($cURL, $options);
// Exécution de la requête
$response = curl_exec($cURL);
// Si il s'est produit une erreur, on la retourne :
if(curl_errno($cURL))
{
return "cUrl_exec : " . curl_error($cURL);
}
return $response;
// On ferme notre session cURL.
curl_close($cURL);
}