Saltar al contenido
Create an IRC Bot Using Python 2

Create an IRC Bot Using Python 2

Si no está familiarizado con IRC (Internet Relay Chat), es un protocolo de capa de aplicación que se utiliza para facilitar el chat con usuarios de todo el mundo y ha existido desde finales de la década de 1980 y todavía se usa ampliamente hasta el día de hoy.

4min read

Si no está familiarizado con IRC (Internet Relay Chat), es un protocolo de capa de aplicación que se utiliza para facilitar el chat con usuarios de todo el mundo y ha existido desde finales de la década de 1980 y todavía se usa ampliamente hasta el día de hoy.

Hay varias redes IRC diferentes, por lo que la que elijas usar depende de tus preferencias personales.

Why Create an IRC Bot?

En pocas palabras, los bots de IRC en general son simples y divertidos de crear. Te permiten ampliar la funcionalidad de un canal o incluso crear divertidos juegos interactivos para tu canal. Básicamente, el cielo es el límite en términos de posibilidades para la funcionalidad de los bots, y cuando se mezcla con la facilidad de Python, puede crear un bot complejo en muy pocas líneas de código.

¿Cómo me conecto al servidor IRC?

El proceso para conectarse a un servidor IRC es sencillo*.

  1. Connect to XXXX server on port XXXX (typically 6667)
  2. Enviar el comando USER
  3. Enviar el comando NICK
  4. Responder a cualquier comando PING

* – Es importante tener en cuenta que algunos servidores IRC difieren en la forma en que te conectas o en el formato de los mensajes recibidos, asegúrate de buscar la información de referencia del host al que normalmente te conectas.

Antes de conectarnos al servidor IRC, configuraremos las variables para server, botnick, el canal al unirse al conectarse y las banderas booleanas para sentUser y sentNick. Las marcas booleanas sentUser y sentNick se utilizan para determinar si esos comandos se han enviado previamente al servidor durante la conexión.

server = "ix.undernet.org"
channel = "#usa"
botnick = "uberbot" + str(random.randint(1, 10000))
sentUser = False
sentNick = False

Connect to XXXX server on port XXXX

Para conectarse a un servidor, se crea un socket simple y, a continuación, se conecta llamando al método connect.

irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print "\nConnecting to:" + server
irc.connect((server, 6667))

Enviar el comando USER

A continuación, registre (y autentique) una sesión de usuario con un nombre de usuario corto y un nombre real legible por humanos. El formato del comando tiene el siguiente aspecto.

USER (username) (hostname) (unused) (realname)
if sentUser == False:
   irc.send("USER " + botnick + " " + botnick + " " + botnick + " :This is a fun bot\n")
   sentUser = True
   continue

Enviar el comando NICK

Después del comando USER, envíe el comando NICK para especificar su apodo de chat. El formato del comando tiene el siguiente aspecto.

NICK (nickname)
if sentUser and sentNick == False:
   irc.send("NICK " + botnick + "\n")
   sentNick = True
   continue

Responder a cualquier comando PING

Los servidores IRC envían regularmente el comando PING a los clientes conectados para determinar si todavía están conectados. Para mostrar que está conectado, cada PING debe responderse con un PONG y el token PING suministrado. El comando PING utiliza el siguiente formato.

PING (token)
if text.find("PING") != -1:
   irc.send("PONG " + text.split()[1] + "\n")

¿Cómo acepta mi bot los comandos?

Para que el bot acepte comandos, deberá analizar la entrada que proviene del búfer y, a continuación, responder en consecuencia. Dado que IRC se basa en texto, los mensajes que provienen del servidor son fáciles de analizar usando expresiones regulares o incluso una simple búsqueda de texto. El siguiente fragmento busca el texto del mensaje de un canal o mensaje privado que contenga "!host". Si se encuentra, el bot responde con la información de la versión del sistema operativo.

if text.find(":!host") != -1:
irc.send("PRIVMSG " + channel + " :" + str(platform.platform()) + "\n")

¿Puedo tener solo el Codez?

El código fuente a continuación es la lista completa del código utilizado para esta publicación.

import platform
import random
import socket
import sys

reload(sys)
sys.setdefaultencoding('utf8')

server = "ix.undernet.org"
channel = "#usa"
botnick = "uberbot" + str(random.randint(1, 10000))
sentUser = False
sentNick = False

irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print "\nConnecting to:" + server
irc.connect((server, 6667))

try:
   while 1:
      text = irc.recv(2048)
      if len(text) > 0:
         print text
      else:
         continue

      if text.find("PING") != -1:
         irc.send("PONG " + text.split()[1] + "\n")

      if sentUser == False:
         irc.send("USER " + botnick + " " + botnick + " " + botnick + " :This is a fun bot\n")
         sentUser = True
         continue

      if sentUser and sentNick == False:
         irc.send("NICK " + botnick + "\n")
         sentNick = True
         continue

      if text.find("255 " + botnick) != -1:
         irc.send("JOIN " + channel + "\n")

      if text.find(":!host") != -1:
         irc.send("PRIVMSG " + channel + " :" + str(platform.platform()) + "\n")

except KeyboardInterrupt:
   irc.send("QUIT :I have to go for now!\n")
   print "\n"
   sys.exit()

¿Dónde puedo obtener más información?

Los enlaces a continuación son excelentes referencias para aprender sobre IRC, los bots de IRC y el protocolo IRC.

Por Torrey Betts

Solicitar una demostración