Utiliser le protocole IRC avec PHP

Formation

En Semi-présenciel Paris

Prix sur demande

Appeler le centre

Avez-vous besoin d'un coach de formation?

Il vous aidera à comparer différents cours et à trouver la solution la plus abordable.

Description

  • Typologie

    Formation

  • Méthodologie

    En semi-présentiel

  • Lieu

    Paris

Grâce à cette formation vous pourrez acquérir les connaissances nécessaires qui vous permettrons d’ajouter des compétences à votre profil et obtenir de solides aptitude qui vous offriront de nombreuses opportunités professionnelles.

Les sites et dates disponibles

Lieu

Date de début

Paris ((75) Paris)
Voir plan
7 Cité Paradis, 75010

Date de début

Consulter

Questions / Réponses

Ajoutez votre question

Nos conseillers et autres utilisateurs pourront vous répondre

À qui souhaitez-vous addresser votre question?

Saisissez vos coordonnées pour recevoir une réponse

Nous ne publierons que votre nom et votre question

Les Avis

Le programme

Introduction du cours

PHP, en plus de permettre de rendre son site Web interactif, permet de faire des programmes (voir le tutoriel sur PHP-CLI de gnomnain). Mais il permet aussi de dialoguer avec d'autres serveurs ! Vous pouvez donc faire avec PHP beaucoup de choses, comme un indexeur de pages (via cURL), un lecteur de news RSS… mais vous pouvez aussi dialoguer avec un serveur IRC facilement ! C'est ce que l'on va voir dans ce tutoriel.

IRC, kézako ?

IRC, pour Internet Relay Chat, est un des premiers (peut-être même le premier) protocole de communication instantanée informatique au monde. Il a été créé en 1988 ; c'est un protocole public contrairement à d'autres (MSN, Yahoo! Messenger et d'autres), qui est aussi relativement simple si on le compare aux autres protocoles existants. Ici, pas de cryptage (enfin si, mais c'est optionnel et on ne le verra pas ici), pas de trucs compliqués, IRC est un protocole simple.

Cliquez sur les images pour accéder aux sites des clients

De nombreux clients existent pour IRC et dans à peu près n'importe quel langage de programmation supportant l'accès au réseau. Le plus connu est mIRC, mais il en existe plein d'autres, comme notamment XChat, tinyIRC (un client qui tient uniquement dans 150 Ko !), Konversation sous Linux, ChatZilla, qui est un client dans un simple plugin pour Firefox, ou même Irssi, un client en console très performant (voir le tutoriel à ce sujet). On trouve même des clients qui combinent IRC et d'autres protocoles (MSN, ICQ, Jabber), comme par exemple Miranda IM sous Windows, ou Pidgin sous Linux.

Mais le client que vous devriez voir est Mibbit, un client écrit en PHP et en AJAX (avec un truc en Java derrière quand même).

Pour plus d'informations sur le protocole IRC, je vous conseille d'aller voir le document le décrivant et qui nous servira durant tout le tutoriel (gardez-le ouvert) : la RFC 1459 (ici en français).

Et PHP dans tout ça ?

PHP permet tout simplement de dialoguer avec un serveur IRC, comme n'importe quel client ! Vous pouvez ainsi créer différents programmes en PHP pour intéragir avec IRC, comme principalement les bots. Mais faites attention, les bots IRC (PHP, Python et dans d'autres langages) sont légion sur Internet, donc vous vous ferez peut-être mal voir étant donné que vous (re)développez un truc déjà développé X fois…

On en arrive à notre fil rouge, que je vais utiliser pour vous apprendre à utiliser IRC avec PHP durant ce tutoriel : la création d'un bot. Oui, je sais que j'ai dit que c'était mal, mais le problème c'est que développer un autre truc comme par exemple un client, c'est beaucoup plus dur, donc je vous montre comment faire un bot. Maintenant, après ce tutoriel, libre à vous de faire un bot, ou de faire autre chose.

Construction théorique du programme

Bon, maintenant, qu'est-ce que l'on va faire comme bot ? Eh bien, je vous propose un bot relativement simple à faire : un bot de quiz. Réaliser ce genre de bot est relativement facile, car il ne fait que poser des questions et vérifier les réponses…

I. Cahier des charges

Voici ce que fera notre bot :

  • poser des questions ;

  • comprendre les réponses, et dire qui a bien répondu (en premier) ;

  • empêcher le lancement de deux questions en même temps ;

  • auto-rejoin on kick (si on le vire du canal, on le fait revenir immédiatement).

Voilà, c'est tout. Ce n'est pas beaucoup, mais je juge que c'est déjà bien pour un premier bot.

II. Solutions pour le cahier des charges1. Structuration de la « base de données » de questions

Pour stocker les questions du bot, nous allons utiliser un unique fichier pour toutes les questions. Nous n'utiliserons pas de BDD, car c'est relativement lent et gourmand en mémoire ; et pour juste une liste de questions, nous n'allons pas nous embêter à faire du SQL. On structurera le fichier de sorte à pouvoir extraire les questions dans un array.

Je vous propose dans ce tutoriel un type de structuration pour vos questions, mais vous pouvez en choisir un autre.

Tout d'abord, dans notre fichier, les questions seront séparées par ligne. Donc à une ligne correspondra un composé question-réponse.
Ensuite, la question sera séparée de la réponse par une chaîne de caractères définie au préalable. Pour ce bot, je vais choisir cette chaîne de caractères :

<|#()#|>

Bien sûr, cette chaîne de caractères ne devra se trouver ni dans la question, ni dans la réponse.

Voici donc un exemple de fichier de questions que vous pouvez utiliser avec ce bot :

Quel est le nom du premier langage de programmation encore utilisé actuellement ?<|#()#|>FORTRAN Que veut dire PHP ?<|#()#|>PHP Hypertext Preprocessor Quelle est la propriété CSS pour définir la bordure d'un bloc ?<|#()#|>border Quand a été créé le Site du Zéro ?<|#()#|>1999 Quelle est la Réponse à la Grande Question de la Vie, de l'Univers et du Reste ?<|#()#|>42 Qui a créé Linux ?<|#()#|>Linus Torvalds Qui est à l'initiative du projet de système d'exploitation libre GNU ?<|#()#|>Richard Stallman

Pour mon fichier de questions, j'aurais pu utiliser une structure XML, mais c'est assez dur de naviguer dans les nœuds XML et surtout trop compliqué pour le petit bot que l'on va faire. C'est déjà assez compliqué avec le protocole IRC, on ne va pas rajouter en plus le XML (mais si vous voulez le faire, libre à vous).

2. Structuration globale du programme

Maintenant, on passe à la construction (théorique) globale du programme, on mettra les différentes étapes de fonctionnement du bot (regroupées en catégories).

Lecture des questions sur le fichier

Ici, l'étape est plus que simple et sera effectuée avant la connexion au serveur IRC :

  1. on ouvre le fichier des questions et on le lit ;

  2. on extrait chaque couple question/réponse ;

  3. on sépare la question et la réponse.

Comme vous le voyez, rien de plus simple. Si vous n'y arrivez pas, retournez consulter le tutoriel sur la manipulation des fichiers, de M@teo21.

Connexion au serveur IRC

Alors pour IRC, la connexion se passe en plusieurs étapes :

  1. on ouvre la connexion au serveur (au hasard, irc.epiknet.org sur le port 6667) ;

  2. on indique le pseudonyme (nick) du bot, avec la commande NICK ;

  3. on indique le « vrai nom » du bot (username)via la commande USER ;

  4. le serveur nous envoie une requête de PING ;

  5. on rejoint le canal où le bot doit être (au hasard, #sdz-quiz).

Cette démarche n'est pas propre à PHP, mais au protocole IRC. Si vous essayez de vous connecter directement au serveur IRC (avec Telnet par exemple), vous verrez que vous devez exécuter ces mêmes étapes.

D'ailleurs, en réalité il y a une étape « 4,5 » qui correspond à la reception du MOTD, mais ici le MOTD ne nous intéresse pas, donc on ne le met pas dans la description théorique.

Lorsque le bot est au repos (pas de question posée)

  1. On voit s'il y a un nouveau message.

    1. Si oui, on regarde si c'est une demande de question.

      1. S'il y en a une, on passe en « mode question ».

      2. Sinon, on ne fait rien.

    2. Si non, on passe.

  2. On regarde si le serveur nous a envoyé un PING.

    1. Si oui, on renvoie un PONG.

    2. Si non, on ne fait rien.

  3. On regarde si on a été kické (éjecté) du canal.

    1. Si oui, on retourne dans le salon.

    2. Si non, on ne fait rien

Ça a l'air long, mais ne vous inquiétez pas, ça se résume par peu de lignes de code.

Quand on a demandé une question (« mode question »)

  1. On regarde s'il y a un message.

    1. Si oui, on vérifie si c'est la réponse à la question.

      1. Si oui, on affiche « Bravo ! » ou un message du genre.

      2. Si non, on ne fait rien.

    2. Si non, alors on ne fait rien.

Pour le reste du mode de fonctionnement, on le fait à l'image du mode au repos (à partir du 2.).

Voilà pour le mode de fonctionnement, maintenant on passe à la création, où tout le mode pratique de la connexion à IRC avec PHP va vous être expliqué !

Pratique — Codage

Maintenant, on va (enfin) coder le bot en lui-même. Au départ, on va coder chaque partie séparément, puis nous rassemblerons le tout pour former le bot final.

Préparation

Tout d'abord, nous allons nous préparer pour créer le bot. Je vous conseille de créer un dossier rien que pour le bot, même si à la fin, il n'y aura que deux fichiers. Pourquoi ? Tout simplement pour éviter de se perdre dans une masse de fichiers.

Maintenant, créez un fichier appelé bot.php (le bot), et un fichier questions.txt (les questions), dans lequel vous mettrez vos questions (si vous n'avez pas d'idée pour tester, prenez le fichier d'exemple que j'ai mis plus haut).

Voilà, on est prêts à commencer !

Le codage

Alors, comme je l'ai dit plus haut, on va le faire par étapes, puis à la fin rassembler le tout. Je vous conseille d'avoir gardé ouverte la RFC 1459 (le lien est en haut du tuto), car je vais y faire pas mal de références.

Note : ici, je ne vais pas faire de connexion avec un mot de passe. Ce sera à vous de le faire plus tard, si vous en avez besoin (ce n'est pas très difficile de toute façon).

Citation : Informations utiles pour le bot

Serveur : irc.epiknet.org port 6667
Nom du bot : QuizBot
Canal : #quiz-sdz
Nom d'utilisateur (username) : Quiz

Le nom d'utilisateur ne nous sera pas très utile.

1. Construction de la liste des questions-réponses

Ici, rien de plus simple, on récupère la totalité du fichier dans une variable, viafile_get_contents() , puis on sépare questions et réponses, et éventuellement on retire le dernier élément si celui-ci est vide (c'est relatif aux fichiers, certains éditeurs insèrent une ligne en sauvegardant) :

<?php $file = file_get_contents('questions.txt'); // On lit le fichier des questions dans une chaîne $questions = explode("\n",$file); // On sépare chaque ligne (\n est le caractère signifiant une nouvelle ligne) // On sépare la question et la réponse for($i=0;isset($questions[$i]);$i++) $questions[$i] = explode('<|#()#|>',$questions[$i]); // Si le dernier élément est vide (bug relatif aux fichiers), on le supprime if(!$questions[count($questions)-1]) unset($questions[count($questions)-1]); ?>

Ici, après le traitement, on pourra trouver les questions dans l'array bi-dimensionnel $questions : la question no X sera à $questions[X][0] et la réponse correspondante $questions[X][1] .

2. Connexion

Tout d'abord, pour se connecter au serveur IRC, on doit ouvrir la connexion au serveur, et pour cela, rien ne vaut une bonne vieille commande fsockopen() . Bien sûr, on vérifie que l'on est bien connectés au serveur, sinon cela ne marchera pas :

<?php set_time_limit(0); $socket = fsockopen('irc.epiknet.org','6667'); // Vérification de la bonne connexion : if(!$socket) { // Si on n'a pas réussi, on affiche un message d'erreur et on quitte. echo 'Impossible de se connecter'; exit; } ?>

Ici, le set_time_limit(0) permet d'indiquer à PHP que l'on souhaite que le script tourne indéfiniment (en effet, si le bot tourne 30 secondes et s'arrête, ce n'est pas très utile).

Ensuite, on passe aux étapes 2. et 3. : le renseignement du pseudonyme (nickname) et du nom d'utilisateur. Si l'on lit la RFC 1459, le nom d'utilisateur n'est pas pris en compte lorsque l'on veut se connecter, mais il faut quand même le renseigner.

Il reste encore un problème : comment envoie-t-on des données au serveur ? Eh bien, c'est plus que simple : lorsque l'on arrive à se connecter, la commande fsockopen() nous renvoie un pointeur de fichier ! Il suffit donc d'effectuer des fonctions fputs() pour envoyer des données sur le serveur, et des fonctions fgets() pour lire les données du serveur.

Par contre, toujours selon la RFC 1459, il faut envoyer une certaine chaîne de caractères pour indiquer la fin d'un message : c'est la chaîne composée des caractères CR et LF, représentés en PHP par \r\n , utilisables uniquement entre guillemets :

<?php // On renseigne l'USER : ici, je mets un peu n'importe quoi, vu que le serveur ne prend en compte que le premier argument (mais qu'il a besoin de 4 arguments). fputs($socket,"USER QuizBot QuizBot Quiz Quiz\r\n"); // On donne le NICK. fputs($socket,"NICK QuizBot\r\n"); ?>

Maintenant, on arrive aux étapes 4. et 5., où on doit attendre que le serveur nous envoie un PING et y répondre par un PONG, puis attendre la fin du MOTD. Pour ce faire, nous allons utiliser une boucle.

Pour le PING, la RFC nous dit que le serveur nous envoie une ligne du style « PING: 215613202 » à laquelle nous devrons répondre « PONG: 215613202 ».

Ensuite, le MOTD ne nous intéressant pas des masses, nous allons...

Appeler le centre

Avez-vous besoin d'un coach de formation?

Il vous aidera à comparer différents cours et à trouver la solution la plus abordable.

Utiliser le protocole IRC avec PHP

Prix sur demande