4

之前有人问过这个问题,但许多解决方案已被弃用,而且 GraphAPI 的要求似乎使许多解决方案变得无关紧要。我摆弄了 fbpy、facebook、oauth、oauth2 包,并查看了他们的示例,但仍然无法弄清楚如何让它工作。我不信任我一直在使用的任何代码或软件包,并且想知道是否有人有任何他们知道可行的明确解决方案。谢谢。

4

4 回答 4

4

首先你需要做的是了解登录流程。如果您想轻松地切换不同的 Facebook 库,您应该了解。因此,它可以具有非常冗长的代码,而基于实现的非常简单的代码。

接下来是有不同的方式来实现处理 OAuth 以及在 Python 中显示和启动 Web 应用程序的不同方式。没有点击浏览器就无法授权。否则,您将不得不继续将 access_token 复制粘贴到代码中。

假设您选择web.py处理 Web 应用程序演示并requests.py处理 Graph API HTTP 调用。

import web, requests

然后设置我们希望所有请求通过的 URL

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 将返回的授权

登录流程

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>"

否则我们可以提取access_token使用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']

从这里您可以选择如何处理更新状态的调用,例如表单,

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
* 用 Python 发布 Facebook 照片 - 基本调料: 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/

于 2012-11-15T13:16:48.777 回答
3

One possible (tested!) solution using facepy:

  1. Create a new application or use an existing one previously created.
  2. Generate a user access token using the Graph API explorer with the status_update extended permission for the application.
  3. Use the user access token created in the previous step with 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!')
    
于 2012-11-14T09:22:57.133 回答
2

你也可以试试这个博客。它正在使用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"})
于 2013-02-16T21:27:24.873 回答
1

这就是我让它工作的方式。您绝对不需要为此创建任何应用程序。我将描述如何将状态更新发布到您的个人资料和您的 Facebook 页面。

首先,将状态更新发布到您的个人资料:

转到https://developers.facebook.com/tools/explorer
您将看到一个带有访问令牌的文本框。单击此文本框旁边的“获取访问令牌”按钮。它将打开一个弹出窗口,询问您访问令牌的各种权限。基本上,这些权限定义了您可以使用此令牌通过 Graph API 执行的操作。选中您需要的所有权限旁边的复选框,其中一项将更新您的状态。
现在继续安装 facepy 模块。最好的方法是使用 pip install。
在此之后,在任何 .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')

现在以标准的 python 方式执行这个 .py 文件并检查你的 facebook。您应该会看到YOUR_DESIRED_STATUS_UPDATE_HERE已发布到您的 Facebook 个人资料。

接下来,对你的 Facebook 页面做同样的事情:

除了生成访问令牌之外,该过程几乎完全相同。
现在您不能使用相同的访问令牌发布到您的 Facebook 页面。您需要生成一个新的,这对于刚接触 Graph API 的人来说可能有点棘手。这是您需要做的:

转到相同的 developers.facebook.com/tools/explorer 页面。

找到一个显示“Graph API Explorer”的下拉菜单并点击它。从下拉列表中,选择您要从中发布更新的页面。为此页面生成一个新的访问令牌。此处描述了该过程:。不要忘记检查扩展权限选项卡中的 manage_pages 权限。

现在在与之前使用的代码相同的代码中使用此令牌并运行它。

转到您的 Facebook 页面。您应该YOUR_DESIRED_STATUS_UPDATE发布到您的页面。

希望这可以帮助!

于 2014-02-08T14:38:00.200 回答