Páginas

12 junho 2010

Seu primeiro Jabber Bot em python

Saudações!

Então vamos lá, falar um pouco sobre o modelo Jabber, Xmpp e python. Resolvi escrever este tutorial, que tera 3 partes, para registrar meus estudos, e tb pq os exemplos que achei tentam sempre esconder a parte principal de criar um bot: handlers e acesso ao xmpp

Super rápida introdução a XMPP



Segundo os autores do protocolo, o XMPP é uma tecnologia aberta para comunicação em tempo real que permite a criação de vários tipos de aplicações, tais como instanting messaging, presença, chats multi-usuários, chamadas de voz e vídeo, colaboração, middleware, content syndication e qualquer transmissão de dados via XML. Talvez a definição mais curta possível seja: é um protocolo para a criação de middlewares orientado a mensagens. E canais de troca de mensagens existem em qualquer sistema distribuído, e acredite, XMPP pode ser usado em cada um deles, desde que, é claro, isso traga benefícios ao sistema ou ao desenvovimento



Para aprofundar um pouco mais o seu conhecimento, o Luis Cipriani (lccipriani), da Abril, escreveu uma introdução super bacana sobre o protocolo: Breve Introducao ao XMPP (vale a leitura, e da onde eu extrai o texto acima)

Para este primeiro exemplo, você nao precisa nem saber muito sobre o protocolo em si, já que as bibliotecas deixam tudo bastante transparente.

Jabber who?



Jabber é o nome de um dos mais famosos serviços de Mensagens instantâneas que existe. A coisa é tão grande, que "jabber" é praticamente um sinomimo de qualquer servico rodando em cima de XMPP (Google Talk, Live Journal Talk, Nimbuzz, Ovi são outros nodos famosos da rede).

O primeiro Bot



Bem, usando python, a coisa é super tranquila. Você vai precisar instalar uma implementação qqer do protocolo. Vamos usar o XMPPPy, cujo foco é ser uma fonte simples de criar scripts em cima do protocolo xmpp. O site oficial possui varios exemplos de bots e scripts para interagir com um serviço xmpp.


$> easy_install xmpp

Info sobre setuptools: python.org


Vou usar utilizar o GTalk como servidor XMPP, pra facilitar a vida.


import xmpp

jid = xmpp.protocol.JID('LOGIN_DO_BOT@gmail.com')
pwd = 'senha'
server = "talk.google.com"
port = 5222

conn = xmpp.Client(jid.getDomain(),debug=[])

conn.connect([server, port])

conn.auth(jid.getNode(), pwd)

conn.send(xmpp.protocol.Message("SEU_EMAIL@gmail.com", "hello world"))

conn.disconnect()



Importante saber que você vai precisar estar com o usuario BOT adicionado em sua lista de contatos (nos proximos posts vou mostrar como trabalhar com autorizacao de chat entre usuários).

As primeiras linhas do código sao apenas configuracoes basicas: servidor, porta, criacao de um objeto JID utilizando o email e senha para se autenticar no serviço.

Logo após, basta se conectar ao servidor, criando uma instancia de xmpp.Client e passando o token de authenticacao. Para criar uma mensagem, basta instanciar a classe xmpp.protocol.Message com os parametros destino e mensagem

Executando o codigo acima, vc deve recebeu uma mensagem "Hello World" no seu gtalk!

Yay... legal, mas ainda nao é um bot, já que o código nao interage com o usuário. Para que isso aconteça, vamos adicionar um pouco de amor no código acima. Para tal, precisamos:

  • Após conectar, avisar as pessoas na lista de contatos do bot de que ele está online

  • Definir um metodo de callback para quando as messagens chegarem

  • Manter o processo rodando aguardando mensagens



E aqui está o resultado final:


import xmpp

jid = xmpp.protocol.JID('pycon.bot@gmail.com')
pwd = 'pycon123'
server = "talk.google.com"
port = 5222

conn = xmpp.Client(jid.getDomain(),debug=[])
conn.connect([server, port])
conn.auth(jid.getNode(), pwd)



#avisando contatos de disponibilidade
conn.sendInitPresence()


def callback_message(conn, mess):
message_body = mess.getBody()
if not message_body:
return
reply_message = "You typed: "+message_body
conn.send(xmpp.protocol.Message(mess.getFrom(), reply_message))

conn.RegisterHandler( 'message', callback_message)

#main loop
def idle_proc( ):
"""This function will be called in the main loop."""
pass

while True:
try:
conn.Process(1)
idle_proc()
except KeyboardInterrupt:
print 'bot stopped by user request. shutting down.'
conn.disconnect()
break
except xmpp.protocol.InternalServerError:
print "Server error at Google, trying again"





Bem, ai esta. O código acima vai receber uma mensagem pelo gtalk e retornar a mesma mensagem para o usuário.

Espero que seja útil.

Os códigos deste post estao em: http://github.com/victorhg/botnet/tree/master/botnet/blog


cheers...
agora é hora de Guinness aqui na irlanda... fui!