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

Posted

技术标签:

【中文标题】Facebook Open Graph API:获取分页用户新闻提要时参数限制的奇怪行为【英文标题】:Facebook Open Graph API: weird behavior of parameter limit while getting a paginated user's news feed 【发布时间】:2012-05-20 04:15:09 【问题描述】:

我用 JAVA 编写了一个小脚本,当查询 用户的新闻提要Facebook 使用 Open Graph API 和 RestFB client。如您所见,它有一个奇怪的行为......

场景:

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

解读和提问:

    显然,您无法获取用户自创建帐户以来在其新闻提要中发布的所有帖子。有限制吗?

    limit 的值分别为 100、1000 和 10000,在整个返回的新闻提要 (174 - 172 = 194 - 192) 中,我每次都必须有 两个重复的帖子。为什么?我从来没有在我的个人新闻提要上看到过两次相同的帖子...

    如果limit 为 100,则我得到的旧帖子是在 2012 年创建的,同时 limit 的其他值使查询检索在2009 年。我可以理解,使用上限 limit(1000 或 10000),查询检索较旧的帖子。但是为什么limit(共 10 个)使得检索旧帖子的查询比限制为 100 个的查询检索旧帖子

    最后一点:我收到的帖子数量不一样。显然,limit 越高,检索到的帖子数越多。我首先想到的是,较小的limit 的唯一后果是页数较高(尽管如此),但检索到的帖子数不会改变。但确实如此。为什么?也就是说,帖子的数量似乎在 limit 的 100 和 1000 之间收敛,因为帖子的数量与 limit 的 1000 和 limit 的 10000 相同。

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

欢迎任何回答/评论:)

干杯。

编辑:

这是我最好的recall

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?是否在documentation 中的任何位置指定?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

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

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

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

对于问题号。 3、上帝保佑facebook!

编辑

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

还有,

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

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

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

参考:Paging with graph api and fql

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

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

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

参考:Fql stream table

也看这里: Facebook FQL stream limit?

【讨论】:

感谢您的回答。我已经看到the question you asked。显然,限制是有限的,但奇怪的是我们在doc 中找不到任何细节。我个人不能获得超过 389 个帖子,并且限制为 200 个(见编辑)。所以,我会说你不能得到超过 400 个帖子,而不是 500 个。4 更多的是关于分页:为什么限制 10 使查询检索到的帖子少于限制 100?这应该只影响分页的页数,而不是帖子的数量。 谢谢,(即使我没有回答你所有的问题,你还是给了我奖品)。这是我的第一次赏金,我很高兴;) 有没有付费api可以获得超过1000/5000 cmets 联系脸书。他们支持通过付费来提供信息。【参考方案3】:

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

【讨论】:

以上是关于Facebook Open Graph API:获取分页用户新闻提要时参数限制的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

FB.API Facebook Open Graph 为某些用户的用户点赞返回空数据

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

iOS - Facebook Open Graph API - 让标题显示在用户生成的图像旁边

Facebook Post Open Graph Story 错误

使用 Graph api 获取 Facebook 页面率和评论

facebook open-graph 和 twitter 卡的有效 xhtml 元标记