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:
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 socketimportar 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).
Heh, eu não poderia perder o bot da besteira que você monta no IRC 😛 Artigo muito interessante.
Explicação muito simples e clara.
E se, o código python está faltando todo o recuo.
Já está resolvido ^^
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
Interessante, eu fico com ele 😀
excelente!
Muito útil, obrigado Son_Link!
Saudações!
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 ...
Qual versão do Python você está usando?
Funciona apenas com python 2.6 e 2.7, não com 3.x
Vou modificar a entrada para torná-la mais clara.
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)
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
Acabei de adicionar o link para o código completo do bot enquanto ele converte alguns símbolos e o código mostra seu código html.
De qualquer forma vou tentar mostrar tudo corretamente