Dan*_*ves 13 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]
));
Run Code Online (Sandbox Code Playgroud)
此请求成功,帖子显示在相关的Facebook页面上,其下方有"通过我的应用名称".
当我通过API请求页面上的帖子列表(请求如下)时,上述帖子不会出现.
$posts = $facebook->api([PAGE_ID].'/feed');
Run Code Online (Sandbox Code Playgroud)
我有一种强烈的感觉,这是因为帖子来自第三方应用程序.我听说Facebook"降级"第三方帖子以鼓励使用自己的平台.所有直接通过Facebook发布的帖子都会出现.
但是,必须有一种方法来检索这类帖子.
Fisch更新如下
当我将帖子发布到API时,会返回以下帖子ID:
112706495458566_468411663221379
Run Code Online (Sandbox Code Playgroud)
但是,当我为它发出API请求时:
$facebook->api('112706495458566_468411663221379');
Run Code Online (Sandbox Code Playgroud)
我收到以下回复:
{
"error": {
"message": "Unsupported get request.",
"type": "GraphMethodException",
"code": 100
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我发出相同的请求但是已经包含在/ feed请求中的帖子的ID时.
$facebook->api('112706495458566_457890310940181');
Run Code Online (Sandbox Code Playgroud)
我收到以下回复.
{
"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
}
}
Run Code Online (Sandbox Code Playgroud)
所以出于某种原因,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对话框授权该应用程序并已接受以下权限:
使用我闪亮的新访问令牌,我发出以下API请求:
$post = $facebook->api('112706495458566/feed', 'POST', array(
'message' => 'this is a test'
));
Run Code Online (Sandbox Code Playgroud)
我收到以下回复:
array(1) {
["id"] => string(31) "112706495458566_470663409662871"
}
Run Code Online (Sandbox Code Playgroud)
然后,我检查实际的Facebook页面,我刚发送的帖子已经按照预期从我的Facebook用户帐户中显示.
然后我发出以下请求来获取页面上的所有帖子:
$posts = $facebook->api('112706495458566/feed');
Run Code Online (Sandbox Code Playgroud)
我收到了一大堆页面上的所有帖子(我不会在这里发布).但是,我刚刚发送的帖子(以及收到的ID)不会出现.
然后,我使用POST请求返回的ID直接请求该帖子.
$post = $facebook->api('112706495458566_470663409662871');
Run Code Online (Sandbox Code Playgroud)
这会引发以下异常(按照之前的尝试).
GraphMethodException: Unsupported get request.
Run Code Online (Sandbox Code Playgroud)
重申一下,此尝试使用的是与应用程序或我们尝试获取数据的任何页面完全无关的帐户.该帐户也从未与该应用程序进行任何联系(即这是第一次接受权限并生成oAuth密钥).
丹,我试过这个 -
将APP中的Feed发布到页面
POST: "PAGE_ID/feed"
message: "hi"
Run Code Online (Sandbox Code Playgroud)
结果:发布成功
请求页面上的帖子列表
GET: "PAGE_ID/feed"
Run Code Online (Sandbox Code Playgroud)
结果:页面上的所有帖子都包含上述帖子.
它为什么有效?
因为GET请求是使用用户的访问令牌进行的,该用户是通过其发布消息的应用程序的管理员.
结论
我尝试了所有案例,最后的结论是,要获取包含某些APP发布的页面的供稿,您必须使用该应用程序管理员的访问令牌(不是大问题); 否则你只需要获得其余的Feed.
结合使用Yahoo Query Language和.ajax()来抓取Facebook Feed Channel 的数据。
抓取LIVE Facebook 会员网页数据的好处是您不需要令牌密钥即可获取最新的实时提要!
HTML:
<div id="results"></div>
Run Code Online (Sandbox Code Playgroud)
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"
}
});
Run Code Online (Sandbox Code Playgroud)
演示: 受到此在线教程的启发。
编辑:单击图像以查看带有样式的修订版 jsFiddle
额外的:
为了补充我上面的答案,这里是准相关的 jsFiddle 标题:
本教程展示了如何转换 HTML 标记,使其成为一个“模板”,可以作为对象与 jQuery 一起使用,然后可以将其正确附加到网页。
| 归档时间: |
|
| 查看次数: |
2787 次 |
| 最近记录: |