2012-11-14 22 views
4

此問題之前已被問到,但許多解決方案已被棄用,並且GraphAPI的要求似乎已使許多解決方案無關緊要。 我已經擺弄了fbpy,facebook,oauth,oauth2軟件包,並查看了他們的例子,但仍然無法弄清楚如何讓它工作。我對任何代碼和我一直使用的軟件包都不信任,並且想知道是否有人有任何明確的解決方案,他們知道會起作用。謝謝。如何使用Python和GraphAPI更新FB狀態?

+0

如果你有一個類似於file_get_contents的函數,並且知道使用curl,我可以一步一步地告訴你如何去做。由於我不是一個蟒蛇人,我不能給你確切的代碼。如果你開始使用FB,事實上很簡單。 – Kishor

回答

3

使用facepy一個可能的(測試!)解決方案:

  1. 創建一個新的application或使用以前創建的現有一個。
  2. 使用Graph API explorer和應用程序的status_update擴展權限生成用戶訪問令牌。
  3. 使用在上一步中創建用戶訪問令牌facepy

    from facepy import GraphAPI 
    
    ACCESS_TOKEN = 'access-token-copied-from-graph-api-explorer-on-web-browser' 
    
    graph = GraphAPI(ACCESS_TOKEN) 
    graph.post('me/feed', message='Hello World!') 
    
+0

感謝您的摘錄。我實際上嘗試了這個確切的片段。我遇到問題的部分是讓OAuth正常工作。似乎有一個OAuth和OAuth2軟件包,OAuth2是較新的軟件包。除了已經存在的問題,該包已經過時的例子(他們從Oauth導入OAuth,當包的名稱是OAuth2 ...)時,提供的例子似乎過於複雜,對於這樣一個簡單的任務(165行...儘管一大塊這是無可厚非的評論)。沒有能夠把一個有效的oauth_access_token,我仍然想知道我在做什麼錯... –

+0

我用過的短例似乎並沒有完成任務... –

+0

重構答案(測試正確工作)使用「面對面」幷包括如何生成用戶訪問令牌的說明。 –

4

首先,你需要做的是瞭解login flows。如果你很容易想通過不同的Facebook庫進行切換,你應該知道應該是。因此,它可以有非常詳細的代碼,這是非常簡單的,基於實現

接下來就是有不同的方法來實現處理OAuth和不同的方式來顯示和啓動您的網絡應用程序在Python中。沒有瀏覽器就無法授權。否則,你將不得不復制粘貼access_token到代碼。

比方說,您選擇web.py來處理您的Web應用程序演示文稿,requests.py來處理Graph API HTTP調用。

import web, requests 

然後設置,我們希望所有的請求要經過

url = (
'/', 'index' 
) 

現在把你的應用程序ID,祕密,登錄後的URL網址,你想用

app_id = "YOUR_APP_ID" 
app_secret = "APP_SECRET" 
post_login_url = "http://0.0.0.0:8080/" 

這代碼將有一個類index來處理邏輯。這節課,我們要處理的授權code Facebook將在

Login Flow

user_data = web.input(code=None) 
code = user_data.code 

登錄從這裏設置後返回的條件檢查code

if not code: 
    # we are not authorized 
    # send to oauth dialog 
else: 
    # authorized, get access_token 

內「未授權「分支,將用戶發送到對話框

dialog_url = ("http://www.facebook.com/dialog/oauth?" + 
          "client_id=" + app_id + 
          "&redirect_uri=" + post_login_url + 
          "&scope=publish_stream") 

return "<script>top.location.href='" + dialog_url + "'</script>" 

否則,我們就可以使用code收到

token_url = ("https://graph.facebook.com/oauth/access_token?" + 
          "client_id=" + app_id + 
          "&redirect_uri=" + post_login_url + 
          "&client_secret=" + app_secret + 
          "&code=" + code) 
      response = requests.get(token_url).content 

      params = {} 
      result = response.split("&", 1) 
      for p in result: 
       (k,v) = p.split("=") 
       params[k] = v 

      access_token = params['access_token'] 

從這裏你可以選擇你想怎麼處理與呼叫更新狀態,例如形式提取access_token

graph_url = ("https://graph.facebook.com/me/feed?" + 
"access_token=" + access_token) 

return ('<html><body>' + '\n' + 
     '<form enctype="multipart/form-data" action="' + 
     graph_url + ' "method="POST">' + '\n' + 
     'Say something: ' + '\n' + 
     '<input name="message" type="text" value=""><br/><br/>' + '\n' + 
     '<input type="submit" value="Send"/><br/>' + '\n' + 
     '</form>' + '\n' + 
     '</body></html>') 

或者使用face.py

from facepy import GraphAPI 
graph = GraphAPI(access_token) 
try: 
    graph.post(
      path = 'me/feed', 
      message = 'Your message here' 
    ) 
except GraphAPI.OAuthError, e: 
    print e.message 

所以最後你可以得到一個簡化版本一樣

import web 
from facepy import GraphAPI 
from urlparse import parse_qs 

url = ('/', 'index') 

app_id = "YOUR_APP_ID" 
app_secret = "APP_SECRET" 
post_login_url = "http://0.0.0.0:8080/" 

user_data = web.input(code=None) 

if not user_data.code: 
    dialog_url = ("http://www.facebook.com/dialog/oauth?" + 
           "client_id=" + app_id + 
           "&redirect_uri=" + post_login_url + 
           "&scope=publish_stream") 

    return "<script>top.location.href='" + dialog_url + "'</script>" 
else: 
    graph = GraphAPI() 
    response = graph.get(
     path='oauth/access_token', 
     client_id=app_id, 
     client_secret=app_secret, 
     redirect_uri=post_login_url, 
     code=code 
    ) 
    data = parse_qs(response) 
    graph = GraphAPI(data['access_token'][0]) 
    graph.post(path = 'me/feed', message = 'Your message here') 

欲瞭解更多信息請參閱

* Facebook的API - 用戶供稿:http://developers.facebook.com/docs/reference/api/user/#feed
*發表一個Facebook的照片在Python - 基本調料:http://philippeharewood.com/facebook/publish-a-facebook-photo-in-python-the-basic-sauce/
* Facebook和Python的 - 基本調料: http://philippeharewood.com/facebook/facebook-and-python-the-basic-sauce/

+0

謝謝你的詳細和深思熟慮的回覆,phwd。上面你和佩德羅似乎都在使用面容,所以我也會這樣。我試圖快速爲我的朋友提供一些東西,並沒有像我做這件事那樣期望通過文檔來翻閱文檔(在輪詢收件箱中的特定電子郵件後,自動化facebook上的狀態消息)。這比我預期或得到的幫助要多得多;再次感謝! –

2

您也可以嘗試this博客。它使用fbconsole應用程序。

從博客的代碼:

from urllib import urlretrieve 
import imp 
urlretrieve('https://raw.github.com/gist/1194123/fbconsole.py', '.fbconsole.py') 
fb = imp.load_source('fb', '.fbconsole.py') 
fb.AUTH_SCOPE = ['publish_stream'] 
fb.authenticate() 
status = fb.graph_post("/me/feed", {"message":"Your message here"}) 
1

這是我如何得到它的工作。你絕對不需要爲此創建任何應用程序。我將介紹如何將狀態更新發布到您的個人資料和您的Facebook頁面。

首先,發佈狀態更新您的個人資料:

轉到https://developers.facebook.com/tools/explorer
您會在它之前看到帶有Access令牌的文本框。點擊此文本框旁邊的「獲取訪問令牌」按鈕。它會打開一個彈出窗口,詢問您訪問令牌的各種權限。基本上這些權限通過使用此令牌的Graph API來定義您可以執行的操作。選中您需要的所有權限旁邊的複選框,其中一個將更新您的狀態。
現在繼續並安裝麪包模塊。最好的方法是使用pip安裝。
之後填寫Flash在任何.py文件下面的代碼片段:

from facepy import GraphAPI 

access_token = 'YOUR_GENERATED_ACCESS_TOKEN' 
apiConnection = GraphAPI(access_token) 
apiConnection.post(path='me/feed', 
          message='YOUR_DESIRED_STATUS_UPDATE_HERE') 

現在執行這個.py文件標準的Python的方式,檢查你的Facebook。您應該看到已發佈到您的Facebook個人資料。

接下來,做同樣的事情與你的Facebook頁面:

的過程幾乎是完全不同的,用於生成您的訪問令牌相同。
現在你不能使用相同的訪問令牌發佈到你的Facebook頁面。您需要生成一個新的,這對於新來Graph API的人來說可能有點棘手。以下是您需要做的事情:

轉到相同的developers.facebook.com/tools/explorer頁面。

找到顯示'Graph API Explorer'的下拉列表並點擊它。從下拉菜單中選擇您想要發佈更新的頁面。爲此頁面生成一個新的訪問令牌。該過程描述爲here:。不要忘記檢查擴展權限選項卡中的manage_pages權限。

現在,使用與以前使用的代碼相同的代碼並運行它。

轉到您的Facebook頁面。您應該將YOUR_DESIRED_STATUS_UPDATE發佈到您的頁面。

希望這會有所幫助!