【问题标题】:How to retrieve videos from Instagram Python client?如何从 Instagram Python 客户端检索视频?
【发布时间】:2014-04-15 10:32:04
【问题描述】:

我正在使用 Python Instagram Client 从 Instagram 检索数据。我创建了一个 Instagram 帐户用于测试目的,其中包含三个媒体内容:两个图像和一个视频。在使用 python 控制台使用 Python Instagram Client 发出请求后,我得到下一个响应(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 的属性,这将是一个字典,并且视频信息会在那里(基本上我对检索视频的 url 感兴趣)。

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

提前致谢

【问题讨论】:

    标签: python api video client instagram


    【解决方案1】:

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

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

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

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

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

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

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

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

    2. 他们在哪里读取响应字典,解析视频并将它们添加到响应字典中,就像他们处理图像一样。记得添加一个前置条件来检查我之前提到的视频键是否丢失。

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

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

    如果您完成上述所有操作,您应该能够简单地读取“视频”属性并获取 2 个视频 URL。而已。信息总是在响应中返回,请记住他们将其放入代码中。如果您愿意,我很乐意提供代码\更多信息。

    编辑:这里有一些代码 - 将 models.py 放入 API 的 object_from_dictionary 中:

        #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
    

    【讨论】:

      猜你喜欢
      • 2012-10-19
      • 1970-01-01
      • 2015-06-20
      • 2013-07-21
      • 2020-06-25
      • 1970-01-01
      • 2017-12-14
      • 1970-01-01
      • 2021-07-16
      相关资源
      最近更新 更多