Skip to content

Instantly share code, notes, and snippets.

@tecoholic
Created May 23, 2011 03:53
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tecoholic/986203 to your computer and use it in GitHub Desktop.
Save tecoholic/986203 to your computer and use it in GitHub Desktop.
This sample code (written in Python) demonstrates integrating Facebook Chat using the X-FACEBOOK-PLATFORM authentication mechanism.
#!/usr/bin/env python
# This is a demonstration script for Facebook Chat
# using the X-FACEBOOK-PLATFORM SASL mechanism.
# It requires pyfacebook and pyxmpp to be installed.
# This client only works for desktop applications (configured in the
# developer app), and uses the old-style auth.getSession mechanism to get a
# Facebook session. For newer-style or web apps, only the
# `get_facebook_client` function should have to change.
import sys
import os
def get_facebook_client():
import facebook
# Replace these with your app's credentials
api_key = 'YOUR_API_KEY'
secret_key = 'YOUR_API_SECRET'
client = facebook.Facebook(api_key, secret_key)
try:
# Try to read cached credentials from the session-key file.
# If authorization fails, you should delete this file and start of.
handle = open('session-key', 'r')
client.uid, client.session_key, client.secret = [ line.strip() for line in handle ]
handle.close()
except IOError:
client.auth.createToken()
client.login()
print 'Log in to the app in your browser, then press enter.'
raw_input()
client.auth.getSession()
handle = open('session-key', 'w')
print >> handle, client.uid
print >> handle, client.session_key
print >> handle, client.secret
handle.close()
if not int(client.users.hasAppPermission('xmpp_login')):
import webbrowser
webbrowser.open(client.get_url('authorize',
ext_perm = 'xmpp_login',
api_key = client.api_key,
v = '1.0'))
print 'Grant the extended permission to the app in your browser, then press enter.'
raw_input()
return client
from pyxmpp.sasl.core import ClientAuthenticator
from pyxmpp.sasl.core import Response, Failure, Success
class XFacebookPlatformClientAuthenticator(ClientAuthenticator):
def __init__(self, password_manager, fb_client=None):
ClientAuthenticator.__init__(self, password_manager)
if fb_client is None:
global global_fb_client
fb_client = global_fb_client
self._fb_client = fb_client
def start(self, ignored_username, ignored_authzid):
return Response()
def challenge(self, challenge):
in_params = dict([part.split('=') for part in challenge.split('&')])
out_params = {'nonce': in_params['nonce']}
out_params = self._fb_client._add_session_args(out_params)
out_params = self._fb_client._build_post_args(in_params['method'], out_params)
import urllib
return Response(urllib.urlencode(out_params))
def finish(self,data):
return Success(None)
from pyxmpp.all import JID, Presence, Message
from pyxmpp.client import Client
class FacebookChatClient(Client):
def __init__(self, to_uid, message, **kwargs):
Client.__init__(self, **kwargs)
self.to_uid = to_uid
self.message = message
self.sent = False
def session_started(self):
self.get_stream().set_message_handler(`chat`, self.got_message)
self.get_stream().send(Presence())
def idle(self):
print 'Idle...'
Client.idle(self)
if self.session_established and not self.sent:
self.sent = True
target = JID('-' + self.to_uid, self.jid.domain)
self.get_stream().send(Message(to_jid=target, body=unicode(self.message)))
def got_message(self, stanza):
print stanza.get_from().node, `:`, stanza.get_body()
if __name__ == '__main__':
# Uncomment these lines to get more verbose logging.
#import logging
#logger = logging.getLogger()
#logger.addHandler(logging.StreamHandler())
#logger.setLevel(logging.DEBUG)
# Sneak our authenticator into the map.
import pyxmpp.sasl
pyxmpp.sasl.all_mechanisms_dict['X-FACEBOOK-PLATFORM'] = \
(XFacebookPlatformClientAuthenticator, None)
print 'Preparing Facebook client...'
global_fb_client = get_facebook_client()
try:
my_uid = str(global_fb_client.uid)
to_uid = sys.argv[1]
message = unicode(sys.argv[2])
my_jid = '-' + my_uid + '@chat.facebook.com/TestClient'
except IndexError:
sys.exit('usage: %s {to_uid} {message}' % sys.argv[0])
print 'Creating stream...'
xmpp_client = FacebookChatClient(
to_uid = to_uid,
message = message,
jid = JID(my_jid),
password = u'ignored',
auth_methods = ['sasl:X-FACEBOOK-PLATFORM'],
#server = 'localhost'
)
print 'Connecting...'
xmpp_client.connect()
print 'Processing...'
try:
xmpp_client.loop(1)
finally:
xmpp_client.disconnect()
@langiac
Copy link

langiac commented Apr 2, 2013

??

@langiac
Copy link

langiac commented Apr 2, 2013

how ro run?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment