通过 Koala 发布到我自己的 facebook 墙上

Posting to my own facebook wall via Koala

我正在尝试 post 我自己的 facebook 墙。所以我在我的中创建了一个 "app" 个人脸书专页,并取得app_id、app_secret等

然后我做了这个代码:

@oauth = Koala::Facebook::OAuth.new(app_id, app_secret, callback_url)
@token = @oauth.get_app_access_token
@graph = Koala::Facebook::API.new(@token)
foo = @graph.get_object('me')

但是,我得到这个错误:

An active access token must be used to query information about the current user. [HTTP 400] (Koala::Facebook::AuthenticationError)

令牌有效,我检查过了。我需要 post 到我自己的墙上,而不是 不同的用户。根据我在文档中阅读的内容,我需要一个“应用程序 访问密钥”,而不是 "user access key" 来执行此操作。我对 facebook api 列表,所以我想我遗漏了一些非常基本的东西。

只要用户已经授予您应用程序适当的权限,您就可以使用应用程序令牌而不是用户令牌post到墙上。

也就是在时间轴上

  • 用户通过 publish_actions
  • 授予应用对 post 的访问权限
  • Graph 登录流程提供的用户访问令牌
  • 此时,您可以使用用户访问令牌或应用程序访问令牌

此外,

foo = @graph.get_object('me')

不是 POST 请求。它说,从名为 me 的图中获取对象。此外,如果您使用应用程序令牌,me 将不会解析任何内容,因为应用程序无法判断您所指的应用程序中所有用户中的哪个 "me"。因此,您需要为用户参考应用范围内的 ID。

例如

foo = @graph.get_object('4')

其中 4 是数字应用范围 ID(4 在您的情况下不起作用,您需要为您的应用找出正确的 ID)。在 koala 中正确的调用应该是

foo = @graph.put_connections("4", "feed", :message => "I am writing on my wall!")

我的问题是用户(在本例中是我自己)必须允许访问我的应用程序才能 post 到我的墙上。

完整的 OAuth 过程在 http://developers.facebook.com/docs/authentication/

中有很好的描述

但具体来说,我需要得到一个我必须访问的 URL,然后对身份验证问题说 "yes"。代码在这里:

@oauth = Koala::Facebook::OAuth.new(app_id, app_secret, callback_url)
@oauth.url_for_oauth_code(:permissions => "publish_actions")

URL 看起来像这样:

https://www.facebook.com/dialog/oauth?
    client_id={app_id}&
    redirect_uri={redirect-uri}&scope=publish_actions

请注意,URL 必须指定您要向用户请求哪些权限(在本例中,是 post 的权限)。此权限请求在 "scope" 变量下指定。请注意某些版本的 facebook api 允许 post 通过 "publish_stream" 范围,而其他版本需要 "publish_actions" 范围。有关范围变量下可用权限的更多信息,请参见此处:https://developers.facebook.com/docs/facebook-login/permissions/v2.0

当您访问由上述语句生成的 URL 时,facebook 会向您发送一条消息,询问该特定应用程序是否有权 post 到您的墙上。你当然会说"yes"。之后,您的 Facebook 应用程序可以使用 "app access token"

post 到 Facebook 墙

之后,使用您的应用程序访问令牌很容易 post 上墙。对我有用的代码是:

@oauth = Koala::Facebook::OAuth.new(app_id, app_secret, callback_url)
@app_access_token = @oauth.get_app_access_token
@graph = Koala::Facebook::API.new(@app_access_token)
foo = @graph.put_connections(facebook_user_id, "feed", :message => "Test message")