从Facebook Graph API获取第三方帖子

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

然而,当我提交相同的请求,但包含在/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对话框授权了该应用程序,并接受了以下权限:

  • email
  • 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密钥)。


你确定这不是由于这个 bug 引起的吗? - Igy
@FacebookAnswers 是的,我一直在与之进行测试的 Facebook 用户是该应用程序的所有者,并且具有对选项卡所在页面的管理员访问权限。但是,该用户无法访问我尝试获取帖子的页面的管理员权限。也许我可以尝试使用一个不拥有该应用程序的用户(尽管这似乎是 API 运行的奇怪方式)。 - Daniel Greaves
@Igy 你没有提供任何关于错误的链接。 - Daniel Greaves
@FacebookAnswers 我已经对我的问题进行了更新,通过使用与该应用程序或任何相关页面无关的个人帐户运行了整个过程。不幸的是,仍然出现相同的结果。很奇怪您无法重现这个问题。 - Daniel Greaves
关于管理员/非管理员用户,我提到这个是因为在测试各种与FB相关的项目时,我曾经作为管理员用户遇到了问题。我不知道为什么会出现这种情况,但通过简单的测试可以轻松排除这个问题,所以如果我遇到了困难,这总是我尝试的第一件事。 - Relaxing In Cyprus
显示剩余6条评论
3个回答

9
丹,我试过这个 -
  1. POST a feed from an APP to a Page

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

    Result: Post Successful

  2. Request the list of posts on the Page

    GET: "PAGE_ID/feed"
    

    Result: All the posts on the Page incl the aforementioned post.


为什么它起作用了?

因为使用发布消息的应用程序管理员的访问令牌进行了GET请求。

结论

我尝试了所有情况,最终的结论是,要获取某个应用程序发布的包括incl在内的页面的动态信息,必须使用该应用程序管理员的访问令牌(这不是大问题);否则,你只能获取其余的内容。


2
使用Yahoo Query Language.ajax()的组合来数据爬取Facebook Feed Channel
LIVE Facebook Member Webpage中进行数据爬取的好处是您不需要令牌密钥即可获取最新的实时动态! 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: 受这个在线教程的启发(链接)jsFiddle Facebook Feeds
编辑:点击图片查看带有样式的修订版jsFiddle。


额外信息:
为了补充我上面的答案,这里提供一个相关的jsFiddle链接:
jsFiddle教程:创建动态Div(现在已改进!)
本教程展示如何将你的HTML标记转换成一个“模板”,以便与jQuery一起使用作为对象,然后可以正确地附加到网页中。

1
谢谢你的回答。这是一个有趣的解决问题的方式。我会尽快研究一下! - Daniel Greaves
刚刚添加:在上面的答案中增加了额外部分。干杯! - arttronics

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

Fisch,谢谢你的回复。我已经根据你的建议更新了上面的帖子。不幸的是,Facebook也不允许我通过帖子的ID查找它。就好像它在API中根本不存在一样。 - Daniel Greaves

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接