[Python] Programe um bot para IRC

Hoje vou te ensinar como programar um focinho para 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 pelo 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


Deixe um comentário

Seu endereço de email não será publicado. Campos obrigatórios são marcados com *

*

*

  1. Responsável pelos dados: Miguel Ángel Gatón
  2. Finalidade dos dados: Controle de SPAM, gerenciamento de comentários.
  3. Legitimação: Seu consentimento
  4. Comunicação de dados: Os dados não serão comunicados a terceiros, exceto por obrigação legal.
  5. Armazenamento de dados: banco de dados hospedado pela Occentus Networks (UE)
  6. Direitos: A qualquer momento você pode limitar, recuperar e excluir suas informações.

  1.   Auros Zx dito

    Heh, eu não poderia perder o bot da besteira que você monta no IRC 😛 Artigo muito interessante.

  2.   Cessar dito

    Explicação muito simples e clara.
    E se, o código python está faltando todo o recuo.

  3.   rafa dito

    Excelente artigo e como é fácil se conectar a um IRC para programar um bot:) ...

    Isso me lembra daqueles momentos em que nos sentíamos como programadores escrevendo scripts para mIRC em bate-papos do MSN ou MSNGroups

  4.   truko22 dito

    Interessante, eu fico com ele 😀

  5.   Gênesis Vargas J. (@elprincipiodeto) dito

    excelente!

  6.   Elinx dito

    Muito útil, obrigado Son_Link!

    Saudações!

  7.   dbillyx dito

    Felicidades…

    seguindo suas linhas e testando, a única coisa que funciona é
    soquete de importação
    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% srn"% NICK)
    s.send ("USER% s% s bla:% srn"% (IDENT, HOST, REALNAME))
    s.send ("JOIN:% srn"% CHAN)

    mudando o canal e o nick agora o abaixo me lança uma sintaxe de erro

    Eu perguntei a outros conhecidos e eles me disseram que isso não se parece com python

    Não sei o que estou fazendo de errado ou por que copio tudo e colo no python e dou entrada e ele se conecta ao canal, mas após 250 segundos o canal remove porque não houve resposta do pong ...

  8.   fritar dito

    O código completo não funciona para mim, o último parágrafo é o que falha e não consigo encontrar o erro. Se eu excluir essa parte, ela se conecta e funciona perfeitamente. Testado com Python 2.7.3 no Windows 7.

    PS: No meu caso eu me conecto a um servidor com uma senha e adiciono estas linhas:
    PASS = »Passdelbot»
    s.send ("PASSA% s \ r \ n"% PASSA)

  9.   Golfinho dito

    Olá Filho Link, muito obrigado pelo artigo, é muito interessante, simplesmente não consigo responder aos comandos enviados. O programa não vai para o último se e eu não consigo descobrir o porquê: "if len (line)> 1:"
    Espero sua resposta.
    obrigado