Php Facebook评论ID问题

Php Facebook评论ID问题,php,javascript,facebook,facebook-graph-api,Php,Javascript,Facebook,Facebook Graph Api,我正在Facebook应用程序上使用FBML的fb:comments插件(尽管Facebook开发者网站将其描述为“遗留”,但这似乎是在画布应用程序上获得适当Facebook评论集成的唯一方法?如果我错了,请告诉我,在公海中航行似乎比在Facebook文档中航行更容易)。我还使用JavaScript SDK订阅comment.create事件,以便跟踪谁在我的页面上发表评论。很简单,这似乎在某种程度上是可行的,但我有以下代码: FB.Event.subscribe('comment.cr

我正在Facebook应用程序上使用FBML的fb:comments插件(尽管Facebook开发者网站将其描述为“遗留”,但这似乎是在画布应用程序上获得适当Facebook评论集成的唯一方法?如果我错了,请告诉我,在公海中航行似乎比在Facebook文档中航行更容易)。我还使用JavaScript SDK订阅
comment.create
事件,以便跟踪谁在我的页面上发表评论。很简单,这似乎在某种程度上是可行的,但我有以下代码:

    FB.Event.subscribe('comment.create', function(response) {
        console.log(response);
    });
这将返回一个漂亮的JSON对象,包括以下要点:

commentID: "10150576473610309"
太好了!我有一个评论ID。所以现在我去Facebook graph API获取更多关于这条评论的信息(我想要文本、作者等),所以我用PHP发布了以下内容,因为根据Facebook文档,Facebook上的所有东西都有一个唯一的ID,只要用这个ID点击graph API就会给你一些甜蜜的信息

file_get_contents('http://graph.facebook.com/10150576473610309');
哦,不!这返回false。这很奇怪。因此,我检查了API中与特定页面相关的所有注释,这给了我一个注释列表……但我刚才添加的注释ID不同,现在它的格式是:

"id": "10150576473610309_20003210"

这个额外的下划线和数字是什么?!用这个注释ID调用graph API会给我注释信息!这个新身份证是在哪里产生的,是如何产生的(为什么?)?(当然,我尝试过Facebook开发论坛,但它似乎问我的鼠标同样的问题也会得到类似的结果)。

面临同样的问题!这些数字看起来像是时间戳之类的

那一点也没有

可以通过事件(如所述的限制)获取页面的一些最后注释,但作为临时解决方法


所以我也在寻找解决方案。

这是现在从评论框中获取评论的首选方法:

不管怎样,关于你的问题。我发现facebook在推出新平台时会添加一个id。例如,FQL、graph api和旧REST api的对象id都是不同的。要看到这一点,请查看相册中的照片。所有用下划线分隔的id都是:图形api id、FQL aid、照片图形api唯一id,以及一些附加id,具体取决于上传者。那些在你的评论之后添加的神秘数字只是你的应用程序或一组应用程序的某种评论计数器,基本上是无用的


因此,根据我的经验,混合facebook平台总是一个坏主意,涉及大量的实验和黑客。如果可能的话,请始终使用单平台,graph api是目前最好的选择。

用一个丑陋且脆弱的黑客解决了这一问题,但它是有效的。以下是基本步骤:

  • 订阅comment.create
  • 从“/comments/?ids=PAGE\u URL&limit=10000”下载评论列表
  • 接受最后一条评论,并假设它是正确的
示例代码

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和underline.js。

如果您只需要查询注释正文和作者,则可以使用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}")

commentID
href
变量应该可以从comment.create回调中获得。

编辑2014年6月13日:小心,用户名字段现在已弃用(谢谢@Cyril-n)

多亏了Jonathan和Tarmo,我开发了一种混合方法:

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:在comment()表中有一个名为“username”的字段,但它似乎不起作用(当它不是匿名的时候,它会说username“Anonymous user”…这就是为什么我使用第二个查询来获取用户信息)

投票的答案只是指一种使用graph api获取页面所有注释的方法。仍然存在同样的问题,您不知道最近留下的注释的注释id是什么


我的基本模式是在服务器端解决它——在服务器端的创建注释事件之后,我检索页面的所有注释,然后检查所有未存储的注释ID并存储它们。然而,我没有必要直接将用户的行为与此联系起来。

奥利弗的回答非常优雅和完整,但我发现它过于复杂。 facebook给出一个json“response”对象,其中“commentID”值与实际引用没有任何对应关系,这一点很愚蠢,因为graph api response中“data”数组的最后一个元素是最新的注释,所以您可以在PHP中获取“data”上带有end()函数的最后一个元素JSON响应中的子数组

编辑:再想一想,Olivier的方法很好,因为它确实允许您使用commentID值构建永久链接。通过选择commentdata的“id”字段,并忽略其他所有内容,您就拥有了永久链接url中包含的格式为“id\u comments\u fbid”的易失性代码


编辑:Olivier的方法不会触发对现有评论的回复,因为这些评论是通过选择“评论”而不是通过给定的查询来解决的。

太好了,这非常有见地。关于获取评论的新的首选方式(即通过提供唯一的页面ID检索评论列表),我的问题是我有许多不同的页面,我想允许对其进行评论。我的应用程序是基于图库的,所以我想允许对每个图像进行评论,这是一个单独的页面。我希望随着时间的推移会有成千上万的图片,所以我不会