Create an IRC Bot Using Python 2
Se você não está familiarizado com o IRC (Internet Relay Chat), é um protocolo de camada de aplicativo usado para facilitar o bate-papo com usuários em todo o mundo e existe desde o final dos anos 1980 e ainda é amplamente usado até hoje.
Se você não está familiarizado com o IRC (Internet Relay Chat), é um protocolo de camada de aplicativo usado para facilitar o bate-papo com usuários em todo o mundo e existe desde o final dos anos 1980 e ainda é amplamente usado até hoje.
Existem várias redes de IRC diferentes, então qual você escolheu usar depende de sua preferência pessoal.
Why Create an IRC Bot?
Simplificando, os bots de IRC em geral são simples e divertidos de criar. Eles permitem que você estenda a funcionalidade de um canal ou até mesmo crie jogos interativos divertidos para o seu canal. Basicamente, o céu é o limite em termos de possibilidades de funcionalidade de bot e, quando misturado com a facilidade do Python, você pode criar um bot complexo em poucas linhas de código.
Como faço para me conectar ao servidor IRC?
O processo para se conectar a um servidor de IRC é direto*.
- Connect to XXXX server on port XXXX (typically 6667)
- Envie o comando USER
- Envie o comando NICK
- Responda a qualquer comando PING
* – É importante notar que alguns servidores de IRC diferem na forma como você se conecta ou no formato das mensagens recebidas, certifique-se de procurar as informações de referência do host ao qual você normalmente se conecta.
Antes de nos conectarmos ao servidor de IRC, configuraremos as variáveis para server, botnick, o canal para entrar na conexão e as opções booleanas para sentUser e sentNick. Os sinalizadores booleanos sentUser e sentNick são usados para determinar se esses comandos foram ou não enviados anteriormente ao servidor durante a conexão.
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 se conectar a um servidor, um soquete simples é criado e, em seguida, conectado chamando o método connect.
irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print "\nConnecting to:" + server irc.connect((server, 6667))
Envie o comando USER
Em seguida, registre (e algo autentique) uma sessão de usuário com um nome de usuário curto e um nome real legível por humanos. O formato do comando é assim.
USER (username) (hostname) (unused) (realname)
if sentUser == False:
irc.send("USER " + botnick + " " + botnick + " " + botnick + " :This is a fun bot\n")
sentUser = True
continue
Envie o comando NICK
Após o comando USER, envie o comando NICK para especificar o apelido do chat. O formato do comando é assim.
NICK (nickname)
if sentUser and sentNick == False:
irc.send("NICK " + botnick + "\n")
sentNick = True
continue
Responda a qualquer comando PING
Os servidores IRC enviam regularmente o comando PING para clientes conectados para determinar se eles ainda estão conectados. Para mostrar que você está conectado, cada PING deve ser respondido com um PONG e o token PING fornecido. O comando PING usa o seguinte formato.
PING (token)
if text.find("PING") != -1:
irc.send("PONG " + text.split()[1] + "\n")
Como meu bot aceita comandos?
Para que o bot aceite comandos, você precisará analisar a entrada que vem do buffer e responder adequadamente. Como o IRC é baseado em texto, as mensagens vindas do servidor são fáceis de analisar usando regex ou até mesmo uma simples localização de texto. O snippet abaixo pesquisa o texto da mensagem de um canal ou mensagem privada contendo "!host". Se encontrado, o bot responde com as informações da versão do sistema operacional.
if text.find(":!host") != -1:
irc.send("PRIVMSG " + channel + " :" + str(platform.platform()) + "\n")
Posso apenas ter o codez?
O código-fonte abaixo é a lista completa do código usado para esta postagem.
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()
Onde posso saber mais?
Os links abaixo são ótimas referências para aprender sobre IRC, bots de IRC e o protocolo IRC.