2013-10-13 164 views
1

我正在编写一个将访问用户的Facebook照片的python桌面应用程序。该应用程序目前支持flickr,它使用了类似的oauth身份验证过程,但我正在努力弄清楚如何验证Facebook的应用程序。为Flickr,基本步骤是:在python桌面应用程序中获取facebook用户/应用程序令牌

  1. 应用程序打开认证页面上的浏览器
  2. 用户提供了应用程序的访问权限
  3. 应用接收的令牌作为HTTP响应,然后可以使用该帐户与flickr的api

我希望有类似的脸谱,但我一直没能弄明白。

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() 

回答

2

这里是在回答我的问题了一枪。

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

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

在pyfb代码示例中,假设用户访问令牌从地址栏复制一切都会好的。但是......大概是因为一些安全问题,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() 
相关问题