从Facebook Graph API获取第三方帖子

时间:2012-12-19 10:44:28

标签: php facebook facebook-graph-api facebook-php-sdk

我正在为客户端整理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
    }
}

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

$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平台内创建更多内容。这最终会增加其平台的价值,同时增加广告展示次数。“

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

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

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

我所能想到的是,Facebook并没有将第三方应用帖子归类为真正的“帖子”,因此并没有推动他们完成适当的API响应。但是,我在Facebook文档中找不到这方面的证据。

更新#3

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

我已使用oAuth对话框授权该应用,并已接受以下条款:

  • 电子邮件
  • user_birthday
  • publish_stream

使用我闪亮的新访问令牌,我发出以下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密钥)。

3 个答案:

答案 0 :(得分:9)

丹,我试过这个 -

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

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

    结果:发布成功

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

    GET: "PAGE_ID/feed"
    

    结果:网页上所有帖子包含上述帖子。


  3. 为什么会有效?

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

    <强>结论

    我尝试了所有案例,最后的结论是,要获取某些 APP 发布的包含页面的供稿,您必须使用访问令牌该应用的管理员(不是大问题); 其他您只需获得剩余的Feed。

答案 1 :(得分:2)

使用Yahoo Query Language.ajax()的组合来搜索 Facebook Feed频道

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

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"
    }
});

DEMO:受此online tutorial的启发。

jsFiddle Facebook Feeds


编辑:点击图片以修改带有样式的jsFiddle


<强> EXTRA:

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

jsFiddle Tutorial: Creating Dynamic Div's (Now Improved!)

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

答案 2 :(得分:1)

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

查询它们