- 后端
【免费下载链接】instagram-private-api
NodeJS Instagram private API SDK. Written in TypeScript.
MediaRepositoryCommentResponse是 instagram-private-api(NodeJS Instagram 私有 API SDK,TypeScript 编写)中描述“发布评论”这一接口返回数据的核心响应类型。它定义了评论提交成功后服务器返回的完整 JSON 结构,包括顶层状态字段与详细的评论对象、评论者用户信息。读完本篇,你将掌握该响应的全部字段含义与类型约束,理解它如何与ig.media.comment()请求方法相互配合,并能在自己的自动化脚本中正确解析评论数据、结合评论流(feed)做二次开发。
响应类型在项目中的定位
在 instagram-private-api 中,所有仓库方法(Repository)执行的都是一次 API 请求对应一个方法的低层操作。当客户端调用ig.media.comment(...)向 Instagram 私信评论接口/api/v1/media/{mediaId}/comment/提交评论时,服务器返回的响应体会被类型化为MediaRepositoryCommentResponse。
该接口定义于 src/responses/media.repository.comment.response.ts,与其余响应类型一样,由 src/responses/index.ts 统一导出,同时被 docs/modules/responses.md 收录为公开 API 文档。响应接口的正式文档位于 docs/interfaces/responses/MediaRepositoryCommentResponse.md,对应的方法文档位于 docs/classes/repositories/MediaRepository.md。
顶层接口结构
MediaRepositoryCommentResponse只包含两个属性,是典型的 Instagram 响应包装层结构:
| 属性 | 类型 | 说明 |
|---|---|---|
comment | MediaRepositoryCommentResponseComment | 服务器创建的完整评论对象,是本次响应的主体数据 |
status | string | 接口调用状态,正常时返回"ok" |
对应的 TypeScript 定义(src/responses/media.repository.comment.response.ts):
export interface MediaRepositoryCommentResponse { comment: MediaRepositoryCommentResponseComment; status: string; }值得强调的是:虽然接口名叫MediaRepositoryCommentResponse,但comment()方法实际向调用方返回的是body.comment,即内层评论对象,而不是这个包装层。这一点在 src/repositories/media.repository.ts 中可以看到:
const { body } = await this.client.request.send<MediaRepositoryCommentResponse>({ url: `/api/v1/media/${mediaId}/comment/`, method: 'POST', form: this.client.request.sign({ ... }), }); return body.comment;方法签名对应的文档声明为Promise<MediaRepositoryCommentResponseComment>(见 docs/classes/repositories/MediaRepository.md 中comment方法的 Returns 部分),因此上层业务代码拿到的是评论对象本身。
评论对象 MediaRepositoryCommentResponseComment
评论对象是响应中最有分析价值的部分,其完整定义见 docs/interfaces/responses/MediaRepositoryCommentResponseComment.md,源码位于 src/responses/media.repository.comment.response.ts。
| 字段 | 类型 | 含义 |
|---|---|---|
content_type | string | 内容类型标识,评论通常为"comment" |
user | MediaRepositoryCommentResponseUser | 发表评论的用户对象 |
pk | string | 评论的唯一主键 ID |
text | string | 评论正文内容 |
type | number | 评论类型标记 |
created_at | number | 评论创建时间戳(秒级) |
created_at_utc | number | UTC 时间下的创建时间戳(秒级) |
media_id | string | 被评论媒体(帖子)的 ID |
status | string | 评论自身状态标记 |
share_enabled | boolean | 是否允许该评论被分享/转发到动态等场景 |
其中pk是评论 ID 的重要来源。在后续需要针对某条评论做操作(如点赞、回复、批量删除)时,通常要从这里取出pk。created_at与created_at_utc为 Unix 秒级时间戳,可用于按时间排序或展示相对时间。
评论者用户对象 MediaRepositoryCommentResponseUser
MediaRepositoryCommentResponseUser描述了发表评论的用户,字段定义见 docs/interfaces/responses/MediaRepositoryCommentResponseUser.md,源码位于 src/responses/media.repository.comment.response.ts。
| 字段 | 类型 | 含义 |
|---|---|---|
pk | number | 用户的数字 ID(user-pk),注意此处为number,与评论pk的string不同 |
username | string | 用户名 |
full_name | string | 用户展示名 |
is_private | boolean | 是否私密账号 |
profile_pic_url | string | 头像 URL |
profile_pic_id | string | 头像图片 ID |
is_verified | boolean | 是否蓝 V 认证 |
has_anonymous_profile_picture | boolean | 是否使用匿名默认头像 |
reel_auto_archive | string | 快拍自动归档设置 |
allowed_commenter_type | string | 允许评论者的类型配置 |
这个用户对象与评论流、帖子详情等其他响应中的用户对象字段高度相似,便于在多个模块间复用相同的解析逻辑。profile_pic_url可直接用于头像展示;is_private、is_verified可用于判断评论者账号性质。
调用链路:评论如何被发送与解析
comment()方法(src/repositories/media.repository.ts)的完整参数如下:
public async comment({ mediaId, text, replyToCommentId, module = 'self_comments_v2', }: { mediaId: string; text: string; replyToCommentId?: string; module?: string; }) { ... }mediaId:目标媒体的 ID(必填),即帖子或快拍的media_id;text:评论正文(必填);replyToCommentId:可选,用于回复指定评论,此时会携带replied_to_comment_id字段;module:可选,模块标识,默认'self_comments_v2',对应表单中的containermodule字段。
请求体经过this.client.request.sign(...)签名(见 src/core/request.ts),签名逻辑会把表单对象 JSON 序列化后用 HMAC-SHA256 生成signed_body与ig_sig_key_version,模拟 Instagram Android 客户端的请求特征。请求中还包含几个值得注意的反垃圾字段:
user_breadcrumb:由 src/core/request.ts 中的userBreadcrumb(text.length)生成,它根据文本长度、随机项与当前时间构造 HMAC 签名片段,用于模拟真实用户的输入行为,降低被判定为机器人的概率;idempotence_token:每次调用生成一个新的 GUID(基于chance库),用于请求幂等去重;_csrftoken、_uid、_uuid、device_id、radio_type:来自ig.state的会话令牌、用户 ID、UUID、设备 ID 与 radio 类型,是每次签名请求的标准载荷。
import { IgApiClient } from 'instagram-private-api'; const ig = new IgApiClient(); ig.state.generateDevice(process.env.IG_USERNAME); ig.state.proxyUrl = process.env.IG_PROXY; (async () => { await ig.simulate.preLoginFlow(); const loggedInUser = await ig.account.login(process.env.IG_USERNAME, process.env.IG_PASSWORD); process.nextTick(async () => await ig.simulate.postLoginFlow()); // 发送一条普通评论,返回内层评论对象 const comment = await ig.media.comment({ mediaId: '1234567890123456789_1234567890', text: 'Hello from instagram-private-api', }); console.log(comment.pk); // 新评论 ID console.log(comment.text); // 评论正文 console.log(comment.user.username); // 评论者用户名 console.log(comment.status); // 评论状态 // 回复指定评论:传入被回复评论的 pk const reply = await ig.media.comment({ mediaId: '1234567890123456789_1234567890', text: 'Nice post!', replyToCommentId: comment.pk, }); })();响应解析在实战中的典型用法
1. 解析返回的评论对象
comment()的返回值类型为MediaRepositoryCommentResponseComment,即响应包装层中的comment字段。你可以直接访问pk、text、created_at、user.username等属性做后续处理,例如写入数据库、记录日志或触发回复逻辑。
2. 读取已有评论:MediaCommentsFeed
若需要获取某条媒体的评论列表而不是发送评论,可使用ig.feed.mediaComments(mediaId),其实现位于 src/feeds/media-comments.feed.ts,请求端点为/api/v1/media/{id}/comments/。该 feed 支持can_support_threading、max_id、min_id分页参数,返回的列表元素接口见 src/responses/media-comments.feed.response.ts,其中的text、user、pk、created_at等字段与本文的评论对象结构基本一致,便于统一处理。
const commentsFeed = ig.feed.mediaComments('1234567890123456789_1234567890'); const comments = await commentsFeed.items(); // 自动分页取第一页 for (const c of comments) { console.log(`${c.user.username}: ${c.text}`); }3. 结合同仓库其他评论方法
围绕评论,MediaRepository还提供了一系列配套操作,均可对照 docs/classes/repositories/MediaRepository.md 查阅:
checkOffensiveComment(commentText, mediaId?):发送正式评论前预检文本是否为垃圾/仇恨内容(端点/api/v1/media/comment/check_offensive_comment/,见 src/repositories/media.repository.ts);commentsBulkDelete(mediaId, commentIds):批量删除评论(/api/v1/media/{mediaId}/comment/bulk_delete/,commentIds 以逗号拼接,见 src/repositories/media.repository.ts);likeComment(commentId)/unlikeComment(commentId):对评论点赞/取消点赞(src/repositories/media.repository.ts);commentsDisable(mediaId)/commentsEnable(mediaId):关闭/开启某条媒体的评论功能(src/repositories/media.repository.ts)。
其中commentsBulkDelete需要的评论 ID 列表,正是来自评论对象(或评论 feed)的pk字段,形成了“读取评论 → 筛选 → 批量删除”的完整链路。
使用注意事项与限制
- 请求签名与状态依赖:发送评论依赖
ig.state中完整的登录态(cookieCsrfToken、cookieUserId、uuid、deviceId等)。请先调用ig.account.login(...)完成登录,必要时执行ig.simulate.preLoginFlow()/ig.simulate.postLoginFlow()模拟真实客户端行为(参见 README.md 的基本概念与示例部分)。 - 频率与风控:评论接口属于高频风控敏感接口。项目内部已通过
user_breadcrumb、idempotence_token模拟人类行为,但实际使用中仍应控制请求频率,避免触发IgActionSpamError等频率限制类错误(见 src/errors/ig-action-spam.error.ts)。 - 字段类型差异:评论
pk为string,而用户pk为number。在将 ID 传入likeComment、commentsBulkDelete等需要评论 ID 的方法时,请使用评论对象上的pk(字符串)并保持原样传递,避免类型转换错误。 - 接口契约的时效性:本文描述的字段与端点基于当前仓库快照(
src/responses/media.repository.comment.response.ts)。Instagram 服务端可能调整字段,解析代码应具备对缺失字段的容错能力。
小结
MediaRepositoryCommentResponse是 instagram-private-api 评论体系中“写评论”一侧的响应契约:顶层comment字段承载完整的评论对象(含时间戳、媒体 ID、分享开关),status标识调用结果;评论对象内嵌的用户信息则可直接用于身份识别与展示。理解该接口的结构、comment()方法的参数与签名机制,并搭配MediaCommentsFeed、checkOffensiveComment、commentsBulkDelete等配套能力,即可在合规的自动化场景中完成评论的发送、读取、筛选与治理的完整闭环。
- 后端
【免费下载链接】instagram-private-api
NodeJS Instagram private API SDK. Written in TypeScript.
相关推荐
instagram-private-api 评论响应用户结构体 `MediaRepositoryCommentResponseUser` 全字段解析与实战指南
instagram private api 评论响应用户结构体 MediaRepositoryCommentResponseUser 全字段解析与实战指南 本篇
后端instagram-private-api 响应结构解析:DirectThreadFeedResponseLast_permanent_item 接口字段与使用指南
instagram private api 响应结构解析:DirectThreadFeedResponseLast_permanent_item 接口字段与使用
后端instagram-private-api 数据响应接口解析:StoriesInsightsFeedResponseInline_insights_node 的结构、字段与用途
instagram private api 数据响应接口解析:StoriesInsightsFeedResponseInline_insights_node 的
后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考