Social & Media • 9 min read

如何下载原始高清质量的 Instagram 卷轴和视频

Instagram 不提供保存其他人的 Reels 的按钮,并且每次屏幕录制都会降低质量。从技术角度了解 Reels 的实际交付方式 - 以及如何直接从浏览器已与之通信的 CDN 中提取原始 MP4。

1. Instagram 实际上如何向您的浏览器提供 Reel

当 Reel 在 instagram.com 上播放时,视频元素的 src 属性通常是 blob: URL - 指向内存中 MediaSource 缓冲区的指针,而不是可下载文件。真实的媒体坐标实时存在于 GraphQL 负载中,Instagram 的 Web 客户端与其后端进行交换。这些有效负载中的每个媒体对象都带有一个 video_versions 数组:不同分辨率和比特率的直接 MP4 再现列表,通常是 800 kbps 左右的 640 宽变体、720p 变体以及可以运行 1,500 到 3,500 kbps 的全高 1080p 变体,具体取决于上传的源。客户端根据您的视口和连接选择一个,然后通过 MediaSource 扩展提供它。 该架构有两点对于下载很重要。首先,video_versions 中的 URL 指向 Instagram 的媒体 CDN - cdninstagram.com 和 fbcdn.net 主机 - 并且它们是使用过期令牌进行签名的。从 devtools 复制的 URL 会工作一段时间,然后停止;令牌会轮换,主机会检查与您的会话相关的标头。其次,您的浏览器接收到的有效负载正是您的会话有权看到的有效负载:用于注销和登录浏览的公共卷轴,仅当您的帐户关注该帐户时才使用私人帐户媒体。没有比您已经可以查看的内容更高的魔法级别。 这就是为什么可靠的提取点位于您自己的选项卡内。观看页面数据层的内容脚本可以在流降级之前读取 video_versions,选择最高的再现,并使用已存在的会话标头来请求它。结果是第一代文件 - 与播放器消耗的字节相同 - 不是对它的捕获,也不是从某些代理的缓存中重新编码。 故事的行为与较短的令牌生命周期类似,并且源视频和轮播使用相同的媒体对象形状,这就是为什么一个适配器可以覆盖整个表面。

2. 为什么屏幕录制会破坏卷轴 - 以及为什么网站更糟糕

人们所依赖的这两种解决方法都会降低质量,只是方式不同。屏幕录制捕获显示合成器的输出:视频被缩放以适合播放器容器,播放器自己的 UI 覆盖层会刻录到帧中,并且您受限于显示器的刷新行为 - 流畅的 30 fps 卷轴的 30 fps 录制会出现严重的口吃同步,并且音频通过带有重采样伪影的环回路径,或者在配置错误的情况下,完全通过麦克风。比特率是另一个无声杀手:追求文件大小的录制工具可能会以 2,000 kbps 的速度捕获 3,500 kbps 的源,并且无论进行多少后处理都无法恢复丢失的细节。笔记本电脑屏幕的垂直电话录音不值得进一步讨论。 基于网络的下载网站从外面看起来很干净,但内部却很脏。为了解析粘贴的 Reel URL,他们的服务器必须从数据中心 IP 获取 instagram.com,Instagram 对此提出了严格的挑战 - 登录墙、检查点页面和激进的速率限制。继续工作的网站通过缓存结果来实现这一点,这意味着您下载的文件可能是 Reel 的过时的、较低比特率的副本,此后已被重新上传或编辑。您提交的内容会被记录在运营商这边 - URL、IP、时间戳,并且这些门户网站上的大量广告货币化是记录在案的恶意软件载体。有些要求您粘贴会话 cookie 来“解锁”私人内容,这是整个生态系统中最危险的指令:交出这些 cookie,您就交出了您的帐户。 本地提取避开了此处列出的每种故障模式。没有代理接触流,不会发生第二次编码,您的会话 cookie 保留在浏览器的密钥库中,您获得的文件是 Instagram 为您提供的逐字节再现。

3. 以原始质量保存卷轴或源视频

安装视频下载器捆绑包,在同一浏览器中打开 Instagram,然后导航到任何 Reel、提要视频或个人资料。该扩展程序直接在视频播放器上注入一个下载按钮 - 一个位于框架上方的蓝色小控件,通过隔离的 Shadow DOM 进行样式设置,因此 Instagram 自己的样式表级联无法触及它,并且其 CSS 也不会泄漏到您的按钮中。在配置文件和提要上,每个视频在安装到虚拟化列表中时都会出现相同的按钮,包括您在“探索”中滚动经过的卷轴。 单击所需卷轴上的按钮。适配器从页面的数据层读取媒体对象,按分辨率对 video_versions 进行排序,并使用选项卡的会话上下文请求顶级再现 - 1080p MP4(如果源支持),以便签名的 CDN URL 验证。该文件通过 chrome.downloads.download 保存到您的默认文件夹中,文件名源自帖子的句柄和媒体 ID。在宽带上,典型的卷轴在两到五秒内完成;下载的是原版,可在任何地方播放,并且音频完好无损,因为 Instagram 将 Reels 用作单个交错 MP4。 值得了解的边缘案例。如果 Reel 的所有者启用了应用内下载,那就太好了 - 无论哪种方式,CDN 再现都是相同的。如果视频在保存时显示为 640 像素宽,则该创作者上传的分辨率较低;梯子在源头达到顶峰。品牌内容和协作解析为同一媒体对象,因此它们可以正常下载。永远无法解决的是会话可见性之外的媒体:您不关注的私人帐户、不在列表中的密友故事以及已删除的帖子。该扩展反映了您的访问权限;它没有也不能超过它。 当您想要不带视频的趋势声音时,同一按钮可以从 Reels 中提取 MP3 音频 - 对于编辑者寻找音频趋势非常有用。

4.故事、轮播和音频:需要处理的异常

Reels 很受关注,但 Instagram 的三种媒体类型都有通用工具无法解决的怪癖。故事是第一位的:它们会在 24 小时内过期,它们的 CDN 代币是平台上寿命最短的,而且许多都设置为“亲密朋友”可见性。当故事在您的会话中进行时,下载路径与 Reels 相同,这就是窗口很重要的原因 - 归档您自己的故事或您出现的合作者的故事,必须在当天进行。扩展提取胜过等待应用程序自己的“保存到存档”,因为您可以立即以原始分辨率将文件保存在下载文件夹中,而不是埋在无法导出的应用程序内部存档中。 轮播是第二种:一个帖子可以混合最多十个孩子的照片和视频,大多数一键式工具只能抓取第一张幻灯片。适配器遍历轮播的子数组,按类型标记每个项目,并按文件名中的幻灯片编号按顺序下载视频子项,因此混合媒体帖子作为有组织的集合而不是神秘的单个文件登陆。 音频是第三个。 Instagram 的潮流文化存在于授权的原创音频中,Reel 的音频嵌入在视频流中,而不是作为可以保存的单独轨道公开。提取它意味着以源比特率将 MP4 的音频基本流解复用为独立的 MP3 - 这是在浏览器中完成的本地操作,可保持 AAC 轨道的完全保真度。编辑们在流行声音轮出之前经常使用这一点。 这三个方面都有一个诚实的限制:Instagram 的 GraphQL 响应形状经常变化,实际上一年会变化几次。从 2023 年开始,将自己固定到一个有效负载密钥的适配器今天就已经死了。该扩展的 Instagram 处理程序是根据实时有效负载结构进行维护的,并在 Meta 旋转架构时更新船舶 - 维护负担是保持兼容的真正成本,这就是为什么废弃的下载器工具在没有解释的情况下停止工作的原因。

5. 私人账户、同意和保持自己的秩序

提取是会话绑定的技术事实有一个道德推论:您只能保存您已经可以看到的内容,而您在私人帐户上可以看到的内容之所以存在,是因为有人信任您具有访问权限。保存朋友的 Reel 以便离线重看是正常的人类行为。通过关注者关系获取私人帐户的内容并将其重新分发到其他地方是对这种信任的违反,并且根据内容的不同,这也是一个法律问题。该扩展程序充当您合法观点的镜子 - 它不会规避隐私边界,并将其视为可能滥用该工具和平台。 对于公共内容,TikTok 讨论中的个人使用框架同样适用:归档以供离线参考、研究和保存是很常见的;在没有信用的情况下将某人的 Reel 重新发布到您自己的网格中是导致帐户被举报的行为。 Instagram 自己的应用内混音和转发功能的存在正是因为 Meta 希望归因流留在平台内。如果您的用例是创意重用,那么平台的本机工具或请求许可的直接消息将比下载文件和愧疚感更好地为您服务。 还有一个关于本地优先下载的数据最小化论点超出了礼貌。研究影响者生态系统、错误信息传播或趋势生命周期的研究人员需要媒体档案,提交给云下载器的每个 URL 都是其他人连接研究人员和主题的基础设施上的记录。在浏览器内运行提取可以将整个调查链保留在研究人员自己的计算机上 - 这也是安全团队更喜欢用它来进行敏感活动的原因。 与该框架一起使用时,该工具并不引人注目:它在几秒钟内就在本地完成了每次播放 Reel 时浏览器已经隐式执行的操作。播放开始时,字节就在您的计算机上;这只是以您可以保留的形式将它们写入磁盘。