
后端【免费下载链接】instagram-private-apiNodeJS Instagram private API SDK. Written in TypeScript.项目地址https://gitcode.com/gh_mirrors/in/instagram-private-api点击查看免费下载导读PendingFriendshipsFeed是 instagram-private-api 中用于拉取当前账号所有待处理pending好友请求列表的分页式 Feed 类对应 Instagram 私信/关系模块的GET /api/v1/friendships/pending接口。读完本文你将掌握如何通过FeedFactory.pendingFriendships()实例化该 Feed、理解其基于next_max_id的分页与 RxJS 流式拉取机制、如何用items()拿到带实体方法的用户对象以及如何联动FriendshipRepository的approve/deny完成关注请求的批量审批或拒绝构建一套完整的私信关注请求管理方案。类的定位与继承关系PendingFriendshipsFeed定义在 src/feeds/account-friendships.feed.ts它与AccountFollowersFeed、AccountFollowingFeed同属好友关系类 Feed家族。其完整的类型层级如下基类Feed抽象类位于 src/core/feed.ts泛型参数为PendingFriendshipsFeedResponse请求响应结构与PendingFriendshipsFeedResponseUsersItem列表项类型再往上是Repository位于 src/core/repository.ts它持有受保护的client: IgApiClient实例——因此所有 Feed 天然共享IgApiClient的request、state、friendship等能力。从源码结构看该 Feed 内部只维护两个核心状态字段nextMaxId下一页游标与继承自Feed的moreAvailable是否还有更多数据配合Expose()装饰器参与序列化这一点会在后文分页与序列化两节详细展开。实例化构造函数与 FeedFactoryPendingFriendshipsFeed的构造函数签名与基类Repository一致只接收一个参数参数类型说明clientIgApiClient已登录的 API 客户端实例不过在实际业务代码中几乎不需要直接new PendingFriendshipsFeed(client)。官方推荐通过FeedFactory统一创建入口为ig.feed.pendingFriendships()import { IgApiClient } from instagram-private-api; const ig new IgApiClient(); ig.state.generateDevice(your_username); // ...登录逻辑ig.account.login... // 推荐通过 FeedFactory 创建 const pendingFeed ig.feed.pendingFriendships();其工厂实现位于 src/core/feed.factory.tspublic pendingFriendships(): PendingFriendshipsFeed { return new PendingFriendshipsFeed(this.client); }可以看到这是一个无参工厂方法——因为待处理请求天然属于当前登录账号自身无需像user(id)或location(id)那样传入目标 ID。核心请求request() 与底层接口调用request()是该 Feed 覆盖基类后真正的 HTTP 请求方法实现在 src/feeds/account-friendships.feed.tsasync request() { const { body } await this.client.request.sendPendingFriendshipsFeedResponse({ url: /api/v1/friendships/pending, qs: { rank_token: this.rankToken, max_id: this.nextMaxId, }, }); this.state body; return body; }几个关键实现细节接口路径为/api/v1/friendships/pendingGET请求经由 src/core/request.ts 的sendT()方法发出默认baseUrl: https://i.instagram.com/并自动携带登录态的 cookie jarjar: this.client.state.cookieJar。rank_token继承自基类Feed的rankToken字段在构造时由chance.guid()生成见 src/core/feed.ts属于每个 Feed 实例唯一的一次性随机令牌。max_id即nextMaxId首轮请求时未定义undefined服务端返回后通过this.state body写入下一轮游标。状态写入响应体body会立即喂给set state(body)把body.next_max_id同步到moreAvailable与nextMaxId从而驱动分页循环见下节。send()内部还会通过Request.requestTransformsrc/core/request.ts用json-bigint解析响应体将超过 15 位的数字转为字符串避免大整数如用户pk精度丢失——这也解释了为什么PendingFriendshipsFeedResponseUsersItem.pk在类型上被定义为number但实际可能以字符串形式安全落地。分页机制state、nextMaxId 与 isMoreAvailableInstagram 的分页式接口通常返回next_max_id作为下一页游标。PendingFriendshipsFeed的statesettersrc/feeds/account-friendships.feed.ts是整个分页状态机的核心set state(body: PendingFriendshipsFeedResponse) { this.moreAvailable !!body.next_max_id; this.nextMaxId body.next_max_id; }若body.next_max_id存在非 null/undefinedmoreAvailable为true说明还有更多页可拉nextMaxId被保存供下一次request()作为max_id传入若为null响应类型中next_max_id: null分页终止。配合基类提供的isMoreAvailable()src/core/feed.tspublic isMoreAvailable() { return !!this.moreAvailable; }因此一个拉取全部待处理请求的循环可以这样写const feed ig.feed.pendingFriendships(); do { const users await feed.items(); // 触发 request() 并推进游标 for (const user of users) { console.log(${user.username} (${user.pk}) 请求关注你); } } while (feed.isMoreAvailable());数据映射items() 与响应结构items()覆盖了基类抽象方法src/feeds/account-friendships.feed.tsasync items() { const body await this.request(); return body.users.map(user plainToClassFromExist(new PendingFriendshipsFeedResponseUsersItem(this.client), user), ); }它会先调用request()完成拉取与游标推进再将body.users中的每个普通 JSON 对象通过class-transformer的plainToClassFromExist转成带实体能力的PendingFriendshipsFeedResponseUsersItem实例。响应结构 PendingFriendshipsFeedResponse定义在 src/responses/account-friendships.feed.response.ts字段类型说明sectionsnull当前接口恒为 null与分组式接口区分usersPendingFriendshipsFeedResponseUsersItem[]待处理请求的用户列表big_listboolean是否为大数据集影响是否需要持续分页next_max_idnull下一页游标无更多数据时为 nullpage_sizenumber每页返回数量statusstring请求状态通常为ok列表项 PendingFriendshipsFeedResponseUsersItem每个用户项继承自ProfileEntitysrc/entities/profile.entity.ts字段定义见 src/responses/account-friendships.feed.response.ts字段类型说明pknumber用户唯一 ID关注请求主体usernamestring用户名full_namestring显示名is_privateboolean是否私密账号profile_pic_urlstring头像 URLprofile_pic_idstring可选头像图片 IDis_verifiedboolean是否认证has_anonymous_profile_pictureboolean是否匿名默认头像is_favoriteboolean是否在最喜爱列表latest_reel_medianumber可选最近一条快拍的时间戳流式处理items$、observable 与自动重试除了手动循环分页基类还提供了流式拉取能力这是PendingFriendshipsFeed全自动翻页的推荐姿势。items$ 与 observable()items$是一个 gettersrc/core/feed.ts等价于调用无参的observable()而observable(semaphore?, attemptOptions?)src/core/feed.ts返回一个 RxJSObservableItem[]其内部逻辑是在一个do...while循环中反复调用this.items()每轮向观察者next(items)推出一批数据每批之间若提供了semaphore函数则await semaphore()后再继续可用于限速/加延时避免触发风控直到isMoreAvailable()为 false 或订阅被取消最后complete()。因此流式写法非常简洁ig.feed.pendingFriendships() .items$ // 等价于 .observable() .subscribe({ next(users) { for (const u of users) console.log(u.username); }, error(e) { console.error(拉取出错, e); }, complete() { console.log(全部待处理请求已拉取完成); }, });attemptOptions 自动重试策略attemptOptions是PendingFriendshipsFeed从基类继承的公开属性src/core/feed.ts基于lifeomic/attempt的retry实现默认值如下配置项默认值说明delay60000首次重试前的基础等待毫秒数factor1.5退避增长因子指数退避maxAttempts10最大尝试次数minDelay60000最小等待毫秒数maxDelay300000最大等待毫秒数封顶 5 分钟jittertrue是否加入随机抖动避免请求风暴同时observable()内置了友好等待错误策略src/core/feed.ts当错误是IgResponseError且 HTTP 状态码为400 / 429 / 500 / 502时不中断流程等待后重试其余错误则直接context.abort()中止并抛给observer.error。这组默认值对高频拉取场景足够稳健也可以在observable第二参或直接赋值feed.attemptOptions中按需覆盖例如调低maxAttempts以更快失败feed.attemptOptions { maxAttempts: 3, delay: 5000 };状态持久化serialize / deserialize / toPlainPendingFriendshipsFeed继承自Feed的三个序列化方法src/core/feed.ts全部基于class-transformer的excludeAll策略即只序列化标注了Expose()的字段——对于该 Feed即为moreAvailable、nextMaxId与rankTokenserialize(): string将当前分页游标状态序列化为 JSON 字符串deserialize(data: string): void从 JSON 字符串恢复游标状态plainToClassFromExist合并到现有实例toPlain(): Recordstring, any返回普通对象形式的状态快照。典型用法是断点续拉把feed.serialize()的结果存下来数据库/文件下次会话先feed.deserialize(saved)再继续items()即可从上次的max_id继续而非从头拉取。与 FriendshipRepository 联动审批 / 拒绝待处理请求拉取到待处理请求后业务闭环自然是对每个用户做出同意approve或拒绝deny操作。这由FriendshipRepositorysrc/repositories/friendship.repository.ts提供方法底层接口语义approve(id)POST /api/v1/friendships/approve/{id}/同意关注请求deny(id)POST /api/v1/friendships/ignore/{id}/拒绝忽略关注请求removeFollower(id)POST /api/v1/friendships/remove_follower/{id}/移除粉丝这些方法内部经change()src/repositories/friendship.repository.ts统一构造带签名的 POST 表单request.sign({...})包含_csrftoken、_uid、device_id、_uuid、radio_type返回FriendshipRepositoryChangeResponseFriendship_statussrc/responses/friendship.repository.change.response.ts其中包含following、incoming_request、outgoing_request等状态字段。完整的拉取并批量处理示例import { IgApiClient } from instagram-private-api; const ig new IgApiClient(); ig.state.generateDevice(your_username); // 登录并写入 state ... async function processPendingRequests(mode: approve | deny) { const feed ig.feed.pendingFriendships(); do { const users await feed.items(); for (const user of users) { // user 是 PendingFriendshipsFeedResponseUsersItempk 为请求者用户 ID if (mode approve) { await ig.friendship.approve(user.pk); console.log(已同意 ${user.username} 的关注请求); } else { await ig.friendship.deny(user.pk); console.log(已拒绝 ${user.username} 的关注请求); } } } while (feed.isMoreAvailable()); } // 一键批准所有待处理请求 // await processPendingRequests(approve);列表项的实体方法由于每个列表项继承自ProfileEntitysrc/entities/profile.entity.ts还可以直接调用user.checkFollow()先friendship.show(pk)检查关注状态若未关注则friendship.create(pk)关注——适用于关注请求者的场景user.checkUnfollow()对称地若仍关注则取消关注。注意事项与适用前提必须先登录PendingFriendshipsFeed依赖IgApiClient.state中的登录 cookie未登录或会话过期时request()会抛出IgLoginRequiredError相关错误定义见 docs/classes/errors。游标为 null 即结束Instagram 分页以next_max_id null为终点不要用big_list作为唯一判断依据moreAvailable已经封装了这一逻辑。频率控制批量 approve/deny 属于敏感操作建议在observable()中传入semaphore限速或调低maxAttempts、结合默认的 429 等待策略避免触发IgActionSpamError。大整数精度pk等超长数字由Request层的json-bigint转字符串处理src/core/request.ts若自行调用底层接口请留意该行为。方法签名以源码为准本文涉及的attemptOptions、observable(semaphore?, attemptOptions?)等签名与默认值均以 src/core/feed.ts 与 src/feeds/account-friendships.feed.ts 当前实现为准。相关资源速览Feed 类实现src/feeds/account-friendships.feed.ts抽象基类src/core/feed.ts、Feed API 文档工厂入口src/core/feed.factory.ts、FeedFactory API 文档响应类型src/responses/account-friendships.feed.response.ts、PendingFriendshipsFeedResponse、PendingFriendshipsFeedResponseUsersItem实体基类src/entities/profile.entity.ts、ProfileEntity API 文档审批/拒绝操作src/repositories/friendship.repository.ts、FriendshipRepository API 文档底层请求层src/core/request.ts、Request API 文档赞分享后端【免费下载链接】instagram-private-apiNodeJS Instagram private API SDK. Written in TypeScript.项目地址https://gitcode.com/gh_mirrors/in/instagram-private-api点击查看免费下载相关推荐Instagram Private API 深度解析BestiesFeed 好友列表 Feed 的架构、分页与实战用法Instagram Private API 深度解析BestiesFeed 好友列表 Feed 的架构、分页与实战用法 本篇技术指南围绕 instagram后端instagram-private-api 的 DirectPendingInboxFeed 类详解读取 Instagram 私信待处理请求Pending Inboxinstagram private api 的 DirectPendingInboxFeed 类详解读取 Instagram 私信待处理请求Pending后端instagram-private-api 中 MusicGenreFeed 音乐流派 Feed 的源码解析与分页实战指南instagram private api 中 MusicGenreFeed 音乐流派 Feed 的源码解析与分页实战指南 MusicGenreFeed 是 N后端上一篇Mac 窗口置顶工具 Topit 使用指南免费把任意窗口钉在最上面三步搞定下一篇xManager如何切换 Android Spotify 版本并解锁高级功能新手完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考