☰
instagram-private-api 响应接口解析:ReelsMediaFeedResponseFriendshipStatus 与故事流好友关系状态
2026/10/16 2:00:46 网站建设 项目流程
  • 后端

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

NodeJS Instagram private API SDK. Written in TypeScript.

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

导读

ReelsMediaFeedResponseFriendshipStatus是 TypeScript 版 Instagram 私有 API SDK(instagram-private-api)中用于描述「故事流(Reels/Stories)作者与当前登录用户之间好友关系」的响应接口。本文将以该接口为骨架,逐字段讲解following、is_private、incoming_request、outgoing_request、is_bestie五个布尔属性的语义,并结合 reels-media.feed.response.ts 与 reels-media.feed.ts 等源码,说明该接口在批量拉取多用户 Stories 数据时的数据位置、调用链路与实战用法。读完本文,你将能够通过ig.feed.reelsMedia()获取目标用户的 Story 列表,并准确判断「我是否已关注对方」「对方是否私密」「是否存在待处理请求」「对方是否是我的密友」等状态,从而构建关注检测、私密账号过滤、密友推荐等自动化逻辑。

接口概览:定义与出处

完整定义

接口定义位于 src/responses/reels-media.feed.response.ts,全部字段均为boolean:

export interface ReelsMediaFeedResponseFriendshipStatus { following: boolean; is_private: boolean; incoming_request: boolean; outgoing_request: boolean; is_bestie: boolean; }

对应文档为 ReelsMediaFeedResponseFriendshipStatus.md,其中五个属性全部是必填布尔字段,不存在可选属性(接口签名中没有任何?标记)。

在响应树中的位置

该接口并不是顶层响应,而是嵌套在故事流响应用户信息(ReelsMediaFeedResponseUser)之下。整个reels_media响应的结构层级如下:

  • ReelsMediaFeedResponseRootObject:reels(按用户 pk 为键的对象映射)+status(见 reels-media.feed.response.ts)
    • ReelsMediaFeedResponse:单个用户的 Story 轮播信息,含user、items、media_count、expiring_at、seen等(第 8-20 行)
      • ReelsMediaFeedResponseUser:作者基本信息,friendship_status?为可选字段(第 21-30 行)
        • ReelsMediaFeedResponseFriendshipStatus:本次要解析的好友关系状态(第 31-37 行)

需要注意:friendship_status在ReelsMediaFeedResponseUser中是Optional的(对应文档明确标注),这意味着 Instagram 接口在部分场景下可能不返回该字段。业务代码中访问user.friendship_status.following前应先做空值判断。

五个字段的语义详解

following:当前账号是否已关注该作者

following: boolean表示当前登录账号是否已经关注了该 Story 作者。它是判断双向关系中「我→对方」一侧的最核心字段:

  • true:已关注,Story 会正常出现在关注列表的故事栏(Story Tray);
  • false:未关注,对方可能是不相关用户,也可能有outgoing_request为true(待处理关注请求)。

is_private:作者账号是否私密

is_private: boolean表示该 Story 作者的账号是否为私密账号(private account)。私密账号的 Story 仅对已批准关注者可见,因此在拉取到的 Story 数据中,若is_private === true且当前账号并非其粉丝,则该数据通常来自粉丝可见范围之外的特殊场景(例如搜索返回的预览信息),实际内容访问会受限。

incoming_request:对方是否向你发来关注请求

incoming_request: boolean表示对方是否已向当前账号发出「关注请求」,即「对方→我」方向存在一条待处理或已由我接受的关系流:

  • true:对方请求关注我。对私密账号而言,这意味着当前账号可能尚未批准该请求(请求处于 pending 状态);
  • false:对方未向你发送关注请求。

这一字段与FriendshipRepository中的approve/deny(拒绝)操作直接呼应(见 friendship.repository.ts):当检测到incoming_request === true时,可调用ig.friendship.approve(userPk)或ig.friendship.deny(userPk)处理。

outgoing_request:你是否向对方发出关注请求

outgoing_request: boolean表示当前账号是否已向对方发出关注请求且尚未被批准(「我→对方」方向的 pending 请求):

  • true:我请求关注对方,但对方尚未批准(通常对方是私密账号);
  • false:没有未决的对外关注请求。

该字段是自动化关注流程的关键信号:当outgoing_request === true时,应避免重复调用ig.friendship.create(),否则会重复发送关注请求,可能触发IgActionSpamError等风控错误(对应错误类见 errors 目录)。ProfileEntity中已有的checkFollow/checkUnfollow模式(profile.entity.ts)正是「先查状态、再决定是否执行操作」的参考实现。

is_bestie:对方是否是你的密友

is_bestie: boolean表示对方是否已被当前账号标记为「密友(Best Friends / Close Friends)」。Instagram 的密友列表是单向且私密的:你可以将某人设为密友而不必是双向关注关系。该字段常用于:

  • 判断 Story 是否属于「密友故事(Close Friends Story)」可见范围;
  • 配合ig.friendship.setBesties()(见 friendship.repository.ts)实现「自动把新粉丝设为密友」等运营策略。

setBesties请求会提交add/remove数组,返回的friendship_statuses同样是按用户 pk 索引的状态映射,字段结构与本节接口高度一致。

字段组合:常见状态解读

followingis_privateincoming_requestoutgoing_requestis_bestie含义解读
truefalsefalsefalsetrue公开账号 + 互关/已关注 + 密友,可看到密友内容
truetruefalsefalsefalse已关注一个私密账号(已被对方批准)
falsetruefalsetruefalse我请求关注对方但仍在等待批准(私密账号)
falsetruetruefalsefalse对方请求关注我,我尚未批准
falsefalsefalsefalsefalse完全无关系(或未登录视角)

说明:上表为基于字段布尔语义的逻辑组合,Instagram 服务端在个别场景下可能对字段给出不完全一致的组合,使用时以实际接口返回为准。

数据来源:reels_media 接口与调用链路

Feed 类与请求端点

该响应接口由ReelsMediaFeed负责请求,实现位于 src/feeds/reels-media.feed.ts:

export class ReelsMediaFeed extends Feed<ReelsMediaFeedResponseRootObject, ReelsMediaFeedResponseItem> { userIds: Array<number | string>; source: IgAppModule = 'feed_timeline'; async request() { const { body } = await this.client.request.send<ReelsMediaFeedResponseRootObject>({ url: `/api/v1/feed/reels_media/`, method: 'POST', form: this.client.request.sign({ user_ids: this.userIds, source: this.source, _uuid: this.client.state.uuid, _uid: this.client.state.cookieUserId, _csrftoken: this.client.state.cookieCsrfToken, device_id: this.client.state.deviceId, supported_capabilities_new: JSON.stringify(SUPPORTED_CAPABILITIES), }), }); return body; } async items(): Promise<ReelsMediaFeedResponseItem[]> { const body = await this.request(); return Object.values(body.reels).reduce( (accumulator, current: ReelsMediaFeedResponse) => accumulator.concat(current.items), [], ); } }

要点:

  • 端点:POST /api/v1/feed/reels_media/;
  • 通过user_ids一次性批量指定多个用户 pk,返回按用户组织的故事数据;
  • 请求体经过client.request.sign()签名,包含_uuid、_uid、_csrftoken、device_id等设备与会话字段;
  • items()会将所有用户的reels条目拍平为单个ReelsMediaFeedResponseItem[]数组。

Feed 工厂方法

ReelsMediaFeed由FeedFactory.reelsMedia()创建(src/core/feed.factory.ts):

public reelsMedia(options: { userIds: Array<number | string>; source?: IgAppModule }): ReelsMediaFeed { return plainToClassFromExist(new ReelsMediaFeed(this.client), options); }

userIds接收用户数字 id(pk),source默认为'feed_timeline',可通过IgAppModule类型覆盖(见 types/common.types.ts)。该响应接口通过 src/responses/index.ts 的export * from './reels-media.feed.response'统一导出,因此可以直接从instagram-private-api包名导入使用。

实战示例:拉取故事并读取好友状态

仓库自带的 examples/user-stories-watching.example.ts 展示了最贴近本接口的完整调用流程:

const targetUser = await ig.user.searchExact('username'); // 获取精确用户,得到 pk const reelsFeed = ig.feed.reelsMedia({ // 使用 reels media feed(即 Stories feed) userIds: [targetUser.pk], // 可指定多个用户 id,"pk" 即用户 id }); const storyItems = await reelsFeed.items(); // 拉取故事条目 if (storyItems.length === 0) { // 通过长度判断该用户是否有可看的故事 console.log(`${targetUser.username}'s story is empty`); return; } const seenResult = await ig.story.seen([storyItems[0]]); // 标记第一条故事为已读 console.log(seenResult.status); // 应为 "ok"

在此基础上,若要读取friendship_status,可访问故事条目或其user对象:

const items = await reelsFeed.items(); const author = items[0].user; // ReelsMediaFeedResponseUser if (author.friendship_status) { // 该字段可选,务必判空 const fs = author.friendship_status; console.log({ following: fs.following, isPrivate: fs.is_private, incomingRequest: fs.incoming_request, outgoingRequest: fs.outgoing_request, isBestie: fs.is_bestie, }); }

配合前文语义可以形成实用决策:

// 对私密且我未关注的作者,主动发出关注请求(避免重复请求) if (fs.is_private && !fs.following && !fs.outgoing_request) { await ig.friendship.create(author.pk); } // 处理他人发来的关注请求 if (fs.incoming_request) { await ig.friendship.approve(author.pk); }

注意:ig.story.seen()(实现在 src/services/story.service.ts)会为每条故事构造mediaPk_userPk_sourceId形式的 reel id,并把seenAt控制在当前时间以内且每次随机 +1~3 秒,以模拟人类观看节奏——这说明 SDK 在故事消费链路上已经内置了风控友好设计,自动化读取时应尽量复用这些现成服务而非自行拼装请求。

与项目中其他好友状态接口的关系

ReelsMediaFeedResponseFriendshipStatus只是该项目中多个friendship_status形态之一。理解它们的异同有助于在混合场景中保持数据一致性:

  • FriendshipRepositoryShowResponseRootObject(friendship.repository.show.response.ts):/api/v1/friendships/show/{id}/的响应,字段更全,除本接口五个字段外还有followed_by、blocking、muting、is_blocking_reel、is_muting_reel、status。适合对单个用户做精确关系查询;
  • FriendshipRepositoryChangeResponseRootObject(friendship.repository.change.response.ts):关注/取关/拉黑等变更操作的返回,其中同样包含friendship_status,可用于确认操作生效;
  • DirectInboxFeedResponseFriendshipStatus等(direct-inbox.feed.response.ts):私信会话中出现的用户好友状态,结构与本接口几乎一致,但增加了blocking与is_restricted(部分响应类)字段;
  • FbsearchRepositoryTopsearchFlatResponseFriendship_status(fbsearch.repository.topsearch-flat.response.ts):搜索接口返回的轻量版状态。

可以看到,ReelsMediaFeedResponseFriendshipStatus是其中「随故事流批量下发」的形态:一次请求可拿到多个用户的关系快照,无需对每个用户单独调用friendships/show,因此适合批量场景;但字段集合相对精简(无blocking/muting),需要更细粒度关系信息时应回查ig.friendship.show(pk)。

使用注意事项

  • 可选字段判空:friendship_status位于ReelsMediaFeedResponseUser上时为可选属性(friendship_status?),TypeScript 编译器会强制要求先判空再访问,务必遵循,避免运行时Cannot read properties of undefined;
  • 批量场景的时效性:该状态随reels_media响应下发,是请求时刻的快照;若业务流程对关系状态敏感(如刚执行关注操作),应在操作完成后重新拉取或调用ig.friendship.show()校准;
  • 风控与频率:频繁调用reels_media或反复发送关注请求可能触发请求限制(IgRequestsLimitError)或动作风控(IgActionSpamError),批量遍历用户时应加入合理间隔与重试策略;
  • 私密账号内容:即使接口返回了私密作者的故事元数据,实际可见性仍受对方隐私设置约束,is_private应作为业务层展示与交互规则的依据。

总结

ReelsMediaFeedResponseFriendshipStatus是 instagram-private-api 中「故事流 × 好友关系」交叉场景的核心数据结构:五个布尔字段精炼地刻画了当前账号与故事作者之间的关注方向、请求状态、账号可见性与密友关系。结合 reels-media.feed.response.ts、reels-media.feed.ts、feed.factory.ts 与 user-stories-watching.example.ts 等仓库资源,开发者可以快速实现批量故事拉取、关系状态判断、关注请求管理与故事已读上报等完整闭环,并依据friendship.repository.ts中现成的增删改查方法把状态判断转化为实际动作。

  • 后端

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

NodeJS Instagram private API SDK. Written in TypeScript.

项目地址:https://gitcode.com/gh_mirrors/in/instagram-private-api
点击查看免费下载
上一篇:Echo网站数据统计:使用Redis HyperLogLog和Bitmap分析用户行为
下一篇:NCSN未来发展路线:从改进技术到SDE扩展的演进历程

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

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

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

立即咨询