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_idmax_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_idmin_id 已弃用,但由于分页对象中有类似名称的属性,我不知道查询参数或对象属性是那些被弃用的..

我认为这意味着属性,因为查询字符串从未使用过next_max_id 的参数,但是弃用消息说使用min_tag_idmax_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 发出多个请求。 更多 POSTs 来自 Instagram,而我仍在等待我发出的最后一个 GET 命令的响应。由于在GET 回来之前我无法更新min_id,所有这些POSTs 都触发了重复的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_idmax_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_idmax_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

如何在 <img> 标签中显示此 Instagram 图片

Instagram client.tag_recent_media 零结果 #<Hashie::Array []>

Instagram ?__a=1&max_id=<end_cursor> 不适用于公共用户提要

状态栏项目颜色更改为 Instagram

R - Instagram 主题标签抓取