10

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

    }

}

输出:

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. 对于limit100、1000 和 10000,我必须每次在整个返回的新闻提要中都有两个重复的帖子(174 - 172 = 194 - 192)。为什么?我从来没有在我的个人新闻提要上两次看到相同的帖子......

  3. 使用(并且仅使用)alimit为 100,我得到的较旧的帖子是在 2012 年创建的,同时其他值limit使查询检索在 2009 年创建的帖子。我可以理解,上限limit(1000或 10000),查询检索较旧的帖子。但是为什么a limitof 10 使查询检索到较旧的帖子而不是查询限制为 100

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

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?它是否在文档中的任何地方指定?

4

3 回答 3

18

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

Facebooklimit仅限于 500 个帖子。无论您设置高于 500 的限制,它最多只能获取 500 个结果。尝试 500(或更多),您将获得最多的帖子。

您不会每次都收到 500 个帖子,但通常会收到超过 490 个帖子。一些帖子因各种原因被过滤(如隐私、被屏蔽的用户、不适合特定区域等)

这回答了你的第一个和第四个问题。

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

对于问题没有。3、神助facebook!

编辑

对于第 4 个问题,您可能会达到图形 api 的查询/小时限制(facebook 使用它来防止垃圾邮件,您不能快速连续频繁地查询 api)

还,

脸书过滤器

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

(如果您指定了“5”的限制,但返回的五个帖子对查看者不可见,您将得到一个空的结果集。)

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

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

此外,特定表的结果数也有限制。您可以在各自的 fql 表中获得有关它们的详细信息。

对于流表(用于帖子/提要的表),

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

参考:Fql流表

也看这里: Facebook FQL 流限制?

于 2012-05-13T20:36:46.720 回答
3

Facebook 开放图形 API 分页中存在与限制参数有关的持续错误。上限越高,帖子的页数就越多——好像下限也会剔除帖子的样本。自从9月份帖子搜索功能关闭一个月以来,这个问题就浮出水面并退却了。

一个新的错误已经浮出水面:目前,没有 access_token 和小限制(如 12)的帖子搜索将返回很少且人口稀少的结果页面。使用 API 文档示例中给出的 access_token 进行的相同搜索将提供 12 个结果的整页 +/- 并且不会跳过。我不知道他们使用什么样的 access_token,但我没有尝试重复他们的结果。没有访问令牌的帖子搜索或多或少没有功能(再次)!

于 2012-12-09T16:43:56.153 回答
0

facebook 端可能有一些逻辑来防止数据挖掘。尝试在浏览页面时添加一些延迟,看看是否更好。

于 2012-05-19T03:30:56.633 回答