2013-10-13 162 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() 
相關問題