我正在使用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 模型时他们忽略了它。
以下是我发现您正在尝试执行的操作存在问题的内容:
API 媒体模型中不会返回“类型”信息。有一个“类型”属性,您可以检查任何与媒体相关的响应,看看它是图像还是视频。您可以像我一样自己添加此内容,或者您可以尝试假设您获得的任何包含填充数据的“视频”部分的内容都是视频。
API 媒体模型不会返回“视频”信息。我自己也刚刚添加了这个。如果您查看 json,您可以使用两个 URL,一个用于标准分辨率,一个用于低分辨率。当您处理响应时,这些属性并不总是存在,因此您的代码应该使用 get/getattr/etc 进行检查。相应地。
API 中的寻呼信息在我看来也已损坏。您应该返回一个包含一些不同信息的对象,他们声称其中一部分已被弃用(为什么他们使用此信息在同一版本端点上夸大响应,我不知道)。您在这里获得的唯一信息是用于分页的下一个 url,这在 python API 客户端中完全无用。当您使用 python 客户端的全部原因是为了避免这种情况时,没有理由取回您必须在 API 外部手动调用和解析的 REST URL。无论如何,您需要做的是修补 API 客户端,以便再次向您发送回正确的模型,或者只是从 URL 中解析它。我最初选择后者是因为最初我希望不给客户端本身打补丁。您将遇到一个额外的问题,因为某些端点(例如标签)实际上会更改您返回的分页 URL 中的查询字符串参数,因此您必须有条件地检查它们为您提供的内容。再说一遍,设计不一致,在我看来这不是一件好事。
如果您愿意,我可以发布所有这些的代码,但是如果您想尝试找到一种更优雅的方法来修补所有这些,您需要查看 API 中的 I believe models.py。我现在不在代码前面,但这是我根据内存所做的。
创建一个继承媒体模型的新视频模型,就像对图像模型所做的那样。
他们读取响应字典,解析视频并将其添加到响应字典中,就像处理图像一样。请记住添加一个前提条件来检查视频 key 是否丢失,正如我之前提到的。
解析类型属性并将其添加到响应模型中。
为分页数据添加模型并将其解析到模型中。或者,如果您愿意,可以通过一些查询字符串解析将其包装在您自己的代码中。
如果您执行了上述所有操作,您应该能够简单地读取“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/