2012-11-14 85 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发布到您的页面。

希望这会有所帮助!