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!