Facebook Open Graph API:获取分页用户的新闻源时参数限制的奇怪行为

sp0*_*00m 10 pagination facebook limit news-feed facebook-graph-api

我在JAVA中编写了一个小脚本,在使用Open Graph APIRestFB客户端查询用户的Facebook新闻源时,使用四个不同的值(10,100,1000和10000)测试参数limit.正如你所看到的,它有一种奇怪的行为......

场景:

public static void main(String[] args) {

    // vars
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    FacebookClient client = new DefaultFacebookClient(accessToken);
    Connection<Post> home;
    List<Post> postList;
    Map<String, Post> postMap;
    int i;

    // limits to test
    String[] limits = {"10", "100", "1000", "10000"};
    for (String limit : limits) {

        // init list and map (looking for duplicate posts)
        postList = new LinkedList<Post>();
        postMap = new LinkedHashMap<String, Post>();
        // get news feed
        home = client.fetchConnection(id + "/home", Post.class, Parameter.with("limit", limit));

        // going through pages
        i = 1;
        for (List<Post> page : home) {
            for (Post post : page) {
                // store into list
                postList.add(post);
                // store into map (unique post id)
                postMap.put(post.getId(), post);
            }
            i++;
        }

        // sort posts by created time
        Collections.sort(postList, new Comparator<Post>() {
            @Override
            public int compare(Post post1, Post post2) {
                return post1.getCreatedTime().compareTo(post2.getCreatedTime());
            }
        });

        // log
        try {
            FileWriter out = new FileWriter("log/output.txt", true);
            out.write("LIMIT: " + limit + "\n");
            out.write("\tPAGES: " + (i - 1) + "\n");
            out.write("\tLIST SIZE: " + postList.size() + "\n");
            out.write("\tMAP SIZE: " + postMap.size() + "\n");
            out.write("\tOLDER POST: " + dateFormat.format(postList.get(0).getCreatedTime()) + "\n");
            out.write("\tYOUGNER POST: " + dateFormat.format(postList.get(postList.size() - 1).getCreatedTime()) + "\n");
            out.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

输出:

LIMIT: 10
    PAGES: 7
    LIST SIZE: 56
    MAP SIZE: 56
    OLDER POST: 2009-03-22 14:58:03
    YOUGNER POST: 2012-05-11 15:48:49
LIMIT: 100
    PAGES: 3
    LIST SIZE: 174
    MAP SIZE: 172
    OLDER POST: 2012-01-12 23:01:34
    YOUGNER POST: 2012-05-11 15:48:49
LIMIT: 1000
    PAGES: 2
    LIST SIZE: 294
    MAP SIZE: 292
    OLDER POST: 2009-03-22 14:58:03
    YOUGNER POST: 2012-05-11 15:48:49
LIMIT: 10000
    PAGES: 2
    LIST SIZE: 294
    MAP SIZE: 292
    OLDER POST: 2009-03-22 14:58:03
    YOUGNER POST: 2012-05-11 15:48:49
Run Code Online (Sandbox Code Playgroud)

解释和问题:

  1. 显然,自从他的帐户创建以来,您无法获得用户在其新闻Feed中拥有的所有帖子.限制有限吗?

  2. 使用limit100,1000和10000,我必须每次在整个返回的新闻提要中有两个重复的帖子(174 - 172 = 194 - 192).为什么?我从未在个人新闻摘要上看过两次相同的帖子......

  3. 随着(并且只有)limit100的一个,我得到的旧帖子是在2012年创建的,同时其他值limit使查询检索在2009年创建的帖子.我可以理解上面的limit(1000)或10000),查询检索旧帖子.但是为什么10中的一个limit使查询检索旧帖子而不是查询限制为100

  4. 最后但并非最不重要的一点:我没有得到相同数量的帖子.显然,越高limit越高,检索帖子的数量越多.我首先想到的是,较小的唯一后果limit是页面数量较多(尽管如此),但检索到的帖子数量不会改变.但确实如此.为什么?也就是说,帖子的数量似乎在limit100到1000之间,因为帖子的数量与limit1000和limit10000的相同.

PS:为查询指定since和/或until参数不会改变任何内容.

任何答案/评论都是受欢迎的 :)

干杯.

编辑:

这是我最好的回忆:

LIMIT: 200
    PAGES: 3
    LIST SIZE: 391
    MAP SIZE: 389
    OLDER POST: 2012-01-27 14:17:16
    YOUGNER POST: 2012-05-11 16:52:38
Run Code Online (Sandbox Code Playgroud)

为什么200?它是否在文档中的任何位置指定?

Jas*_*ant 18

它不在文档中,但我亲自为我的项目测试过.

Facebook limit仅限500个帖子.无论你设置的限制高于500,它最多只能获得500个结果.尝试使用500(或更多),您将获得最多的帖子.

你不会每次都获得500个帖子,但一般会获得490个以上的帖子.有些帖子因各种原因(如隐私,被阻止的用户,不适合特定区域和其他内容)进行过滤

这回答了你的第1和第4个问题.

对于问题没有.2,我不在java中工作,所以我不能说你的代码/逻辑是否有问题,或者你的代码在做什么.

对于问题没有.3,上帝帮助facebook!

编辑

对于第4个问题,你可能会达到图api的查询/小时限制(Facebook使用它来防止垃圾邮件,你不能经常快速查询apis)

也,

Facebook过滤器

这就是为什么,你没有得到facebook返回的所有结果.

(如果您指定了限制"5"但是返回的五个帖子对查看器不可见,您将获得一个空的结果集.)

除了上面列出的每个表和连接的文档中提到的限制之外,知道在运行可见性检查之前我们将获取的最大结果数是5,000是有帮助的.

参考:使用图形api和fql进行分页

此外,对特定表的结果没有限制.您可以在各自的fql表上获得有关它们的详细信息.

对于流表(发布/订阅的表),

流表的每个查询都限制在前30天或50个帖子中,以较大者为准,但是您可以使用特定于时间的字段(如created_time)和FQL运算符(例如<或>)来检索更大范围的帖子.

参考:Fql流表

看看这里: Facebook FQL流限制?