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

如何从Instagram Python客户端检索视频?,python,api,video,client,instagram,Python,Api,Video,Client,Instagram,我用它从Instagram中检索数据。我创建了一个Instagram帐户,用于测试,其中我有三种媒体内容:两张图像和一段视频。在使用Python控制台使用Python Instagram客户端发出请求后,我得到下一个响应(django shell): 我检查了所有媒体对象,其中没有视频信息,尽管最后一个媒体对象是视频。所有三个对象都返回一个名为images的属性;最后一个媒体对象,尽管如我前面所说是一个视频,但也有一个images属性,具有不同分辨率的视频快照。阅读Instagram Rest

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

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

我的问题是:Python Instagram客户端是否已经过时,因此它根本不返回任何视频信息,而我必须使用rest api获取视频信息?还是我的请求有问题


提前谢谢

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

通常情况下,他们的API客户机在将数据转换回模型时正在剥离数据。我不确定他们为什么不只是使用将字典转换为点符号模型的东西。它完全是手工操作的,而且充满了错误/糟糕的Python IMO。无论如何,要点是数据都在那里,但是当从字典转换到专有API模型时,他们忽略了它

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

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

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

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

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

  • 创建从媒体模型继承的新视频模型,就像他们对图像模型所做的那样

  • 在那里,他们阅读响应字典,解析出视频,并像处理图像一样将其添加到响应字典中。请记住添加一个先决条件,以检查视频键是否如我前面提到的那样丢失

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

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

  • 如果您完成了上述所有操作,您应该能够简单地读取“videos”属性并获取2个视频URL。就这样。信息总是会在响应中返回,只需记住他们会在代码中删除它。如果您愿意,我很乐意提供代码\更多信息

    编辑:下面是一些代码-从API中的_字典中放入object_中的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
    
        #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