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 错误