Php 从Facebook Graph API获取第三方帖子
我正在为一个从Facebook页面获取和显示帖子的客户端组装一个Facebook标签应用程序。该应用程序还提供了向页面添加新帖子和对现有帖子进行评论的功能。这是通过Facebook图形API(通过PHPSDK)实现的 我一切正常,但遇到了一个问题,涉及从我的应用程序发布。当用户提交post时,它将通过以下请求发送到Graph APIPhp 从Facebook Graph API获取第三方帖子,php,facebook,facebook-graph-api,facebook-php-sdk,Php,Facebook,Facebook Graph Api,Facebook Php Sdk,我正在为一个从Facebook页面获取和显示帖子的客户端组装一个Facebook标签应用程序。该应用程序还提供了向页面添加新帖子和对现有帖子进行评论的功能。这是通过Facebook图形API(通过PHPSDK)实现的 我一切正常,但遇到了一个问题,涉及从我的应用程序发布。当用户提交post时,它将通过以下请求发送到Graph API $facebook->api([PAGE_ID]/feed', 'POST', array( 'message' => [MESSAGE] ))
$facebook->api([PAGE_ID]/feed', 'POST', array(
'message' => [MESSAGE]
));
此请求成功,帖子出现在相关Facebook页面上,下方有“通过我的应用程序名”
当我通过API请求页面上的帖子列表时(请求如下),前面提到的帖子不会出现
$posts = $facebook->api([PAGE_ID].'/feed');
我有一种强烈的感觉,这是因为帖子来自第三方应用程序。我听说Facebook“降级”第三方帖子以鼓励使用自己的平台。所有直接通过Facebook发布的帖子都出现了
然而,必须有一种方法来检索此类帖子
下面的Fisch更新
当我向API发送post时,将返回以下post ID:
112706495458566_468411663221379
但是,当我为其发出API请求时:
$facebook->api('112706495458566_468411663221379');
我得到以下回应:
{
"error": {
"message": "Unsupported get request.",
"type": "GraphMethodException",
"code": 100
}
}
array(1) {
["id"] => string(31) "112706495458566_470663409662871"
}
但是,当我发出相同的请求时,但是在/feed请求中已经包含了一个post的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平台上创建更多内容。这最终增加了他们平台的价值,同时增加了广告印象。”
这可以解释为什么在/feed或/posts API响应中没有传递POST
{
"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
}
}
然而,这并不能解释为什么API甚至不会通过其ID返回post(参见上面的更新)
我所能想到的是,Facebook没有将第三方应用程序帖子归类为真正的“帖子”,因此也没有通过适当的API响应来推送它们。然而,我在Facebook文档中找不到这方面的证据
更新#3
根据下面的评论,我现在正尝试这样做,但使用的Facebook帐户不是应用程序的所有者,或者实际上与Facebook上的任何页面有任何管理关系(我自己的个人Facebook帐户)
我已使用oAuth对话框授权该应用程序,并已接受以下许可:
- 电子邮件
- 用户生日
- 发布流
$post = $facebook->api('112706495458566/feed', 'POST', array(
'message' => 'this is a test'
));
我收到以下答复:
{
"error": {
"message": "Unsupported get request.",
"type": "GraphMethodException",
"code": 100
}
}
array(1) {
["id"] => string(31) "112706495458566_470663409662871"
}
然后我查看了Facebook的实际页面,我刚刚发送的帖子如预期的那样出现在我的Facebook用户帐户中
然后,我提出以下请求以获取页面上的所有帖子:
$posts = $facebook->api('112706495458566/feed');
我收到了页面上所有帖子的长数组(我不会在这里发布)。但是,我刚刚发送的帖子(并收到了回复的ID)没有出现
$posts = $facebook->api([PAGE_ID].'/feed');
然后,我使用post请求返回的ID直接请求该post
$post = $facebook->api('112706495458566_470663409662871');
它抛出以下异常(与上一次尝试相同)
再次重申,此尝试使用的帐户与应用程序或我们试图获取数据的任何页面完全无关。该帐户也从未与应用程序有过任何联系(即,这是第一次接受权限并生成oAuth密钥).当你通过API发表文章时,Facebook会将该文章的ID返回给你。你可以保存这些ID,然后稍后用graph API或FQL查询它们-
POST: "PAGE_ID/feed"
message: "hi"
结果:发布成功GET: "PAGE_ID/feed"
结果:页面上的所有帖子包括上述帖子它为什么起作用?
POST: "PAGE_ID/feed"
message: "hi"
因为GET请求是使用作为发布消息的应用程序管理员的用户的访问令牌发出的
结论
我尝试了所有的案例,最后的结论是,要获取某个应用程序发布的页面的提要,你必须使用该应用程序的管理员的访问令牌(这不是什么大问题)其他您只需获取其余的订阅源。使用和的组合来获取Facebook订阅源频道的数据
抓取实时Facebook会员网页数据的好处是您不需要令牌密钥即可获取最新的实时订阅源
HTML:
jQuery:
$.ajax({
url:“http://query.yahooapis.com/v1/public/yql",
数据类型:“jsonp”,
成功:功能(数据){
log(data.query.results.json);
$.each(data.query.results.json.entries,function(i,v){
$('#results').append(data.query.results.json.entries[i].content+'
');
});
},
数据:{
q:“从json中选择*,其中url=”https://www.facebook.com/feeds/page.php?id=112706495458566&format=json"',
格式:“json”
}
});
演示:受此启发
编辑:单击图像查看修改后的JSFIDLE wi