Ir para o conteúdo
Create an IRC Bot Using Python 2

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.

4min read

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*.

  1. Connect to XXXX server on port XXXX (typically 6667)
  2. Envie o comando USER
  3. Envie o comando NICK
  4. 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.

Por Torrey Betts

Solicite uma demonstração