使用 Instagram gem 获取所有用户的图片

Posted

技术标签:

【中文标题】使用 Instagram gem 获取所有用户的图片【英文标题】:Fetching all user's pictures with the Instagram gem 【发布时间】:2015-05-14 15:21:31 【问题描述】:

我想使用 instagram gem (https://github.com/Instagram/instagram-ruby-gem) 获取我所有的照片,但我不知道如何操作。

这是我目前正在尝试的:

client = Instagram.client(access_token: token)
client.user_recent_media.each do |media|
    puts media.images.thumbnail.url
end

它显然有效(这些是我的 Instagram 图片),但我无法获取所有图片或以任何方式从 Instagram 中选择我想要的内容。

例如,我看到方法 user_recent_media 接受一个 "count" 属性,该属性应该让我使用某种分页:

(from https://github.com/Instagram/instagram-ruby-gem/blob/master/lib/instagram/client/users.rb#L150)
@option options [Integer] :count (nil) Limits the number of results returned per page

不幸的是,我不明白这个分页应该如何工作。例如,如果我请求 1000 个媒体元素(只是说所有这些元素)它不起作用并且返回的元素更少,那么我就被卡住了,因为我不知道如何请求第 2 页

有人用 Instagram gem 做这样的事情吗?非常感谢任何帮助

【问题讨论】:

【参考方案1】:

下面是导入用户的旧应用程序的功能代码(我刚刚使用 1.1.5 Instagram Gem 运行它,它仍然有效),它也使用光标。您应该能够更改一些变量和行并继续前进:

  def import_followers
    response = user.client.user_follows
    followers = [].concat(response)
    next_cursor = response.pagination[:next_cursor]
    while !(next_cursor.to_s.empty?) do
      response = Instagram.user_follows(uid, :cursor => next_cursor)
      next_cursor = response.pagination[:next_cursor]
      followers.concat(response)
    end
    return followers
  end

【讨论】:

【参考方案2】:

根据@nrowegt 的回答,我自定义了代码。

首先,我们初始化 Instagram Gem(访问令牌将映射 Instagram 用户 ID)

client = Instagram.client(:access_token => session[:access_token])

然后,我们将运行 user_recent_media 方法并将响应保存在变量中

response = client.user_recent_media

我们需要创建一个空数组来保存所有图片并添加我们的响应。请记住,Instagram API 每次调用仅返回 20 个项目,这就是我们需要执行数组和下面的“while”的原因。

album = [].concat(response)

如果用户有更多图片,响应变量将有一个名为 next_max_id 的变量。这是分页方法的内部;所以我们将 next_max_id 存储在一个变量中。

max_id = response.pagination.next_max_id

这是棘手的部分。您需要在 max_id 变量存在时运行上述代码。如果我们到达用户图片的最后一页,它将是空的。所以:

while !(max_id.to_s.empty?) do
        response = client.user_recent_media(:max_id => max_id)
        max_id = response.pagination.next_max_id
        album.concat(response)
end

唯一不同的是,这次我们运行 user_recent_media 方法并传递 max_id 变量,以便 Instagram 找出从哪里开始获取图片。

我们将最终变量发送到视图

@album = album

这是完整的代码。

client = Instagram.client(:access_token => session[:access_token])
        response = client.user_recent_media
        album = [].concat(response)
        max_id = response.pagination.next_max_id

        while !(max_id.to_s.empty?) do
            response = client.user_recent_media(:max_id => max_id)
            max_id = response.pagination.next_max_id
            album.concat(response)
        end

        @album = album

【讨论】:

愿宙斯和奥丁保佑你永生 很高兴我能帮上忙 :-)【参考方案3】:

根据documentation,您应该在从 API 收到的任何响应中收到 pagination 哈希值。类似于以下内容(取自文档):


    ...
    "pagination": 
        "next_url": "https://api.instagram.com/v1/tags/puppy/media/recent?access_token=fb2e77d.47a0479900504cb3ab4a1f626d174d2d&max_id=13872296",
        "next_max_id": "13872296"
    

您必须从 next_url 属性调用 URL 来检索下一组数据。

所以,我猜你应该能够按如下方式检索它:

client.user_recent_media.pagination.next_url

【讨论】:

以上是关于使用 Instagram gem 获取所有用户的图片的主要内容,如果未能解决你的问题,请参考以下文章

Instagram Api 获取所有未关注用户的列表

如何在没有 instagram API 的情况下从 instagram 获取公共用户的所有帖子

如何使用 instagram api/gem 模拟实际服务为方法编写测试?

Instagram gem:如何获得下一页结果?

instagram api 获取所有喜欢计数

如何从特定标签中获取 Instagram 用户名