
后端【免费下载链接】instagram-private-apiNodeJS Instagram private API SDK. Written in TypeScript.项目地址https://gitcode.com/gh_mirrors/in/instagram-private-api点击查看免费下载本篇技术指南聚焦 NodeJS Instagram 私有 API SDKinstagram-private-apiTypeScript 实现中收藏信息流Saved Feed响应模型里的SavedFeedResponseProduct_tags接口。文章将完整讲解该接口的定义、字段含义、其在SavedFeedResponseMedia整体响应树中的位置以及围绕它展开的SavedFeedResponseInItem、SavedFeedResponseProduct等关联结构并结合仓库源码给出实际遍历收藏信息流并读取商品标签的完整方案。读完本文你将掌握收藏信息流的请求链路、响应数据结构层级以及如何在业务中安全地解析购物帖子中的商品信息。接口定义与源码出处SavedFeedResponseProduct_tags是收藏信息流响应中描述媒体Media上商品标签集合的接口。它直接定义在响应类型文件 src/responses/saved.feed.response.ts 中并被同一文件内的SavedFeedResponseMedia以可选属性引用// src/responses/saved.feed.response.ts:112-114 export interface SavedFeedResponseProduct_tags { in: SavedFeedResponseInItem[]; }同时该响应文件通过 src/responses/index.ts 的export * from ./saved.feed.response统一导出到 SDK 的响应模块命名空间responses中因此可以在业务代码中直接以类型导入方式使用import { SavedFeedResponseProduct_tags } from instagram-private-api;与同类标签结构的关系值得注意的一点是SavedFeedResponseProduct_tags与同文件中的 SavedFeedResponseUsertags用户 标签结构完全一致二者都只有唯一的in: SavedFeedResponseInItem[]属性分别定义于 saved.feed.response.ts:112 与 saved.feed.response.ts:178。这说明 Instagram 服务端在设计标签系统时复用了同一套标签锚点列表的数据结构只是语义不同product_tags指向商品usertags指向用户。这一点从源码结构可以清晰推断。核心字段in 标签条目列表SavedFeedResponseProduct_tags的全部内容就是属性in其类型为SavedFeedResponseInItem[]即一组标签条目InItem。每个条目描述一个商品标签被锚定在媒体内容中的位置与具体商品信息。SavedFeedResponseInItem的定义同样位于 src/responses/saved.feed.response.ts:115-121其完整字段如下字段类型可空说明productSavedFeedResponseProduct可选被标记的商品完整信息positionstring[] \| number[]否标签在图片中的锚点坐标x, y 归一化坐标userSavedFeedResponseUser可选关联的用户信息商品场景下通常不出现start_time_in_video_in_secnull可选视频中标签出现的起始秒数当前模型恒为nullduration_in_video_in_secnull可选视频中标签持续的秒数当前模型恒为nullposition 坐标语义position是标签锚点坐标类型为string[] | number[]即可能以字符串或数字形式返回。虽然当前仓库源码未对坐标数值做归一化比例的强校验但结合 Instagram 标签系统的一般实现可以推断其通常为两个元素分别表示标签在媒体上的横向与纵向相对位置。由于它可能返回字符串实际读取时建议先做一次Number()转换再参与计算。视频相关字段的占位语义start_time_in_video_in_sec与duration_in_video_in_sec在类型上被声明为null可选表明当前 SDK 所捕获的响应样本中收藏信息流里的商品标签不携带视频时间轴锚点。这意味着在视频类媒体上product_tags的结构依然存在但时间定位字段为空处理逻辑上应将其视为仅图片锚定场景。商品信息SavedFeedResponseProduct 的字段全景in数组中每个条目的核心是product字段其类型为 SavedFeedResponseProduct定义于 src/responses/saved.feed.response.ts:122-141。该接口承载了完整的商品卡片数据是电商类解析场景的关键对象字段类型说明namestring商品名称pricestring商品价格可能为展示格式字符串current_pricestring当前售价full_pricestring原价/划线价product_idstring商品 ID业务主键merchantSavedFeedResponseMerchant商家信息pk、username、profile_pic_urldescriptionstring商品描述retailer_idstring零售商 IDhas_viewer_savedboolean当前浏览者是否已收藏该商品main_imageSavedFeedResponseMain_image商品主图内含image_versions2候选图列表thumbnail_imageSavedFeedResponseThumbnail_image商品缩略图review_statusstring审核状态external_urlstring外部购买链接checkout_stylestring结算样式内购/外链等can_share_to_storyboolean是否可分享到 Storyfull_price_strippedstring去格式化后的原价纯数字字符串current_price_strippedstring去格式化后的现价纯数字字符串variant_values可选SavedFeedResponseVariantValuesItem[]商品规格变体如颜色、尺码实战提示做价格对比或聚合统计时应优先使用current_price_stripped/full_price_stripped纯数字字符串可直接parseFloat而非price/current_price可能包含货币符号、千分位等展示格式。variant_values为可选字段仅在商品存在多规格时才出现。在响应树中的位置从收藏信息流到商品标签SavedFeedResponseProduct_tags不是孤立结构它在整个收藏信息流响应树中的完整路径如下对应 saved.feed.response.ts 的定义SavedFeedResponseRootObject └── items: SavedFeedResponseItemsItem[] └── media: SavedFeedResponseMedia ├── product_tags?: SavedFeedResponseProduct_tags // 商品标签 │ └── in: SavedFeedResponseInItem[] │ ├── product?: SavedFeedResponseProduct │ └── position: string[] | number[] └── usertags?: SavedFeedResponseUsertags // 用户 标签同构其中SavedFeedResponseRootObject 是收藏信息流接口的根对象包含items、num_results、more_available、auto_load_more_enabled、status、next_max_id用于分页控制SavedFeedResponseItemsItem只有media一个字段包裹 SavedFeedResponseMediaSavedFeedResponseMedia在 saved.feed.response.ts:41 将product_tags声明为可选字段product_tags?: SavedFeedResponseProduct_tags。product_tags的可选性意味着并非所有收藏帖子都带有商品标签。只有购物类Shoppable帖子才会返回该字段因此在解析时务必先做存在性判断if (media.product_tags)再做遍历。数据从哪来SavedFeed 请求链路源码解析要拿到带product_tags的响应需要先请求收藏信息流。SDK 中由SavedFeed类完成其核心实现位于 src/feeds/saved.feed.ts// src/feeds/saved.feed.ts export class SavedFeed extends FeedSavedFeedResponseRootObject, SavedFeedResponseMedia { Expose() private nextMaxId: string; set state(body: SavedFeedResponseRootObject) { this.moreAvailable body.more_available; this.nextMaxId body.next_max_id; } async request(): PromiseSavedFeedResponseRootObject { 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(): PromiseSavedFeedResponseMedia[] { const { items } await this.request(); return items.map(i i.media); } }关键实现事实请求端点为/api/v1/feed/saved/携带查询参数max_id分页游标与include_igtv_preview: false分页状态机每次请求后通过statesetter 将more_available与next_max_id写入实例配合基类 src/core/feed.ts 的isMoreAvailable()方法驱动翻页数据拍平items()方法把items.map(i i.media)拍平为SavedFeedResponseMedia[]这正是直接访问media.product_tags的入口。SavedFeed的完整 API构造函数、items$observable、request、items、observable、序列化方法等可参考 SavedFeed 类文档。通过 FeedFactory 获取实例SDK 统一通过IgApiClient上的 feed 工厂获取SavedFeed实例实现在 src/core/feed.factory.ts:218-220public saved(): SavedFeed { return new SavedFeed(this.client); }因此标准用法为ig.feed.saved()。结合 SavedFeed 类文档 可知其构造函数接收IgApiClient且继承了Feed基类的attemptOptions请求重试配置、deserialize/serialize/toPlain状态持久化与observableRxJS 流式拉取能力。完整实战遍历收藏信息流并解析商品标签结合上述请求链路与响应结构下面给出一个可复制运行的完整示例演示如何拉取收藏信息流、逐页遍历并安全解析product_tags中的商品信息import { IgApiClient } from instagram-private-api; import { SavedFeedResponseMedia } from instagram-private-api; async function dumpSavedProducts(username: string, password: string) { const ig new IgApiClient(); ig.state.generateDevice(username); await ig.account.login(username, password); const savedFeed ig.feed.saved(); // 工厂方法见 src/core/feed.factory.ts:218 let page 0; do { // 拉取当前页items() 内部调用 request() 并拍平 media const mediaItems: SavedFeedResponseMedia[] await savedFeed.items(); console.log(--- 第 ${page} 页共 ${mediaItems.length} 条 ---); for (const media of mediaItems) { // product_tags 为可选字段必须先判空saved.feed.response.ts:41 if (!media.product_tags) continue; for (const tag of media.product_tags.in) { if (!tag.product) continue; const p tag.product; console.log({ mediaId: media.id, productId: p.product_id, name: p.name, currentPrice: p.current_price_stripped, // 纯数字字符串可直接 parseFloat fullPrice: p.full_price_stripped, merchant: p.merchant.username, position: tag.position.map(Number), // 兼容 string[] | number[] externalUrl: p.external_url, }); } } // 依据响应中的 more_available 判断是否继续翻页 } while (savedFeed.isMoreAvailable()); }代码要点说明判空双保险media.product_tags与tag.product都是可选字段源码 saved.feed.response.ts:41、saved.feed.response.ts:116解析前必须逐个判空避免运行时TypeError坐标规整position可能为string[]或number[]统一用map(Number)转换后再使用价格规整优先使用_stripped后缀字段纯数字字符串做数值处理分页控制isMoreAvailable()由基类Feed基于more_available与next_max_id计算无需手动维护游标。与收藏操作的双向闭环product_tags中的product_id与媒体的id字段在业务上还可以与收藏动作形成闭环。仓库在 src/repositories/media.repository.ts:680-708 中提供了save(mediaId, collection_ids?)与unsave(mediaId)方法其源码注释给出了直接的提示// tip: id savedFeed.items()[0].media.id也就是说收藏信息流中取到的media.id可以直接回传给mediaRepository.save()/mediaRepository.unsave()用于把媒体收藏到指定合集collection_ids或取消收藏。若需要判断当前浏览者是否已收藏该商品则可读取SavedFeedResponseProduct.has_viewer_saved字段。边界情况与注意事项字段可选性product_tags、carousel_media、location、video_versions等均为可选字段见 SavedFeedResponseMedia说明收藏信息流中混有多种媒体类型图片/视频/轮播轮播子项通过carousel_media呈现其中也可能包含独立的usertags。解析时应以media_type区分并逐层判空。视频时间锚点为 null当前响应模型中start_time_in_video_in_sec、duration_in_video_in_sec恒为null不要假设视频商品标签会返回时间轴信息。价格字符串格式不确定price/current_price/full_price是展示格式字符串可能包含货币符号或千分位做数值运算请使用current_price_stripped/full_price_stripped。登录与设备模拟前提所有请求依赖登录态与设备指纹示例代码中的ig.state.generateDevice(username)是 SDK 标准登录流程的一部分相关登录与检查点处理可参考 2fa-sms-login.example.ts 与 checkpoint.example.ts。小结SavedFeedResponseProduct_tags是 instagram-private-api 收藏信息流响应中承载商品标签的轻量接口通过in: SavedFeedResponseInItem[]挂载商品卡片与锚点坐标。在源码层面它由 src/responses/saved.feed.response.ts 定义经 src/responses/index.ts 导出在数据链路层面由ig.feed.saved()src/core/feed.factory.ts:218驱动SavedFeed请求/api/v1/feed/saved/获取。理解这一接口及其关联结构即可在购物场景、商品监控、价格对比等业务中稳定地解析 Instagram 收藏帖子中的商品数据。赞分享后端【免费下载链接】instagram-private-apiNodeJS Instagram private API SDK. Written in TypeScript.项目地址https://gitcode.com/gh_mirrors/in/instagram-private-api点击查看免费下载相关推荐instagram-private-api 收藏夹响应解析SavedFeedResponseInItem 用户标签与商品标签结构全解instagram private api 收藏夹响应解析SavedFeedResponseInItem 用户标签与商品标签结构全解 本篇技术指南聚焦 ins后端instagram-private-api 响应类型解读ListReelMediaViewerFeedResponseHashtag 结构与实战应用instagram private api 响应类型解读ListReelMediaViewerFeedResponseHashtag 结构与实战应用 导读 L后端instagram-private-api 响应类型详解MediaUpdatedMediaResponseUpdated_media 接口结构与实战解析instagram private api 响应类型详解MediaUpdatedMediaResponseUpdated_media 接口结构与实战解析 本文后端上一篇MSEdgeRedirect隐私保护指南数据收集与用户信息处理政策下一篇华硕笔记本终极控制方案5分钟掌握G-Helper性能优化技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考