在python桌面应用程序中获取facebook用户/ app令牌

时间:2013-10-13 01:20:58

标签: python facebook

我正在编写一个python桌面应用程序,可以访问用户的Facebook照片。该应用程序目前支持flickr,它使用类似的oauth身份验证过程,但我正在努力弄清楚如何验证Facebook的应用程序。对于flickr,基本步骤是:

  1. 应用程序在身份验证页面上打开浏览器
  2. 用户授予应用访问帐户的权限
  3. App接收一个令牌作为http响应,然后可以与flickr的api
  4. 一起使用

    我希望facebook上有类似的内容,但我无法弄明白。

    python有各种各样的facebook API库,比如Pyfb,它提供了访问图形数据的简单方法,但它们都没有提供一种明显的方法来执行上面的身份验证步骤并检索可以使用的令牌。以下是来自Pyfb的示例,它假定用户手动输入用户令牌,这对桌面应用来说是非常荒谬的......

    from pyfb import Pyfb
    
    #Your APP ID. You Need to register the application on facebook
    #http://developers.facebook.com/
    FACEBOOK_APP_ID = 'YOUR_APP_ID'
    
    pyfb = Pyfb(FACEBOOK_APP_ID)
    
    #Opens a new browser tab instance and authenticates with the facebook API
    #It redirects to an url like  http://www.facebook.com/connect/login_success.html#access_token=[access_token]&expires_in=0
    pyfb.authenticate()
    
    #Copy the [access_token] and enter it below
    token = raw_input("Enter the access_token\n")
    
    #Sets the authentication token
    pyfb.set_access_token(token)
    
    #Gets info about myself
    me = pyfb.get_myself()
    

1 个答案:

答案 0 :(得分:2)

这是回答我自己的问题的一个镜头。

首先,上面的代码片段不起作用的原因。对pyfb.authenticate的调用将在默认浏览器中打开身份验证链接。在用户登录并允许应用程序访问后,Facebook应该将浏览器中的URL重定向到类似

的内容
https://www.facebook.com/connect/login_success.html#access_token=ACCESS_TOKEN&
    expires_in=SOMETIME

在pyfb代码示例中,用户应该从URL栏复制访问令牌,一切都应该很好。但是......大概是因为一些安全问题,facebook会执行一些Javascript恶作剧,而不是让你:

https://www.facebook.com/connect/blank.html#_=_

(事实证明,您可以通过在某些浏览器上浏览浏览器历史记录来解决此问题 - 请参阅https://bugs.kde.org/show_bug.cgi?id=319252

桌面应用程序的解决方案是在应用程序中打开Web视图。 Javascript代码显然会正确检测到您在应用程序中进行身份验证并使用令牌吐出完整的URL。所以这是一个使用Python gtk和webkit的例子:

import gtk
import webkit

view = webkit.WebView()

sw = gtk.ScrolledWindow()
sw.add(view)

win = gtk.Window(gtk.WINDOW_TOPLEVEL)
win.add(sw)
win.show_all()
win.connect("destroy", lambda *args:gtk.main_quit())

client_id = 'XXXXXXXXXXXXX' #your unique app id
auth_url = 'https://www.facebook.com/dialog/oauth?response_type=token&client_id=%s&redirect_uri=https://www.facebook.com/connect/login_success.html'%(client_id,)
view.open(auth_url)
def load_finished(view,frame):
    #function will print the url with token second time
    print frame.get_uri()

view.connect("document-load-finished",load_finished)
gtk.main()