3

我正在使用Facebook4j访问页面的 Facebook API。

我可以获取页面的新帖子列表,使用

connection.getFeed()

并使用以下方法获取帖子的评论:

post.getComments()

但我也希望能够获得对页面帖子的新评论(同时忽略我已经获取的评论)。除了重新搜索每个帖子的评论之外,您知道如何做到这一点吗?

4

2 回答 2

2

当前的 Facebook4j API 无法做到这一点。

如果您查看他们页面上不支持的功能列表,您会看到:

您正在寻找的是新评论的实时更新

您可以查看有关订阅实时更新的指南。

如果您查看我在上面提供的实时更新链接,您会注意到实时更新仅限于某些类型的对象及其字段的子集,这些字段也列在此处。

可用订阅的有效对象类型是用户和页面Graph API 对象(其中包括提要字段)。

实时更新仅表明特定字段已更改,它们不包括这些字段的值。因此,这只会使应用程序更高效,因为它们确切地知道何时发生了更改,并且在没有发生更改时不需要依赖连续甚至定期的 Graph API 请求。

您将知道对象的哪个字段(用户/页面/权限/付款)已更改,在您的情况下是提要。

但除此之外,您还必须浏览所有您感兴趣的帖子和评论——尽管您可能可以有效地做到这一点。为此,您可能可以保留获取提要的 Facebook4j API 代码,并在更新时重新调用它。或者更好的是升级代码以仅跟踪您想要的更改等等。

这里有这个例子(SO)关于如何在java中获取facebook实时更新。你会明白这一点,并且可能会构建更好的东西。

这个答案建议使用Spring Social Facebook,因为它有一个实时更新控制器来处理来自 Facebook 的实时更新回调,而RestFB不能Facebook4j这样做。

于 2015-08-20T15:40:42.910 回答
1

要回答这个问题,如果 Facebook4j 支持这个,不,它不支持。

使用官方图形 API 也不容易做到这一点,因为评论使用cursor based pagination; 所以过滤器喜欢since并且until不会工作(他们会处理类似的事情feed。(来源

为了做你想做的事,你需要从现在到最后一次得到所有评论。您可以使用以下命令对返回的评论进行排序(最近的第一个,最旧的最后一个)?filter=stream

为此,您可以通过 fb4j执行原始 fb 请求:

// GET
Map<String, String> params = new HashMap<String, String>();
params.put("filter", "stream"); //add the ?filter=stream

//res will be the RAW response
RawAPIResponse res = facebook.callGetAPI("POST_ID/comments");
//you can get it as a JSONObj with:
JSONObject jsonObject = actual.asJSONObject();

或者,要在没有原始请求的情况下执行此操作,您可以使用comment.getCreatedTime()获取每个评论的时间,然后过滤掉旧评论。

无论哪种方式,您都必须自己过滤它们,因为facebook4j 和图形 API 都不支持本机

于 2015-08-24T20:17:46.327 回答