Instagram接口JSON无display_url与video_url时,如何下载最高分辨率的帖子(图片、Reels、IGTV)?
作为刚接触URL/API下载领域的开发者,碰到Instagram非官方接口的参数变化真的很头疼——毕竟他们经常调整这些未公开的接口,之前教程里的字段说没就没了。不过别担心,我们可以通过分析当前返回的JSON结构来解决这个问题。
先理清当前的JSON结构逻辑
现在你用https://www.instagram.com/p/CcjyBsquX89/__a=1这类URL获取到的JSON,虽然没有了display_url和video_url,但媒体资源的信息其实都还在,只是换了存储方式:
- 单图/单视频帖:媒体信息在
graphql.shortcode_media节点下 - 多图/多视频帖(Sidecar):媒体列表在
graphql.shortcode_media.edge_sidecar_to_children.nodes数组里
提取最高分辨率的图片URL
对于图片类内容,每个媒体节点里的display_resources数组会包含不同分辨率的版本,Instagram是按分辨率从低到高排列这些资源的,所以直接取数组的最后一个元素的src字段就是最高清的图片链接:
# 示例:解析单图帖的最高清URL import json response_json = json.loads(api_response_text) if response_json['graphql']['shortcode_media']['__typename'] == 'GraphImage': display_resources = response_json['graphql']['shortcode_media']['display_resources'] highest_res_img_url = display_resources[-1]['src'] print(f"最高清图片URL: {highest_res_img_url}")
提取最高分辨率的视频URL
对于视频类内容(Reels、IGTV、普通视频帖),你需要找video_versions数组,同样这个数组也是按分辨率从低到高排列的,取最后一个元素的url就是最高清的视频链接:
# 示例:解析单视频帖的最高清URL if response_json['graphql']['shortcode_media']['__typename'] == 'GraphVideo': video_versions = response_json['graphql']['shortcode_media']['video_versions'] highest_res_video_url = video_versions[-1]['url'] print(f"最高清视频URL: {highest_res_video_url}")
处理多媒帖(包含图片+视频的帖子)
如果是多媒帖,你需要遍历edge_sidecar_to_children.nodes数组,逐个判断每个节点的__typename(GraphImage或GraphVideo),再分别用上面的方法提取对应资源:
# 示例:解析多媒帖的所有最高清资源 if response_json['graphql']['shortcode_media']['__typename'] == 'GraphSidecar': media_nodes = response_json['graphql']['shortcode_media']['edge_sidecar_to_children']['nodes'] for node in media_nodes: if node['__typename'] == 'GraphImage': highest_res = node['display_resources'][-1]['src'] print(f"图片最高清URL: {highest_res}") elif node['__typename'] == 'GraphVideo': highest_res = node['video_versions'][-1]['url'] print(f"视频最高清URL: {highest_res}")
额外提醒
Instagram的非官方接口(比如加__a=1的这种)随时可能再次变更字段或结构,所以开发时最好加入错误处理逻辑,比如判断字段是否存在,避免程序崩溃。另外,如果是长期维护的应用,建议考虑使用Instagram的官方Graph API(需要申请权限),这样稳定性会高很多。
内容的提问来源于stack exchange,提问作者Vasant Raval

