Facebook的开放图谱API:参数极限怪异的行为,同时得到一个分页用户的新闻提要(Faceboo

2019-06-24 08:09发布

我用Java编写的小脚本,它测试参数limit有四个不同的值(10,100,1000和10000)查询使用的Open Graph API脸谱用户的新闻提要 ,当RestFB客户端 。 正如你所看到的,它有一个奇怪的行为...

场景:

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);
        }

    }

}

输出:

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

解释和问题:

  1. 很显然, 你不能让所有的职位用户已经在他的新闻馈送了,因为他的帐户创建。 被限制的限制?

  2. 随着limit的100,1000和10000,我必须每次都得全返回新闻提要中的两个重复的职位 (174 - 172 = 194 - 192)。 为什么? 我从来没有见过同一职位上两次我个人的新闻源...

  3. 随着(只有用),一个limit的100,上了年纪后我是否会在2012年创建的,同时的其他值limit使查询检索这是在2009年创建的信息,我可以理解,与上limit (1000或10000),查询检索旧帖子。 但是,为什么一个limit的10使查询检索旧的岗位比100限制查询

  4. 最后但并非最不重要的一点: 我没有得到相同数量的职位 。 很显然,越limit高,检索到的帖子的数量越多是高的。 我想的第一件事,是较小的唯一后果limit是页面上数(这是案件虽然),但检索到的帖子的数量不会改变。 但它确实。 为什么? 这就是说,职位的数目似乎与收敛limit的100和1000,因为职位的数目是用相同limit的1000和limit的10000。

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

为什么200? 这是不是在任何地方指定文件 ?

Answer 1:

它不是在文档,但我个人已经测试以下为我的项目。

Facebook的limit被限制在2500个职位。 无论你把一个极限高于500就只获取500个结果最大。 500(或更多)尝试,你会得到最大的职位。

每一次你不会得到500个职位,但将获得上述一般490个职位。 有些职位获得由各种原因(如隐私,被查封的用户,不适合特定区域和其他东西)过滤

这回答你的第1,4 quetion。

对于问题没有。 2,我没有在Java中工作,所以我不能说,如果有一个在你的代码/逻辑或你的代码做一个概率。

对于问题没有。 3,上帝帮助Facebook!

编辑

对于第4个问题,你可能会被击中图形API的查询/小时的限制(在Facebook用它来防止垃圾邮件,你不能查询频繁的API临门)

也,

这是为什么,你没有得到被Facebook返回的所有结果。

(如果你指定的“5”的限制,但返回的五个职位是不可见的观众,你会得到一个空的结果集。)

除了为每个上面列出的表和连接的文件中提到的限制,是有帮助的知道结果的最大数量之前运行的可视性检查是5000,我们将获取。

参考: 寻呼与图形API和FQL

此外,还有为特定表上没有结果的限制。 你可以得到关于他们的细节在各自的FQL表。

对于流表(一个用于帖/进料),

流表中的每个查询被限制为前30天或50发的帖子,取较大值,但是可以使用特定的时间字段,诸如CREATED_TIME与FQL运营商(如<或>)沿检索的大得多的范围帖子。

参考: FQL流表

看看这里太: Facebook的FQL流限制?



Answer 2:

有一个持续的错误在Facebook开放图形API呼叫具有极限参数来完成。 该限越高,职位越页---仿佛下限也剔除职位的采样。 这个问题已经浮出水面,退到自从职位搜索功能下降了一个月在九月。

一个新的bug已经浮出水面:目前一个搜索后没有和的access_token小限(如12)将返回一些和人口稀少结果页面。 在API文档例子中给出的提出的access_token相同的搜索将给予12个结果+/-没有跳过整个页面。 我不知道是什么样的,他们的access_token使用,但对我而言没有尝试复制他们的结果。 该搜索后没有访问令牌或多或少非功能性(再次)!



Answer 3:

有可能是在Facebook上侧的一些逻辑,以防止数据挖掘。 尝试添加一些延迟经历页面,同时,看看是否更好。



文章来源: Facebook Open Graph API: weird behavior of parameter limit while getting a paginated user's news feed