☰
instagram-private-api 响应类型解析:SavedFeedResponseMain_image 与收藏夹商品主图数据模型
2026/10/16 2:28:34 网站建设 项目流程
  • 后端

【免费下载链接】instagram-private-api

NodeJS Instagram private API SDK. Written in TypeScript.

项目地址:https://gitcode.com/gh_mirrors/in/instagram-private-api
点击查看免费下载

本篇技术指南聚焦于 instagram-private-api 项目中SavedFeedResponseMain_image响应接口。它定义了 Instagram「已保存内容」中商品(product)主图的结构,是收藏夹信息流(Saved Feed)中购物场景数据的核心类型之一。阅读完本文,你将掌握该接口的字段语义、它在整棵响应类型树中的嵌套位置、对应的image_versions2候选图(candidates)解析方式,以及如何借助feedFactory.saved()在真实请求链路中访问并消费这些数据。

接口速览:两个字段构成的主图类型

SavedFeedResponseMain_image定义在 src/responses/saved.feed.response.ts(对应类型文档 SavedFeedResponseMain_image),整体结构非常精简:

export interface SavedFeedResponseMain_image { image_versions2: SavedFeedResponseImage_versions2; preview: null; }
属性类型说明
image_versions2SavedFeedResponseImage_versions2主图的多尺寸候选版本集合(必填)
previewnull预览图占位字段;在该响应模型中固定为null

从类型声明可以看到,商品主图并不直接暴露一个 URL 字符串,而是通过image_versions2携带一组可选尺寸的候选图;preview字段在 Instagram 服务端返回中未提供实际值,因此类型上被固定标注为字面量null(与下面要介绍的SavedFeedResponseThumbnail_image行为一致,见 src/responses/saved.feed.response.ts)。

image_versions2:多尺寸候选图容器

image_versions2是SavedFeedResponseMain_image的核心负载,其类型SavedFeedResponseImage_versions2定义在 src/responses/saved.feed.response.ts:

export interface SavedFeedResponseImage_versions2 { candidates: SavedFeedResponseCandidatesItem[]; }

它只包含一个candidates数组,数组元素SavedFeedResponseCandidatesItem定义在 src/responses/saved.feed.response.ts:

export interface SavedFeedResponseCandidatesItem { width: number; height: number; url: string; estimated_scans_sizes?: number[]; }
  • width/height:该候选图的像素尺寸,服务端通常会返回 1080、750、320 等不同档位,便于客户端按需选择;
  • url:图片直链,可直接用于下载或展示;
  • estimated_scans_sizes:可选字段,标识该图的大致扫描字节尺寸,属于服务端附带信息,实际获取图片尺寸时通常仍以解码后的真实宽高为准。

对应接口文档可查阅 SavedFeedResponseImage_versions2 与 SavedFeedResponseCandidatesItem。

在响应树中的嵌套位置:从 SavedFeed 到 main_image

SavedFeedResponseMain_image并不单独出现,它位于「收藏夹信息流 → 媒体 → 商品标签 → 商品」这条深链路的末端。根据 src/responses/saved.feed.response.ts 的接口声明,其完整嵌套路径如下:

SavedFeedResponseRootObject // items / num_results / more_available / next_max_id ... └── items: SavedFeedResponseItemsItem[] └── media: SavedFeedResponseMedia // image_versions2、video_versions、carousel_media … └── product_tags?: SavedFeedResponseProduct_tags // 可选,仅购物类内容出现 └── in: SavedFeedResponseInItem[] └── product: SavedFeedResponseProduct ├── name / price / current_price / full_price ├── merchant: SavedFeedResponseMerchant ├── main_image: SavedFeedResponseMain_image ← 本文主角 ├── thumbnail_image: SavedFeedResponseThumbnail_image └── variant_values?: SavedFeedResponseVariantValuesItem[]

要点说明:

  • media.product_tags是可选字段(product_tags?: SavedFeedResponseProduct_tags),只有带商品标记(Instagram Shopping / 结账功能)的帖子才会返回;
  • product.main_image(src/responses/saved.feed.response.ts)与product.thumbnail_image(同文件 L133)结构相同,均包含image_versions2与preview两个属性,区别仅在于用途——前者是商品详情主图,后者是列表场景下的缩略图;
  • SavedFeedResponseProduct还携带variant_values(可选,商品规格如颜色、尺码)、external_url、checkout_style等电商字段,完整字段清单见 SavedFeedResponseProduct。

实战:如何取到已保存内容的商品主图

要真正拿到main_image里的候选图,需要经过feedFactory.saved()的请求链路。SavedFeed类实现在 src/feeds/saved.feed.ts,其核心逻辑如下:

async request(): Promise<SavedFeedResponseRootObject> { const { body } = await this.client.request.send({ url: '/api/v1/feed/saved/', qs: { max_id: this.nextMaxId, include_igtv_preview: false, }, }); this.state = body; return body; } async items(): Promise<SavedFeedResponseMedia[]> { const { items } = await this.request(); return items.map(i => i.media); }
  • 请求端点是GET /api/v1/feed/saved/,查询参数max_id用于分页游标,include_igtv_preview固定传false以排除 IGTV 预览;
  • statesetter 会把响应的more_available与next_max_id写入 feed 实例,配合 src/core/feed.ts 的isMoreAvailable()实现自动翻页;
  • feed 工厂方法saved()定义在 src/core/feed.factory.ts,返回new SavedFeed(this.client)。

结合 TypeScript 类型收窄,可以这样遍历并提取所有商品主图:

const ig = new IgApiClient(); // ... 完成 login 后 const savedFeed = ig.feed.saved(); const medias = await savedFeed.items(); for (const media of medias) { const productTags = media.product_tags; if (!productTags) continue; // 非购物帖直接跳过 for (const item of productTags.in) { const product = item.product; if (!product) continue; // main_image.image_versions2.candidates 是多尺寸候选图 const candidates = product.main_image.image_versions2.candidates; // 通常选分辨率最高的作为展示主图 const best = candidates.reduce((a, b) => (a.width * a.height >= b.width * b.height ? a : b)); console.log(product.name, best.url); } }

需要说明的是:SavedFeedResponseProduct_tags、SavedFeedResponseInItem等类型中product与user均为可选字段(?),真实数据中也可能缺失,因此访问item.product前应先做空值判断。上述写法来自对 src/responses/saved.feed.response.ts 类型声明的直接推断。

分页与更多可消费字段

SavedFeedResponseRootObject(见 SavedFeedResponseRootObject)除items外还返回num_results、more_available、next_max_id、auto_load_more_enabled与status。若more_available为true,下一批数据可通过新的max_id游标继续请求;更省事的做法是使用SavedFeed继承自 Feed 的observable()/items$机制,它会自动循环请求直至isMoreAvailable()返回false,并在遇到 400/429/500/502 等限流状态码时按指数退避重试(默认delay: 60000、maxAttempts: 10,见 src/core/feed.ts)。

除了main_image所在的商品标签,SavedFeedResponseMedia还暴露了image_versions2(媒体主图)、video_versions、carousel_media、location、preview_comments等字段,完整清单见 SavedFeedResponseMedia。收藏动作本身则由 MediaRepository.save() 与unsave()(同文件 L705-L711)负责:save(mediaId, collection_ids?)通过POST /api/v1/media/{mediaId}/save/收藏单条媒体,也可传入收藏夹 id 数组存入指定合集;源码中甚至有注释提示id = savedFeed.items()[0].media.id(见 src/repositories/media.repository.ts),演示了「收藏列表 → 取 media id → 继续操作」的常见闭环。

小结

SavedFeedResponseMain_image是一个结构简洁但位置关键的响应类型:它以image_versions2.candidates承载商品主图的多档位候选地址,以恒为null的preview保留字段语义,是 instagram-private-api 收藏夹信息流购物数据模型中最基础的图片类型之一。理解它的嵌套位置与可选字段边界,是正确解析已收藏商品、构建比价或内容管理工具的前提。相关源码与类型文档均可在本仓库的 src/responses/saved.feed.response.ts、src/feeds/saved.feed.ts 与 docs/interfaces/responses 目录下继续深挖。

  • 后端

【免费下载链接】instagram-private-api

NodeJS Instagram private API SDK. Written in TypeScript.

项目地址:https://gitcode.com/gh_mirrors/in/instagram-private-api
点击查看免费下载
上一篇:Salt 修复深度解析:MasterKeys.gen_signature 签名规范化问题与 master_use_pubkey_signature 校验失败的根因
下一篇:3分钟搞定PPT转图片:这款开源工具让文档处理变得如此简单

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询