我正在为从 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 平台。这最终会增加他们平台的值(value),同时增加广告展示次数。”
http://adage.com/article/digitalnext/posting-facebook-truth-party-applications/229694
这可以解释为什么帖子没有在/feed 或/posts API 响应中传递。
但是,这并不能解释为什么 API 甚至不会通过其 ID 返回帖子(请参阅上面的更新)。
我能想到的是,Facebook 不会将第三方应用程序帖子归类为真正的“帖子”,因此不会通过适当的 API 响应推送它们。但是,我在 Facebook 文档中找不到这方面的证据。
更新 #3
根据下面的评论,我现在尝试做同样的事情,但使用的 Facebook 帐户不是该应用程序的所有者,或者实际上与 Facebook 上的任何页面(我自己的个人 Facebook 帐户)有任何管理关系。
我已使用 oAuth 对话框授权该应用程序并接受以下权限:
使用我 Shiny 的新访问 token ,我发出以下 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 key )。
最佳答案
使用 Yahoo Query Language
的组合和 .ajax()
数据抓取 Facebook 动态 channel .
对Facebook LIVE 成员(member)网页进行数据抓取的好处是你不需要获取最新实时提要的 token key !
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"
}
});
演示:受此启发 online tutorial .
jsFiddle Facebook Feeds
编辑:点击图片用于修改后的 jsFiddle with Style
额外:
为了补充我上面的回答,这里是准相关的 jsFiddle,标题为:
jsFiddle Tutorial: Creating Dynamic Div's (Now Improved!)
本教程展示了如何转换您的 HTML 标记,使其成为准备好与 jQuery 作为对象一起使用的"template",然后可以将其正确附加到网页。
关于php - 从 Facebook Graph API 获取第三方帖子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13950575/