Instagram 的 GET/tags/<tag>/media/recent Pagination 是如何工作的?
Posted
技术标签:
【中文标题】Instagram 的 GET/tags/<tag>/media/recent Pagination 是如何工作的?【英文标题】:How Does Instagram's GET/tags/<tag>/media/recent Pagination Actually Work? 【发布时间】:2014-01-04 16:26:30 【问题描述】:我正在尝试使用Real-time Photo Updates API 来获取所有带有特定标签的图片。因为来自此 API 的更新实际上只会告诉您 新内容存在(但不是什么),每当我收到有关某些事情发生变化的通知时,我都会使用我的标签查询最近的媒体。
我遇到的问题是我不断收到该查询返回的重复媒体。文档说这个 API 会分页,但我根本无法让它工作。
文档here 说要在查询字符串中使用min_id
和max_id
来控制分页,但是它说:
MIN_ID - 返回此 min_id 之前的媒体。
MAX_ID - 在此 max_id 之后返回媒体。
这似乎是倒退的(通常 min 应该返回高于最小值的项目,而 max 应该返回低于最大值的项目,这样当你指定两者时,你会得到一个有界的范围)。
我从查询中返回的实际 JSON 包括一个这样的分页对象:
"pagination":
"next_max_tag_id": "1387272337517",
"deprecation_warning": "next_max_id and min_id are deprecated for this endpoint; use min_tag_id and max_tag_id instead",
"next_max_id": "1387272337517",
"next_min_id": "1387272345517",
"min_tag_id": "1387272345517",
"next_url": "https://api.instagram.com/v1/tags/cats/media/recent?access_token=xxx&max_tag_id=1387272337517"
next_url
属性中指定的参数是max_tag_id
,而不是文档中所说的max_id
。
还有一个弃用警告指出 next_max_id
和 min_id
已弃用,但由于分页对象中有类似名称的属性,我不知道查询参数或对象属性是那些被弃用的..
我认为这意味着属性,因为查询字符串从未使用过next_max_id
的参数,但是弃用消息说使用min_tag_id
和max_tag_id
并且分页上没有max_tag_id
属性对象(只是一个next_max_tag_id
)。
不管所有这些相互冲突的文档,我在查询字符串中传递的内容似乎都无关紧要 - 我继续在后续查询中获得重复媒体。有人可以帮我理解这个 API 吗?我真正想要的只是获得自上次查询以来新的标记媒体。
【问题讨论】:
【参考方案1】:要获取特定标签的最新克数集,请使用以下命令:
https://api.instagram.com/v1/tags/latergram/media/recent?access_token=TOKEN
从该响应中,您可以通过从响应中获取min_tag_id
(在分页下)并构建一个如下所示的网址,从同一标签中获取更新的克:
https://api.instagram.com/v1/tags/latergram/media/recent?access_token=TOKEN&min_tag_id=1387332980547
或者您可以使用原始响应中的 next_url 参数(也在分页下)获取下一组(较旧的)gram,如下所示:
https://api.instagram.com/v1/tags/latergram/media/recent?access_token=TOKEN&max_tag_id=1387332905573
确保您的后续查询(针对特定标签的新克)使用最新响应返回的min_tag_id
。我做了一些测试,没有看到重复,但是我使用的是#latergram,而且那个帖子的数量很大
【讨论】:
切换到#latergram 向我展示了我的问题。我正在使用#selfie(就像消防水带一样),所以我无法清楚地看到我正在使用相同的 min_id 发出多个请求。 更多POST
s 来自 Instagram,而我仍在等待我发出的最后一个 GET
命令的响应。由于在GET
回来之前我无法更新min_id
,所有这些POST
s 都触发了重复的GET
请求。
@zachallia 您将如何解决标签更新量非常大的问题?我面临着类似的问题:我不想错过任何被标记的照片,但等待GET
请求返回意味着多次使用相同的 min-id。
@zachallia 你说Make sure your subsequent queries (for new grams of a particular tag) are using the min_tag_id returned by the latest response
最新是什么意思。这是我做的最后一个,还是最近克的一个?另外,我应该在这个新范围内的其他调用中保留min_tag_id
和max_tag_id
吗?
我在哪里可以得到min_tag_id
?【参考方案2】:
@zachallia 已现场回答,但我认为它不会伤害草图:
作为Instagram API says:
MIN_TAG_ID Return media before this min_tag_id.
MAX_TAG_ID Return media after this max_tag_id.
这是违反直觉的,带有轻微的坚果味。不过还是可以理解的。
/tags/MYTAG/media/recent
端点将为您提供克数,按使用 MYTAG 标记的新近程度排序。当然,你不会得到所有的克数,只会达到 Instagram 设置的限制:
|yesteryear ------------------ <---- LIMIT ----> now|
如果你像/tags/MYTAG/media/recent?min_tag_id=X
那样使用min_tag_id
,你会从X 和之前(又名更早)获得克数:
|yesteryear ------- <---- LIMIT ---> min ------- now|
如果你像 /tags/MYTAG/media/recent?max_tag_id=Y
那样使用 max_tag_id
,你会从 Y 和之后(又名更新)获得克数:
|yesteryear ------- max <---- LIMIT ---> ------- now|
这就是“max”表示“较新”和“min”表示“较旧”的方式。
【讨论】:
你好。我应该如何使用min_tag_id
和max_tag_id
?他们在请求中应该有什么值?我尝试给他们随机值,如23423423
,但我收到这样的错误:min_id must not be a media id
@Ionut min/max_tag_id 必须是实际的媒体 ID(现有 Instagram 媒体帖子的 ID)。所以是的,你可以使用23423423
,只要它是一个实际的媒体 ID。以上是关于Instagram 的 GET/tags/<tag>/media/recent Pagination 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章
将 instagram 嵌入 Android WebView
Instagram client.tag_recent_media 零结果 #<Hashie::Array []>