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

标签 python api video client instagram

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

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

提前致谢

最佳答案

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

通常发生的情况是,他们的 API 客户端在将事物转换回模型时会删除数据。我不确定为什么他们不只是使用将字典转换为点表示法模型的东西。在我看来,它完全是手动的,并且充满了错误/糟糕的 Python。无论如何,要点是数据都在那里,但在从字典转换为专有 API 模型时他们忽略了它。

以下是我发现您正在尝试执行的操作存在问题的内容:

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

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

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

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

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

  2. 他们读取响应字典,解析视频并将其添加到响应字典中,就像处理图像一样。请记住添加一个前提条件来检查视频 key 是否丢失,正如我之前提到的。

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

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

如果您执行了上述所有操作,您应该能够简单地读取“videos”属性并获取 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

关于python - 如何从 Instagram Python 客户端检索视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22332062/

相关文章:

android - 需要一个开源文本语言翻译 api

ios - 等待 swift for 循环网络请求执行完毕(原生不使用任何框架)

android - 如何以千字节为单位获取视频的大小?

python - 如何从蒙版图像中删除图章/水印?

python - 如果不在/api下则将404重定向到索引页

python - MongoDB shell 的 db.stats() 在 php 和 python 中

api - 如何使用 go 登录以使用你的谷歌日历?

java - 实时视频源的 3d 重建

android - 如何在android中将选定的图像查看为视频格式

python - 微型 python 可执行文件?