[Python] Programe um bot para IRC

Hoje vou te ensinar como programar um focinho prevenir IRC. Em primeiro lugar, para quem não sabe, bot é um programa que se conecta a um canal IRC e com ele interage, o que nos permite, por exemplo, moderar o canal sem que estamos conectados e assim evitar spam, ou seja, que reconheça uma série de pedidos e execute o código correspondente.
Embora já existam bots prontos, eu honestamente sou um daqueles que gostam de fazer seus próprios programas para aprender e a grande satisfação que nos dá ao ver que funciona ^^

Com isso dito, vamos passar para o tutorial.

Para programar o bot, precisaremos de um editor de texto simples qualquer (nano, gedit, medit, etc.) e o intérprete python (2.6 ou 2.7 serão necessários, não funciona com python 3.x).

Primeiro importamos o módulos necessários, neste caso, precisaremos apenas de dois:

[código] #! / usr / bin / env python
# - * - codificação: utf-8 - * -

soquete de importação
importar string
[/ Code]

Agora vamos prosseguir para configure o bot:

[código] HOST=»irc.desdelinux.líquido"
PORT = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Home»
readbuffer = »»
[/ Code]

Vou explicar cada variável:

  • HOST: O URL do servidor ao qual nos conectaremos
  • PORTA: A porta do servidor. Por padrão, é 6667.
  • NICK, IDENT e REALNAME: Eles correspondem ao apelido do bot, sua identificação e o nome real.
  • CHAN: O canal em que o bot entrará
  • buffer de leitura: Nesta variável os dados enviados pelo servidor serão salvos.

Assim que nosso bot estiver configurado, passamos para a conexão

[código] s = socket.socket ()
s.connect ((HOST, 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]

A primeira linha não tem muito mistério, a segunda cria o conexão do servidor e os três últimos enviam os dados do bot ao servidor para prosseguir com o login.

Uma vez conectado, criaremos um Loop infinito em que iremos receber e enviar dados de / para o servidor:

[código] enquanto 1:
readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
para linha em temp:
linha = string.rstrip (linha)
line = line.split (CHAN + ':')

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

De todas as linhas escritas acima, apenas comentarei as importantes.
Com line = line.split (CHAN + ':') o que fazemos é dividir o que o servidor nos envia quando vamos obter algo do canal.
Por exemplo, a seguinte linha indica que alguém escreveu algo no canal:

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

O primeiro é o apelido do usuário e seus dados de conexão (separados por!), O comando (neste caso indica que ele escreveu), o canal e por último, após os dois pontos, a mensagem enviada. Não explicarei muitos outros comandos, pois isso não se enquadra neste tutorial.

As outras linhas importantes são aquelas estão após o if. O servidor envia de vez em quando o comando PING para verificar se o usuário ainda está conectado. Nesse caso, o bot envia o comando PONG com um ID que o PING enviou para indicar ao servidor que ainda está conectado.

Com isso já temos a base do bot. Agora irei explicar como fazer o bot responder de acordo com o que queremos a certos comandos, sejam eles do próprio IRC ou de usuários.

Respondendo a comandos IRC:

PING e PRIVMSG são exemplos de comandos IRC. Existem muitos comandos, mas como eu disse antes, é algo que não vou entrar em detalhes.
Por exemplo, podemos fazer o bot dizer olá para os usuários que se conectam:

[código] se linha [0] .find ('JOIN')! = -1:
nome = linha [0] .split ('!') [0] .split (':') [1] se nome! = NICK e nome.find (HOST) == -1:
s.send ("PRIVMSG% s: Bem-vindo @% s ^^ \ n"% (CHAN, nome))
[/ Code]

Primeiro verificamos se o servidor envia o comando Cadastre-se que indica que alguém se conectou ao servidor. Em seguida, extraímos o nick, verificamos se o nick não é o url do IRC (se não, assim que executarmos o bot, ele saudará o url) e finalmente enviamos a mensagem de saudação.

Comandos do bot:

Agora, como faço meu bot responder aos meus próprios comandos? Vejamos melhor um exemplo:

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

Neste exemplo, se alguém escreve $ versão o bot mostrará a mensagem indicando seu nome, versão e autor. O código completo do exemplo é este:

[code] import socket
importar string

HOST = »localhost»
PORT = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Home»
readbuffer = »»
s = socket.socket ()
s.connect ((HOST, 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)

enquanto 1:

readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
para linha em temp:
linha de impressão
linha = string.rstrip (linha)
line = line.split (CHAN + ':')

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

se linha [0] .find ('JOIN')! = -1:
nome = linha [0] .split ('!') [0] .split (':') [1] se nome! = NICK e nome.find (HOST) == -1:
s.send ("PRIVMSG% s: Bem-vindo @% s ^^ \ n"% (CHAN, nome))

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

Espero que tenham gostado deste tutorial e claro, deixo o link do código do meu bot para que possam ver o código na íntegra e ver melhor como funciona (embora eu tenha removido alguns comandos para uso pessoal).

CalicoBotGenericName