Back-End

16 dez, 2013

Como enviar uma mensagem no Facebook com XMPP usando tokens de acesso em Python

Publicidade

Recentemente, eu tive um momento muito difícil tentando descobrir com o que eu poderia enviar uma mensagem no Facebook para um usuário com Python. Eu sabia que precisava de escopo “xmpp_login ” e já tinha tokens de acesso de usuários sendo gerados através de uma compilação dev do aplicativo para iPhone Kapture, mas descobrir o que fazer depois disso foi difícil.

A documentação do Facebook cobrindo isso era tão detalhada como o manual de instruções da IKEA e, apesar de haver código de exemplo, este era em PHP, e não diretamente transferível para Python.

Buscar respostas no Google não ajudou em nada, e cada exemplo que eu encontrei foi mostrando como usar o nome de usuário e a senha através do mecanismo Digest MD5, mas eu quero usar um token de acesso, já que eu nunca tenho as senhas do Facebook.

Documentação para as várias bibliotecas Python XMPP tinha falta de detalhes ou informação nenhuma, por isso acabei apenas incomodando Lance Stout (desenvolvedor do SleekXMPP), até que ele me ajudou a fazer tudo através de uma sessão de Pastie-Pong de 30 minutos.

import sleekxmpp
import logging

logging.basicConfig(level=logging.DEBUG)

class SendMsgBot(sleekxmpp.ClientXMPP):
    """
    A basic SleekXMPP bot that will log in, send a message,
    and then log out.
    """
    def init(self, jid, recipient, message):

    sleekxmpp.ClientXMPP.__init__(self, jid, 'ignore')

    # The message we wish to send, and the JID that
    # will receive it.
    self.recipient = recipient
    self.msg = message

    # The session_start event will be triggered when
    # the bot establishes its connection with the server
    # and the XML streams are ready for use. We want to
    # listen for this event so that we we can initialize
    # our roster.
    self.add_event_handler("session_start", self.start, threaded=True)

def start(self, event):

    self.send_presence()

    self.get_roster()

    self.send_message(mto=self.recipient,
                    mbody=self.msg,
                    mtype='chat')

    # Using wait=True ensures that the send queue will be
    # emptied before ending the session.
    self.disconnect(wait=True)

Coloquei isso em um arquivo chamado fbxmpp.py e, em seguida, em outro arquivo (o seu worker, o seu aplicativo de linha de comando, seu controller Flask , seja qual for); você vai precisar de algo assim:

from fbxmpp import SendMsgBot

# The "From" Facebook ID
jid = '511501255@chat.facebook.com'

# The "Recipient" Facebook ID, with a hyphen for some reason
to = '-1000023894758@chat.facebook.com'

# Whatever you're sending
msg = 'Hey Other Phil, how is it going?'

xmpp = SendMsgBot(jid, to, unicode(msg))

xmpp.credentials['apikey'] = '123456'
xmpp.credentials['accesstoken'] = 'your-access-token'

if xmpp.connect(('chat.facebook.com', 5222)): xmpp.process(block=True) print("Done") else: print("Unable to connect.")

Você pode embrulhar tudo isso muito mais nitidamente com base em como ele está sendo implementado, mas isso deve ajudar você.

***

Artigo traduzido pela Redação iMasters, com autorização do autor. Publicado originalmente em http://philsturgeon.co.uk/blog/2013/06/facebook-message-with-xmpp-access-tokens-python