[Python] Programmer un bot pour IRC

Aujourd'hui, je vais vous apprendre à programmer un bot pour IRC. Tout d'abord, pour ceux qui ne savent pas, un bot est un programme qui se connecte à un canal IRC et interagit avec lui, ce qui nous permet, par exemple, de modérer le canal sans que nous sommes connectés et éviter ainsi le spam, ou qu'il reconnaisse une série d'ordres et exécute le code correspondant.
Bien qu'il y ait déjà des robots prêts, je suis honnêtement de ceux qui aiment faire leurs propres programmes pour apprendre et la grande satisfaction que cela nous procure après avoir vu que ça marche ^^

Cela dit, passons au didacticiel.

Pour programmer le bot, nous aurons besoin d'un éditeur de texte brut tout (nano, gedit, medit, etc.) et l' interpréteur python (2.6 ou 2.7 seront nécessaires, ne fonctionne pas avec python 3.x).

Nous importons d'abord le modules requis, dans ce cas, nous n'en aurons besoin que de deux:

[code] #! / usr / bin / env python
# - * - codage: utf-8 - * -

socket d'importation
chaîne d'importation
[/ Code]

Maintenant nous procédons à configurer le bot:

[code] HÔTE=»irc.desdelinux.filet"
PORT = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Accueil»
readbuffer = »»
[/ Code]

Je vais expliquer chaque variable:

  • L'HÔTE: L'URL du serveur auquel nous allons nous connecter
  • PORT: Le port du serveur. Par défaut, c'est 6667.
  • NICK, IDENT et REALNAME: Ils correspondent au surnom du bot, à son identification et au vrai nom.
  • CHAN : Le canal dans lequel le bot entrera
  • tampon de lecture : Dans cette variable, les données envoyées par le serveur seront sauvegardées.

Une fois notre bot configuré, nous procédons à la connexion

[code] s = socket.socket ()
s.connect ((HÔTE, PORT))
s.send ("NICK% s \ r \ n"% NICK)
s.send ("USER% s% s bla:% s \ r \ n"% (IDENT, HOST, REALNAME))
s.send ("JOIN:% s \ r \ n"% CHAN)
[/ Code]

La première ligne n'a pas beaucoup de mystère, la seconde crée le connexion au serveur et les trois derniers envoient les données du bot au serveur pour procéder à la connexion.

Une fois connecté, nous créerons un Boucle infinie dans lequel nous irons recevoir et envoyer des données depuis / vers le serveur:

[code] pendant 1:
readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
pour ligne en temp:
line = string.rstrip (ligne)
ligne = ligne.split (CHAN + ':')

si ligne [0] .find ("PING")! = -1:
pingid = ligne [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)
[/ Code]

De toutes les lignes écrites ci-dessus, je ne commenterai que les plus importantes.
Avec ligne = ligne.split (CHAN + ':') ce que nous faisons, c'est diviser ce que le serveur nous envoie quand obtenons quelque chose de la chaîne.
Par exemple, la ligne suivante indique que quelqu'un a écrit quelque chose sur la chaîne:

:son_link!sonlink@127.0.0.1 PRIVMSG #Home :Hola ^^

Le premier est le pseudo de l'utilisateur et les données de connexion (séparés par!), La commande (dans ce cas, cela indique qu'il a écrit), le canal et enfin, après les deux points, le message envoyé. Je n'expliquerai pas beaucoup plus de commandes car cela ne relève pas de ce tutoriel.

Les autres lignes importantes sont celles sont après le si. Le serveur envoie de temps en temps la commande PING pour vérifier si l'utilisateur est toujours connecté. Dans ce cas, le bot envoie la commande PONG avec un ID que PING a envoyé pour indiquer au serveur qu'il est toujours connecté.

Avec cela, nous avons déjà la base du bot. Je vais maintenant vous expliquer comment faire en sorte que le bot réponde comme nous le souhaitons à certaines commandes, qu'elles proviennent de l'IRC lui-même ou des utilisateurs.

Répondre aux commandes IRC:

PING et PRIVMSG sont des exemples de commandes IRC. Il existe de nombreuses commandes, mais comme je l'ai déjà dit, c'est quelque chose dont je n'entrerai pas dans les détails.
Par exemple, nous pouvons faire dire bonjour au bot aux utilisateurs qui se connectent:

[code] si ligne [0] .find ('JOIN')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] if name! = NICK et name.find (HOST) == -1:
s.send ("PRIVMSG% s: Bienvenue @% s ^^ \ n"% (CHAN, nom))
[/ Code]

Nous vérifions d'abord si le serveur envoie la commande INSCRIPTION ce qui indique que quelqu'un s'est connecté au serveur. Puis on extrait le pseudo, on vérifie que le pseudo n'est pas l'url IRC (sinon dès que nous exécutons le bot, il accueillera l'url) et enfin nous envoyons le message d'accueil.

Commandes du bot:

Maintenant, comment faire mon bot répondre à mes propres commandes? Regardons mieux un exemple:

[code] si ligne [1] == '$ version':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ Code]

Dans cet exemple, si quelqu'un écrit Version $ le bot affichera le message indiquant son nom, sa version et son auteur. Le code complet de l'exemple est le suivant:

[code] import socket
chaîne d'importation

HOST = »localhost»
PORT = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Accueil»
readbuffer = »»
s = socket.socket ()
s.connect ((HÔTE, PORT))
s.send ("NICK% s \ r \ n"% NICK)
s.send ("USER% s% s bla:% s \ r \ n"% (IDENT, HOST, REALNAME))
s.send ("JOIN:% s \ r \ n"% CHAN)

tandis que 1:

readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
pour ligne en temp:
ligne d'impression
line = string.rstrip (ligne)
ligne = ligne.split (CHAN + ':')

si ligne [0] .find ("PING")! = -1:
pingid = ligne [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)

si la ligne [0] .find ('JOIN')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] if name! = NICK et name.find (HOST) == -1:
s.send ("PRIVMSG% s: Bienvenue @% s ^^ \ n"% (CHAN, nom))

si len (ligne) <1:
si ligne [1] == '$ version':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ Code]

J'espère que vous avez aimé ce tutoriel, et bien sûr, je vous laisse le lien vers le code de mon bot pour que vous puissiez voir son code dans son intégralité et que vous puissiez mieux voir comment il fonctionne (même si j'ai supprimé certaines commandes pour un usage personnel).

CalicoBot


Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont marqués avec *

*

*

  1. Responsable des données: Miguel Ángel Gatón
  2. Finalité des données: Contrôle du SPAM, gestion des commentaires.
  3. Légitimation: votre consentement
  4. Communication des données: Les données ne seront pas communiquées à des tiers sauf obligation légale.
  5. Stockage des données: base de données hébergée par Occentus Networks (EU)
  6. Droits: à tout moment, vous pouvez limiter, récupérer et supprimer vos informations.

  1.   auroszx dit

    Heh, je ne pouvais pas rater le Bot des conneries que tu montes sur IRC 😛 Article très intéressant.

  2.   Cesser dit

    Explication très simple et claire.
    Et si, le code python manque toute l'indentation.

  3.   rafa dit

    Excellent article et comme il est facile de se connecter à un IRC pour programmer un bot :)…

    Cela me rappelle ces moments où nous nous sentions comme des programmeurs écrivant des scripts pour mIRC dans des discussions sur MSN ou MSNGroups.

  4.   Truko22 dit

    Intéressant je le garde 😀

  5.   Genesis Vargas J. (@elprincipiodeto) dit

    excellent!

  6.   Élynx dit

    Très utile, merci Son_Link!

    Salutations!

  7.   dbillyx dit

    À votre santé…

    suivre vos lignes et tester la seule chose qui fonctionne est
    socket d'importation
    chaîne d'importation

    HOST = »localhost»
    PORT = 6667
    NICK = »CalicoBot»
    IDENT = »CalicoBot»
    REALNAME = »CalicoBot»
    CHAN = »# Accueil»
    readbuffer = »»
    s = socket.socket ()
    s.connect ((HÔTE, PORT))
    s.send ("NICK% srn"% NICK)
    s.send ("USER% s% s bla:% srn"% (IDENT, HOST, REALNAME))
    s.send ("JOIN:% srn"% CHAN)

    changer le canal et le pseudo maintenant la syntaxe ci-dessous me lance une erreur

    J'ai demandé à d'autres connaissances et elles me disent que cela ne ressemble pas à du python

    Je ne sais pas ce que je fais de mal ou pourquoi je copie tout et le colle dans python et le laisse entrer et il se connecte au canal mais après 250 secondes, le canal le supprime car il n'y avait pas de réponse de pong ...

  8.   friture dit

    Le code complet ne fonctionne pas pour moi, le dernier paragraphe est ce qui échoue et je ne trouve pas l'erreur. Si je supprime cette partie, elle se connecte et fonctionne parfaitement. Testé avec Python 2.7.3 sur Windows 7.

    PS: Dans mon cas, je me connecte à un serveur avec un mot de passe et ajoute ces lignes:
    PASS = »Passdelbot»
    s.send ("PASS% s \ r \ n"% PASS)

  9.   Dauphin dit

    Salut Son Link, merci beaucoup pour l'article, c'est très intéressant, je ne peux tout simplement pas répondre aux commandes envoyées. Le programme n'entre pas dans le dernier if et je ne peux pas comprendre pourquoi: "if len (line)> 1:"
    J'attends ta réponse.
    merci