【问题标题】:How to fetch more than 25 post messages如何获取超过 25 条帖子
【发布时间】:2011-12-17 17:27:12
【问题描述】:

我正在尝试使用restfb获取所有帖子,我的代码如下

public Connection<Post> publicSearchMessages(Date fromDate, Date toDate) {
    Connection<Post> messages = publicFbClient.fetchConnection("search",
            Post.class,
            Parameter.with("q", "Watermelon"),
            Parameter.with("since", fromDate),
            Parameter.with("until", toDate),
            Parameter.with("type", "post"));

    return messages;
}

这只给出最新的 25 条帖子。

Parameter.with("limit",100 )

如果我设置限制参数,它会提供 100 条消息,但我不想限制获取帖子消息。所以,

我是否可以在不设置限制参数的情况下获得与搜索条件匹配的完整帖子列表?

【问题讨论】:

  • 所有查询的默认设置为 25。您必须使用 limit 参数才能超出此范围。
  • 认为你必须处理limit,因为FB不会让你通过无限的结果大小来增加它的机器上的负载。
  • 是的,有办法……

标签: java facebook restfb


【解决方案1】:

也许您可以尝试使用循环。 FB每次不能超过1000,所以可以使用循环来获取整个feed。像这样使用偏移量:

Parameter.with("limit", 1000));
Parameter.with("offset", offset));

Offset 将是一个变量,其值为 1000,2000,3000...

【讨论】:

    【解决方案2】:

    没有办法从 FB 获取无限的结果。默认限制设置为 25。如您所知,您可以使用 limit 参数更改此设置。我还没有找到限制搜索网络的上限。也许,您可以将其设置为非常高的数量。

    【讨论】:

      【解决方案3】:

      正如我最近测试的那样,您无需指定任何内容。 Connection类是这样实现Iterable的:

      • 获取 25 个结果
      • hasNext 检查是否有下一项要处理
      • 如果没有,它将获取下一页的 25 个结果

      所以基本上你需要做的就是:

      Connection<Post> messages = publicFbClient.fetchConnection("search",
              Post.class,
              Parameter.with("q", "Watermelon"),
              Parameter.with("since", fromDate),
              Parameter.with("until", toDate),
              Parameter.with("type", "post"));
      
      for (List<Post> feedConnectionPage : messages) {
              for (Post post : myFeedConnectionPage) {
                       // do stuff with post
              }
      }
      

      如果您想要某种返回结果的方法,我会非常小心,因为您可能会返回数千个结果并且爬过它们可能需要一些时间(从几秒到几分钟甚至几小时)和结果对象数组会非常大。更好的想法是使用一些异步调用并定期检查方法的结果。

      虽然参数“since”似乎被忽略了。帖子是从最新到最旧的,我认为它在进行分页时以某种方式遗漏了这个参数。

      希望我让你更清楚:)

      【讨论】:

        【解决方案4】:

        我们在 Post 中有一个 Iterator 对象。所以我们可以这样做:

        Connection<Post> messages = publicFbClient.fetchConnection(...) ;
        someMethodUsingPage(messages);
            while (messages.hasNext()) {
                messages = facebookClient.fetchConnectionPage(messages.getNextPageUrl(), Post.class);
                someMethodUsingPage(messages);
            }
        

        然后在每条消息中,我们将有接下来的 25 条消息。

        【讨论】: