13

我正在为一个从 Facebook 页面获取和显示帖子的客户端组合一个 Facebook 选项卡应用程序。该应用程序还提供向页面添加新帖子和评论现有帖子的功能。这是使用 Facebook Graph API(通过 PHP SDK)实现的。

我一切正常,但遇到了涉及从我的应用程序发布的问题。当用户提交帖子时,它会通过以下请求发送到 Graph API。

$facebook->api([PAGE_ID]/feed', 'POST', array(
    'message' => [MESSAGE]
));

此请求成功,帖子将显示在相关 Facebook 页面上,并在其下方显示“通过我的应用名称”。

然后,当我通过 API 请求页面上的帖子列表时(下面的请求),上述帖子不会出现。

$posts = $facebook->api([PAGE_ID].'/feed');

我有一种强烈的感觉,这是由于该帖子来自第三方应用程序。我听说 Facebook 会“降级”第三方帖子以鼓励使用自己的平台。所有直接通过 Facebook 发布的帖子都会出现。

但是,必须有一种方法来检索这些帖子。

下面的 Fisch 更新

当我向 API 发帖时,会返回以下帖子 ID:

112706495458566_468411663221379

但是,当我向它发出 API 请求时:

$facebook->api('112706495458566_468411663221379');

我得到以下回复:

{
    "error": {
        "message": "Unsupported get request.",
        "type": "GraphMethodException",
        "code": 100
    }
}

但是,当我发出相同的请求但帖子的 ID 已包含在 /feed 请求中时。

$facebook->api('112706495458566_457890310940181');

我得到以下回应。

{
    "id": "112706495458566_457890310940181",
    "from": {
        "category": "Local business",
        "name": "Genting Casino Southport",
        "id": "112706495458566"
    },
    "story": "\"Very well done to ste,...\" on their own status.",
    "privacy": {
        "value": ""
    },
    "type": "status",
    "application": {
        "name": "Mobile",
        "id": "2915120374"
    },
    "created_time": "2012-11-25T22:12:21+0000",
    "updated_time": "2012-11-25T22:12:21+0000",
    "comments": {
        "count": 0
    }
}

因此,出于某种原因,Facebook 甚至不允许我通过其 ID 查找帖子。

更新#2

在我寻找这个问题的答案时,我遇到了一项研究,这加强了我之前对分配给第三方应用程序帖子的“权重”的怀疑。

来自 EdgeRank Checker 报告:“在 Facebook 中创建对象时,会为其分配权重。我们认为 Facebook 战略性地降低了通过 API 创建的对象的权重。该策略背后的原因是鼓励在 Facebook 中创建更多内容。 Facebook 平台。这最终会增加他们平台的价值,同时增加广告印象。”

http://adage.com/article/digitalnext/posting-facebook-truth-party-applications/229694

这可以解释为什么帖子没有在 /feed 或 /posts API 响应中传递。

然而,这并不能解释为什么 API 甚至不会通过它的 ID 返回帖子(参见上面的更新)。

我能想到的是,Facebook 不会将第三方应用程序帖子归类为真正的“帖子”,因此不会通过适当的 API 响应来推动它们。但是,我在 Facebook 文档中找不到这方面的证据。

更新#3

根据下面的评论,我现在尝试做同样的事情,但使用的 Facebook 帐户不是应用程序的所有者,或者实际上与 Facebook 上的任何页面(我自己的个人 Facebook 帐户)有任何管理员关系。

我已使用 oAuth 对话框授权该应用程序并已接受以下权限:

  • 电子邮件
  • 用户生日
  • 发布流

使用我闪亮的新访问令牌,我发出以下 API 请求:

$post = $facebook->api('112706495458566/feed', 'POST', array(
    'message' => 'this is a test'
));

我收到以下回复:

array(1) {
    ["id"] => string(31) "112706495458566_470663409662871"
}

然后我检查实际的 Facebook 页面,我刚刚发送的帖子已按预期从我的 Facebook 用户帐户中出现。

然后我发出以下请求以获取页面上的所有帖子:

$posts = $facebook->api('112706495458566/feed');

我收到页面上所有帖子的长数组(我不会在这里发布)。但是,我刚刚发送的帖子(并收到了回复的 ID)没有出现。

然后,我使用 POST 请求返回的 ID 直接请求该帖子。

$post = $facebook->api('112706495458566_470663409662871');

这会引发以下异常(根据之前的尝试)。

GraphMethodException: Unsupported get request.

重申一下,此尝试使用的帐户与应用程序或我们尝试为其获取数据的任何页面完全无关。该帐户也从未与应用程序有任何联系(即这是第一次接受权限并生成 oAuth 密钥)。

4

3 回答 3

9

丹,我试过这个-

  1. 将来自APP的提要发布到页面

    POST: "PAGE_ID/feed"
    message: "hi"
    

    结果:发布成功

  2. 请求页面上的帖子列表

    GET: "PAGE_ID/feed"
    

    结果:页面上的所有帖子,包括上述帖子。


为什么它起作用了?

因为 GET 请求是使用用户的访问令牌发出的,该用户是发布消息的应用程序的管理员。

结论

我尝试了所有案例,最终结论是,要获取某个APP发布的页面提要,您必须使用该应用程序管理员的访问令牌(不是大问题);否则你只会得到其余的提要。

于 2012-12-25T10:29:17.353 回答
2

使用Yahoo Query Language和的组合.ajax()来抓取Facebook Feed Channel的数据。

对LIVE Facebook 会员网页进行数据抓取的好处是您不需要令牌密钥来获取最新的实时提要!

HTML:

<div id="results"></div>

jQuery:

$.ajax({
    url: "http://query.yahooapis.com/v1/public/yql",
    dataType: "jsonp",
    success: function(data) {
        console.log(data.query.results.json);
        $.each(data.query.results.json.entries, function(i, v) {
            $('#results').append(data.query.results.json.entries[i].content + '<br /><br />');
        });
    },
    data: {
        q: 'select * from json where url="https://www.facebook.com/feeds/page.php?id=112706495458566&format=json"',
        format: "json"
    }
});

演示: 受此在线教程的启发。

jsFiddle Facebook 订阅源


编辑:单击图像以获取带有样式的修改后的 jsFiddle


额外的:

为了补充我上面的答案,这里是准相关的 jsFiddle,标题为:

jsFiddle 教程:创建动态 Div(现已改进!

本教程展示了如何转换您的 HTML 标记,使其成为可以与 jQuery 一起作为对象使用的“模板”,然后可以正确地将其附加到网页中。

于 2012-12-25T13:15:17.563 回答
1

当您通过 API 发布帖子时,Facebook 会向您返回该帖子的 ID。您可以保存这些 ID,然后稍后使用图形 API 或 FQL 查询它们

于 2012-12-19T10:53:39.617 回答