2010-04-20 113 views
0

我試圖使用python建立一個Facebook的API客戶端,代碼如下:Facebook的API非交互授權/登錄

import os 
import urllib2 
import urllib 
import cookielib 
import hashlib 
import json 

USER = '' 
PASS = '' 
LOGIN = 'http://www.facebook.com/login.php?login_attempt=1' 
HOST = 'http://api.facebook.com/restserver.php' 
API_KEY = 'eca5c767f0e5b65942419574374c34a4' 
SECRET_KEY = 'e2aab4000e08f4199f3ca6793ab4f02c' 

def getSig(params, secret): 
    sigStr = '' 
    for k in sorted(params.keys()): 
    sigStr += k + '=' + params[k] 
    sigStr += secret 
    return hashlib.md5(sigStr).hexdigest() 

def call(host, params): 
    basicParams = {'api_key': API_KEY, 
       'format': 'JSON', 
       'v': '1.0'} 
    basicParams.update(params) 
    basicParams['sig'] = getSig(basicParams, SECRET_KEY) 
    finalParams = urllib.urlencode(basicParams) 

    cj = cookielib.LWPCookieJar() 

    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj), urllib2.HTTPRedirectHandler) 
    urllib2.install_opener(opener) 

    request = urllib2.Request(host) 

    request.add_header('User-Agent', 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.9) Gecko/20100402 Ubuntu/9.10 (karmic) Firefox/3.5.9') 
    request.add_header('Content-Type', 'application/x-www-form-urlencoded') 

    h = urllib2.urlopen(request, finalParams) 

    return h.read() 


def getToken(): 
    paramsRaw = {'method': 'Auth.createToken', 
       'api_key': API_KEY, 
    } 
    ret = call(HOST, paramsRaw) 

    return json.loads(ret) 

def login(user, password, token): 
    # post login form 
    paramsRaw = { 
       'auth_token': token, 
       'email': user, 
       'pass': password, 
    } 
    call(LOGIN, paramsRaw) 

def getSession(token): 
    paramsRaw = {'method': 'Auth.getSession', 
       'auth_token': token 
       } 
    print call(HOST, paramsRaw) 

def main(): 
    token = getToken() 
    login(USER, PASS, token) 
    getSession(token) 

main() 

我基本上接收Auth.createToken令牌,與用戶發佈它/通過facebook.com/login.php併發送相同的令牌Auth.getSession(如此處所述:http://wiki.developers.facebook.com/index.php/Auth.createToken) 但getSession返回錯誤100(「無效參數」),我做錯了什麼?網絡上有類似程序的例子嗎?

回答

1

您還需要一個可以基於time.time()以及方法參數的call_id參數。

+0

你的意思是在POSTing到login.php時?我應該通過哪些方法參數? Auth.getSession/Auth.createToken的文檔明確指出,它們不需要call_id(http://wiki.developers.facebook.com/index.php/Auth.createToken,http://wiki.developers.facebook。 com/index.php/Auth.getSession) – Juliusz 2010-04-20 16:31:19

+0

只注意到你不使用FB連接。你正在實施一個桌面應用程序?您仍需要將用戶重定向到網頁才能登錄(http://wiki.developers.facebook.com/index.php/Authorization_and_Authentication_for_Desktop_Applications)。否則,您應該使用Facebook Connect(http://wiki.developers.facebook.com/index.php/Authorization_and_Authentication_for_Desktop_Applications)。以編程方式記錄用戶不是一件好事。你可以做一次,如果你想以後再存儲令牌 - 但你必須至少做一次網絡登錄。 – rlotun 2010-04-20 18:06:50

+0

是的,這就是問題的要點 - 以編程方式記錄用戶並獲取API的會話密鑰。它應該是一個服務器端處理程序,並且我想要控制日誌記錄過程(沒有瀏覽器啓動或直接用戶瀏覽器交互)。 所以 - 爲什麼這是一個壞主意,我該怎麼做? – Juliusz 2010-04-20 19:02:22