我在Facebook应用程序上使用FBML的fb:comments插件(虽然它在Facebook开发者网站上被描述为“遗留”)似乎是在Canvas应用程序上获得正确的Facebook评论集成的唯一方法吗?请让我知道如果我错了,看起来在开阔海域航行比浏览Facebook文档更容易。我还使用JavaScript SDK订阅comment.create
事件,以便我可以跟踪谁在我的页面上发表评论。很容易,这似乎在一定程度上起作用,但我有以下代码:
FB.Event.subscribe('comment.create', function(response) {
console.log(response);
});
这会返回一个很好的JSON对象,包括以下的块:
commentID: "10150576473610309"
大!我有一个评论ID。所以现在我转到Facebook图形API以获取有关此评论的更多信息(我想要文本,作者等),所以我在PHP中发布以下内容,因为根据Facebook文档,Facebook上的所有内容都有唯一ID,只需使用此ID点击Graph API即可获得一些甜蜜信息。
file_get_contents('http://graph.facebook.com/10150576473610309');
哦不!这返回false。这很奇怪。所以我查看API以获取与特定页面相关的所有评论,这给了我一个评论列表......但是我刚添加的评论的ID是不同的,现在它的格式如下:
"id": "10150576473610309_20003210"
这是什么额外的下划线和数字?!使用此评论ID调用图形API会给我评论信息!这个新ID出现在哪里以及如何(以及为什么?)? (当然我尝试了Facebook开发论坛,但似乎问我的鼠标同样的问题会取得类似的结果)。
答案 0 :(得分:7)
编辑13/06/2014:注意,用户名字段现已弃用(感谢@ Cyril-n)
感谢Jonathan& Tarmo我开发了一个混合的approch:
FB.Event.subscribe('comment.create',
function(response) {
var commentQuery = FB.Data.query("SELECT text, fromid FROM comment WHERE post_fbid='"+response.commentID+"' AND object_id IN (SELECT comments_fbid FROM link_stat WHERE url='"+response.href+"')");
var userQuery = FB.Data.query("SELECT name FROM user WHERE uid in (select fromid from {0})", commentQuery);
FB.Data.waitOn([commentQuery, userQuery], function() {
var commentRow = commentQuery.value[0];
var userRow = userQuery.value[0];
console.log(userRow.name+" (id: "+commentRow.fromid+") posted the comment: "+commentRow.text);
});
}
);
通过这个,您可以获得上次发布的评论所需的所有信息。
PS:表注释(http://developers.facebook.com/docs/reference/fql/comment/)中有一个名为'username'的字段,但它似乎不起作用(当它不是匿名时,它表示用户名“匿名用户”...这就是我使用第二个查询来获取用户信息的原因)
答案 1 :(得分:4)
现在,这是从评论框中获取评论的首选方式:
http://developers.facebook.com/blog/post/490
无论如何,关于你的问题。我发现facebook在推出新平台时会添加一个id。例如,FQL,graph api和旧REST API的对象的id都是不同的。要查看此操作,请查看相册中的照片。所有那些由下划线分隔的ID都是:图表api id,FQL辅助工具,照片图api唯一ID以及一些其他ID是可能的,具体取决于上传者。在您的评论之后添加的那些神秘数字只是您的应用程序或一组应用程序的某种评论计数器,基本上没用。
因此,根据我的经验,混合Facebook平台总是一个坏主意,涉及大量的实验和黑客攻击。如果有可能总是使用单一平台,那么图表api现在是最好的选择。
答案 2 :(得分:3)
如果您只需要查询评论正文和作者,那么您可以使用FQL API。您需要查询comment和link_stat表。
SELECT text, fromid FROM comment
WHERE post_fbid=#{commentID}
AND object_id IN
(SELECT comments_fbid FROM link_stat WHERE url="#{href}")
您应该从comment.create回调中获得commentID
和href
变量。
答案 3 :(得分:1)
投票回答只是指使用图形api获取页面所有注释的方法。仍然留下相同的问题,你不知道最近留下的评论的评论ID是什么。
我的基本模式是解决服务器端问题 - 在服务器端创建评论事件后,我检索页面的所有注释,然后检查任何尚未存储的注释ID并存储它。但是,我不需要将用户操作直接关联到此。
答案 4 :(得分:0)
面临同样的问题!这些数字看起来像是时间戳,或者......
http://developers.facebook.com/docs/reference/api/Comment/
上没有任何相关信息可以逐页获取最后一条评论(限制如http://developers.facebook.com/docs/reference/api/所述),但作为临时解决方法。
所以我也在寻找解决方案。
答案 5 :(得分:0)
用一个丑陋而有点脆弱的黑客来解决这个问题,但它确实有效。以下是基本步骤:
示例代码:
FB.Event.subscribe('comment.create', function() {
var href = document.location.href;
FB.api('/comments/?ids=%s&limit=1000'.format(href), function(comments) {
if (comments[href] && comments[href].data) {
var comment = _(comments[href].data).last();
jQuery.post('/events/comment', {
comment_id : comment.id,
message : comment.message
});
}
});
});
这有一个竞争条件,许多用户可能会同时评论,事情可能会混淆。
另一个可能的问题可能是注释的分页,我希望限制10000会导致它暂停一段时间。
第三个问题是这个列表可能很大,可能需要一段时间才能下载。
除 Facebook JS SDK 外,此示例还使用 jQuery 和 Underscore.js 。
答案 6 :(得分:0)
奥利维尔的回答非常优雅和完整,但我发现它过于复杂了。 像facebook那样愚蠢的是给出一个json“响应”对象,其中“commentID”值与真实引用没有任何相关性,因为图api响应中“data”数组的最后一个元素是最新的注释,那么你可以在PHP中使用JSON响应中“data”子数组上的end()函数获取最后一个元素。
编辑:第二个想法,Olivier的方法很棒,因为它确实允许你从commentID值构建一个永久链接。通过选择commentdata的“id”字段,并忽略其他所有内容,您可以使用“id_comments_fbid”形式的永久链接URL中包含的易失性代码。
编辑:Olivier的方法不会触发对现有评论的回复,因为这些评论是通过选择“评论”来解决的,而不是通过给定的查询来解决。