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.
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*.
- Connect to XXXX server on port XXXX (typically 6667)
- Enviar el comando USER
- Enviar el comando NICK
- 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.