ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

instagram-private-api 收藏内容数据模型解析:SavedFeedResponseUser 接口字段全解与实战用法

instagram-private-api 收藏内容数据模型解析:SavedFeedResponseUser 接口字段全解与实战用法
  • 后端

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

NodeJS Instagram private API SDK. Written in TypeScript.

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

导读

SavedFeedResponseUser是 instagram-private-api(NodeJS 版 Instagram 私有 API SDK,TypeScript 编写)中描述"被收藏帖子(Saved Feed)"发布者用户信息的数据结构。当你通过 SDK 拉取当前账号收藏的帖子列表时,每条媒体(Media)内嵌的user字段就是一个SavedFeedResponseUser。本文以该接口为骨架,完整解读其 15 个字段的含义、可选性与来源,并结合 saved.feed.response.ts、saved.feed.ts 等仓库源码,说明它在收藏 Feed 数据链路中的位置、如何读取、如何结合friendship_status判断与收藏作者的关注关系,以及如何配合ProfileEntity发起关注/取关操作。


一、接口概览:它在收藏 Feed 数据模型中的位置

在 instagram-private-api 中,收藏 Feed(Saved Feed)的响应数据由一组 TypeScript 接口严格建模。整条数据链路如下:

  • SavedFeedResponseRootObject:/api/v1/feed/saved/接口的根响应,包含items、num_results、more_available、next_max_id、status等分页与状态字段;
  • SavedFeedResponseItemsItem:分页中的单条记录,仅包含一个media字段;
  • SavedFeedResponseMedia:被收藏的媒体对象(图片、视频或轮播),其中user字段的类型正是本主题的SavedFeedResponseUser;
  • SavedFeedResponseUser:该媒体的发布者用户信息,即本接口。

从源码 saved.feed.response.ts 可以看到,根对象中items是SavedFeedResponseItemsItem[],而 saved.feed.ts 的items()方法会把每条记录解包为media:

async items(): Promise<SavedFeedResponseMedia[]> { const { items } = await this.request(); return items.map(i => i.media); }

因此,业务上拿到SavedFeedResponseMedia后,通过media.user即可访问到SavedFeedResponseUser结构。该接口定义在 src/responses/saved.feed.response.ts,源码原文如下:

export interface SavedFeedResponseUser { pk: number; username: string; full_name: string; is_private: boolean; profile_pic_url: string; friendship_status?: SavedFeedResponseFriendship_status; is_verified: boolean; has_anonymous_profile_picture?: boolean; is_unpublished?: boolean; is_favorite?: boolean; show_shoppable_feed?: boolean; shoppable_posts_count?: number; can_be_reported_as_fraud?: boolean; latest_reel_media?: number; profile_pic_id?: string; }

二、必填字段:识别用户身份的基石

接口中 5 个字段不带Optional标记,意味着 Instagram 在返回收藏 Feed 时通常都会提供这些值,是识别与展示用户的基本信息。

字段类型含义与使用建议
pknumber用户的数值型 ID(Primary Key),是跨接口识别用户的唯一标识。Instagram 全站接口(好友关系、用户信息、媒体接口)都以此作为参数,是后续业务操作(关注、取关、拉取主页)的入口。注意SavedFeedResponseMedia.pk是string,而用户pk是number,两者类型不同。
usernamestring用户唯一用户名(如@example),用于展示、去重与搜索关联。
full_namestring用户显示名称(可重复、可随时修改),适合界面展示,不适合作为唯一标识。
is_privateboolean是否为私密账号。私密账号发布的内容仅粉丝可见,会影响后续互动操作的可行性判断。
profile_pic_urlstring用户头像的 CDN URL,可直接用于前端<img>展示。
is_verifiedboolean是否官方认证(蓝 V)。用于内容筛选或展示徽标。

其中pk、username、is_private是实际业务中最常用的三个字段:pk用于调用 SDK 的其他接口,is_private决定是否需要发送关注请求才能查看其主页内容。


三、可选字段:细粒度画像与平台状态

其余 9 个字段均为Optional(?标记),表示 Instagram 会根据账号属性、接口版本或请求上下文决定是否返回。业务代码必须做好空值防护(?.或!== undefined判断)。

字段类型含义
friendship_statusSavedFeedResponseFriendship_status当前登录账号与该用户的关注关系快照,见下文专节。
has_anonymous_profile_pictureboolean是否使用系统默认匿名头像(未自定义头像)。
is_unpublishedboolean账号是否处于"未发布/不可见"状态,通常与违规或限制相关。
is_favoriteboolean是否被当前账号标记为"常看的好友"(Favorite)。
show_shoppable_feedboolean是否展示可购物内容流,与电商功能相关。
shoppable_posts_countnumber可购物帖子的数量(购物功能账号才有)。
can_be_reported_as_fraudboolean是否可被举报为欺诈账号。
latest_reel_medianumber最新一条快拍(Reel/Story)的媒体时间戳或 ID,可用于判断用户近期是否活跃。
profile_pic_idstring头像图片自身的 ID,可用于头像缓存/版本追踪(profile_pic_url通常已经带签名参数)。

从源码类型定义看,latest_reel_media为number,可据此推断它倾向于存储最近一条 Story 的时间戳(如taken_at),适合用于"该收藏作者最近是否发过 Story"的活跃度判断。该类字段的判定仅来自 saved.feed.response.ts 的类型标注与 Instagram 数据字段命名惯例,具体取值需以实际响应为准。


四、friendship_status:关注关系快照的深入解析

friendship_status是本接口中最有业务价值的嵌套对象,其类型为SavedFeedResponseFriendship_status,定义于 saved.feed.response.ts:

export interface SavedFeedResponseFriendship_status { following: boolean; outgoing_request: boolean; is_bestie: boolean; is_restricted: boolean; }

四个字段全部为必填(无?标记):

  • following:当前登录账号是否已经关注该用户;
  • outgoing_request:当前账号是否已发出(但尚未被接受的)关注请求——通常对应私密账号;
  • is_bestie:该用户是否为当前账号的"挚友/常看好友"(Bestie);
  • is_restricted:该用户是否已被当前账号"限制"(Restricted),被限制用户的评论对自己不可见。

典型业务逻辑:遍历收藏列表时,若friendship_status.following === false && friendship_status.outgoing_request === false,可提示"未关注该作者";若is_private === true && !following,则需要先发送关注请求才能进一步互动。该快照由接口直接下发,无需额外请求,能显著减少好友关系接口的调用次数。


五、实战:从收藏 Feed 中读取用户信息

SavedFeed类通过ig.feed.saved()创建,工厂方法定义在 src/core/feed.factory.ts:

public saved(): SavedFeed { return new SavedFeed(this.client); }

基础读取示例(TypeScript):

import { IgApiClient } from 'instagram-private-api'; async function listSavedMediaUsers(ig: IgApiClient) { const savedFeed = ig.feed.saved(); const medias = await savedFeed.items(); for (const media of medias) { const user = media.user; // SavedFeedResponseUser console.log({ id: user.pk, username: user.username, fullName: user.full_name, isPrivate: user.is_private, isVerified: user.is_verified, following: user.friendship_status?.following, }); } }

分页要点:SavedFeed的请求实现见 src/feeds/saved.feed.ts,每次请求/api/v1/feed/saved/,携带max_id(上一页的next_max_id)与include_igtv_preview: false参数:

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; }

statesetter(saved.feed.ts)会把响应的more_available与next_max_id写入内部状态。若想遍历全部收藏内容,可以循环判断feed.isMoreAvailable(),或直接订阅feed.items$流式拉取(该 Observable 由基类 src/core/feed.ts 提供,内置基于@lifeomic/attempt的重试机制,遇到 400/429/500/502 等限流状态码会自动等待重试)。更稳健的做法是使用feed.items$结合last()一次性收集所有分页的媒体:

import { lastValueFrom } from 'rxjs'; async function collectAllSaved(ig: IgApiClient) { const feed = ig.feed.saved(); const allMedia = await lastValueFrom(feed.items$); // 自动翻页直至 more_available=false return allMedia.map(m => m.user); }

注意:items$依赖 RxJS Observable,使用前需确保项目已安装rxjs依赖。


六、进阶:结合 ProfileEntity 对收藏作者执行关注/取关

saved.feed.response.ts中的用户接口与实体类ProfileEntity在语义上互补:接口负责"描述用户",实体负责"操作该用户"。ProfileEntity定义于 src/entities/profile.entity.ts,核心方法是checkFollow()与checkUnfollow(),它们会先查询friendship.show(pk)判断当前状态,再决定是否真正发送关注/取关请求,避免重复调用:

export class ProfileEntity extends Entity { pk: string | number; public async checkFollow() { const friendshipStatus = await this.client.friendship.show(this.pk); if (friendshipStatus.following === true) return friendshipStatus; return await this.client.friendship.create(this.pk); } public async checkUnfollow() { const friendshipStatus = await this.client.friendship.show(this.pk); if (friendshipStatus.following === false) return friendshipStatus; return await this.client.friendship.destroy(this.pk); } }

实体由ig.entity.profile(pk)创建,见 src/core/entity.factory.ts。一个完整的"关注所有未关注的收藏作者"示例:

async function followUnfollowedAuthors(ig: IgApiClient) { const savedFeed = ig.feed.saved(); const medias = await savedFeed.items(); for (const media of medias) { const user = media.user; if (user.friendship_status?.following === false) { const profile = ig.entity.profile(String(user.pk)); const result = await profile.checkFollow(); console.log(`已关注 ${user.username}:`, result.following); } } }

这里需要注意两点:ProfileEntity.pk的类型是string | number,而SavedFeedResponseUser.pk是number,直接传入即可,String()仅为显式规范;同时,批量关注涉及高频写操作,务必控制频率并遵守平台限流,仓库的Feed基类重试逻辑只覆盖读操作分页,不会替写操作兜底。


七、相关接口与数据类型的完整索引

SavedFeedResponseUser不是孤立存在的,它与收藏 Feed 响应模型中的其他接口互相嵌套。仓库 docs/interfaces/responses 下保存了全部相关类型文档,常用关联如下:

  • 媒体对象 SavedFeedResponseMedia:user字段即本接口;
  • 单条分页记录 SavedFeedResponseItemsItem:仅含media;
  • 根响应 SavedFeedResponseRootObject:分页与状态;
  • 关注关系快照 SavedFeedResponseFriendship_status:本接口的嵌套对象;
  • 评论区用户结构 SavedFeedResponsePreviewCommentsItem 与 SavedFeedResponseCaption:其中的user字段同样复用SavedFeedResponseUser类型。

从源码结构看(saved.feed.response.ts),SavedFeedResponseUser在PreviewCommentsItem.user与Caption.user两处也被复用,说明它是"收藏场景下通用用户描述"的单一数据源,理解它即可同时掌握评论预览与正文作者两类数据。


八、小结

SavedFeedResponseUser是 instagram-private-api 收藏 Feed 功能中描述发布者信息的核心接口:5 个必填字段(pk、username、full_name、is_private、profile_pic_url、is_verified)构成用户识别的基本盘,9 个可选字段(含friendship_status)提供关注关系、私密状态、购物属性、活跃度等增强画像。实际开发中,将它配合ig.feed.saved()的自动分页与ProfileEntity.checkFollow/checkUnfollow实体方法,即可低成本构建"收藏作者管理""关注关系梳理"等完整功能。建议在项目内为Optional字段统一编写空值保护工具函数,并依据 src/responses/saved.feed.response.ts 与 src/feeds/saved.feed.ts 保持数据模型与 SDK 版本同步,防止字段增减导致运行时数据缺失。

  • 后端

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

NodeJS Instagram private API SDK. Written in TypeScript.

项目地址:https://gitcode.com/gh_mirrors/in/instagram-private-api
点击查看免费下载
上一篇:BetterGenshinImpact自动化工具:如何用智能AI解放你的原神游戏时间
下一篇:如何快速下载Iwara视频?完整Iwara下载工具使用指南

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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进