如何从Instagram Python客户端检索视频?

时间:2014-03-11 17:23:22

标签: python api video client instagram

我使用Python Instagram Client从Instagram检索数据。我创建了一个Instagram帐户用于测试目的,我有三个媒体内容:两个图像和一个视频。在使用Python Instagram客户端使用python控制台发出请求后,我得到下一个响应(django shell):

>>> recent_media, next = api.user_recent_media()
>>> recent_media
>>> [Media: 673901579909298365_1166496117, Media: 673880146437045009_1166496117, Media: 673827880594143995_1166496117]

我检查了所有媒体对象,尽管最后一个媒体对象是视频,但它们中没有视频信息。所有三个对象都返回一个名为images的属性;最后一个媒体对象,尽管是我之前说过的视频,但它还有一个images属性,其中包含不同分辨率的视频快照。在阅读Instagram Rest API之后,我的理解是最后一个Media对象应该有一个名为videos的属性,这将是一个dict,并且视频信息会在那里(基本上我对检索视频' url感兴趣)。

我的问题是:Python Instagram客户端是否过时,所以它根本不返回视频信息,我必须使用其余的api来获取视频信息?或者我在请求中做错了什么?

提前致谢

1 个答案:

答案 0 :(得分:2)

你没有做错任何事。 Instagram的Python API充满了缺少的功能和错误。我已将它们修复到我自己的本地版本上,但我没有向官方github推送任何东西,我不确定他们会接受这些更改。

一般情况下,他们的API客户端在将数据转换回模型时会剥离数据。为什么他们不仅仅使用将字典转换为点符号模型的东西,我不确定。它完全是手动的,充满了错误/糟糕的Python IMO。无论如何,要点是数据就在那里,但是当他们从字典转换成他们专有的API模型时,他们忽略了它。

以下是我发现您尝试做的事情存在问题:

  1. API媒体模型中未返回“类型”信息。有一个“类型”属性,您可以检查任何与媒体相关的响应,以查看它是图像还是视频。您可以像我一样自己添加,或者您可以尝试假设任何带有填充数据的“视频”部分的视频都是视频。

  2. API媒体模型不返回“视频”信息。我自己也加了这个。您可以使用两个URL,如果查看json,可以看到这两个URL,一个用于标准分辨率,另一个用于低分辨率。处理响应时,这些属性并不总是存在,因此您的代码应该使用get / getattr / etc进行检查。相应

  3. API中的分页信息也被IMO破坏。您应该使用一些不同的信息来获取一个对象,其中一部分声称已被弃用(为什么他们使用此信息在同一版本端点上对响应进行膨胀,我不知道)。您在此处获得的唯一信息是下一个分页URL,这在python API客户端中完全没用。当你使用python客户端的全部原因是为了避免这种情况时,没有理由回到你必须手动调用和解析API之外的REST URL。无论如何,您需要做的是修补API客户端以再次向您发回适当的模型,或者只是将其解析出URL。我原本选择做后者,因为最初我希望不修补客户端本身。您会遇到另外一个问题,因为某些端点(如标记)实际上会更改您返回的分页网址中的查询字符串参数,因此您必须有条件地检查它们为您提供的内容。再次,设计是不一致的,这不是一件好事IMO。

  4. 如果你愿意,我可以为所有这些发布代码,但是如果你想尝试找到一种更优雅的方法来修补所有这些,你想看看我相信API中的models.py。我现在不在代码前面,但这是我在记忆中所做的。

    1. 创建一个继承媒体模型的新视频模型,就像它们为图像模型所做的那样。

    2. 在他们阅读响应字典的地方,解析视频并将其添加到响应词典中,因为他们执行了图像。请记住添加一个前置条件,以检查视频密钥是否丢失,如前所述。

    3. 解析type属性并将其添加到响应模型中。

    4. 为分页数据添加模型并将其解析到模型中。或者,如果您愿意,可以通过自己的代码中的一些查询字符串解析来包装它。

    5. 如果您执行以上所有操作,您应该只需阅读“视频”属性即可获得2个视频网址。而已。信息总是在响应中返回,只记得他们正在将它丢弃在代码中。如果您愿意,我很乐意提供代码\更多信息。

      编辑:这是一些代码 - 放在API的object_from_dictionary中的models.py中:

          #add the videos
          if "videos" in entry:
              new_media.videos = {}
              for version, version_info in entry['videos'].iteritems():
                  new_media.videos[version] = Video.object_from_dictionary(version_info)
          #add the type
          new_media.type = entry.get('type')
      
      
          #Add this class as well for the videos....
          class Video(ApiModel):
      
          def __init__(self, url, width, height):
             self.url = url
             self.height = height
             self.width = width
      
          def __unicode__(self):
              return "Video: %s" % self.url