- 后端
【免费下载链接】instagram-private-api
NodeJS Instagram private API SDK. Written in TypeScript.
本篇技术指南围绕 instagram-private-api(NodeJS/TypeScript 编写的 Instagram 私有 API SDK)中视频发布链路的关键响应类型MediaRepositoryConfigureVideoResponseRootObject,系统讲解其字段结构、嵌套类型、生成时机与底层调用链。读完本文,你将掌握视频 configure 响应的完整数据模型,并能在ig.publish.video()或ig.media.configureVideo()返回结果中准确提取媒体信息、判断发布结果,从而构建可靠的视频发布与校验逻辑。
一、接口定位:视频 configure 响应的顶层容器
在 instagram-private-api 的响应模型体系中,MediaRepositoryConfigureVideoResponseRootObject是对 Instagram 服务端/api/v1/media/configure/(视频模式)返回 JSON 的 TypeScript 类型化描述。它定义在 src/responses/media.repository.configure-video.response.ts,并通过 src/responses/index.ts 统一导出,供全仓库引用。
该接口只有三个顶层字段,结构非常精简:
export interface MediaRepositoryConfigureVideoResponseRootObject { media: MediaRepositoryConfigureVideoResponseMedia; upload_id: string; status: string; }| 字段 | 类型 | 含义 |
|---|---|---|
media | MediaRepositoryConfigureVideoResponseMedia | 配置完成后的媒体对象,包含视频帖子在 Instagram 上的完整描述 |
upload_id | string | 与本次发布关联的上传 ID,用于回传映射,通常即Date.now().toString() |
status | string | 服务端处理状态标识,正常为"ok",可据此判断 configure 是否成功 |
文档中该接口归属responses模块(见 docs/modules/responses.md 接口清单中的MediaRepositoryConfigureVideoResponseRootObject条目),同一响应文件中还依次声明了Media、Image_versions2、CandidatesItem、User、Usertags、InItem、Fb_user_tags等嵌套接口,共同构成一棵完整的响应数据树。
二、核心字段详解:media 对象的数据模型
media字段是响应主体,其类型MediaRepositoryConfigureVideoResponseMedia(接口文档,源码见 src/responses/media.repository.configure-video.response.ts)包含了视频帖子被 Instagram 收录后的全部元数据,可按用途划分为以下几组。
2.1 媒体标识与时间戳
| 字段 | 类型 | 说明 |
|---|---|---|
pk | string | 媒体的唯一主键(即 mediaId 的数字部分),可拼接为mediaId供其他接口使用 |
id | string | 完整媒体 ID,形如pk_userId |
code | string | 帖子的短码(URL 中的短链接标识) |
taken_at | number | 拍摄/发布时的 Unix 时间戳(秒) |
device_timestamp | number | 设备侧时间戳 |
client_cache_key | string | 客户端缓存键,通常形如pk_uploadId |
2.2 媒体类型与画面信息
| 字段 | 类型 | 说明 |
|---|---|---|
media_type | number | 媒体类型枚举:2 表示图片、3 表示视频(本响应场景固定为视频相关取值) |
filter_type | number | 滤镜类型编号,configure 默认填充'0'(无滤镜) |
original_width/original_height | number | 源视频的原始像素宽高,来自上传前解析的 MP4 元信息 |
image_versions2 | Image_versions2 | 封面图多分辨率候选项容器 |
image_versions2只含一个candidates数组(Image_versions2 文档),每个CandidatesItem(接口文档)描述一张封面缩略图:
export interface MediaRepositoryConfigureVideoResponseCandidatesItem { width: number; // 缩略图宽度 height: number; // 缩略图高度 url: string; // 可访问的 CDN 地址 estimated_scans_sizes: number[]; // 各渐进式扫描层预估大小(用于渐进式加载) }取第一个 candidate 的url即可获得帖子封面,这是发布后立即生成可视化预览的常用手段。
2.3 作者信息:user 对象
user字段(接口文档)描述当前发布账号:
| 字段 | 类型 | 说明 |
|---|---|---|
pk | number | 用户数字 ID |
username/full_name | string | 用户名与显示名 |
is_private | boolean | 账号是否私密 |
profile_pic_url/profile_pic_id | string | 头像 URL 及其 ID |
has_anonymous_profile_picture | boolean? | 是否为默认匿名头像(可选字段) |
can_boost_post/can_see_organic_insights/show_insights_terms | boolean? | 商业化与数据洞察相关开关(可选) |
reel_auto_archive | string? | 快拍自动归档配置(可选) |
is_unpublished/is_verified | boolean? | 是否未发布 / 是否认证账号(可选) |
latest_reel_media | null? | 最近快拍媒体,此处通常为 null |
2.4 交互与评论配置
| 字段 | 类型 | 说明 |
|---|---|---|
can_viewer_reshare | boolean | 当前查看者是否可以转发 |
can_viewer_save | boolean | 当前查看者是否可以保存 |
comment_likes_enabled | boolean | 是否启用评论点赞 |
comment_threading_enabled | boolean | 是否启用评论楼中楼 |
comment_count | number | 评论总数 |
has_more_comments | boolean | 是否还有更多评论 |
max_num_visible_preview_comments | number | 预览评论可见数量上限 |
preview_comments | any[] | 预览评论列表(本接口中未细化类型) |
can_view_more_preview_comments | boolean | 是否可以查看更多预览评论 |
photo_of_you | boolean | 是否包含“照片中的你”标记 |
caption | null | 说明文字,本场景中未启用时固定为 null |
2.5 标签类信息
| 字段 | 类型 | 说明 |
|---|---|---|
usertags | Usertags | 用户标签容器,in数组每项为InItem |
fb_user_tags | Fb_user_tags | Facebook 用户标签容器,in为any[] |
organic_tracking_token | string | 用于数据归因的追踪令牌 |
Usertags(接口文档)中的每个InItem(接口文档)结构为:
export interface MediaRepositoryConfigureVideoResponseInItem { user: MediaRepositoryConfigureVideoResponseUser; // 被标记的用户 position: number[]; // 标记在画面上的归一化坐标 start_time_in_video_in_sec: null; // 视频中出现起始秒数(本场景为 null) duration_in_video_in_sec: null; // 视频中持续秒数(本场景为 null) }Fb_user_tags(接口文档)则只含in: any[],说明该字段在本 SDK 中未做进一步类型化。
三、底层调用链:响应从何而来
MediaRepositoryConfigureVideoResponseRootObject是视频发布“configure(配置)阶段”的产物。从源码可以还原完整调用链(参见 examples/upload-video.example.ts):
- 入口:
ig.publish.video({ video, coverImage, caption, usertags, location })(PublishService.video)。 - 上传:依次完成视频分段/整段上传、封面图上传、
media.uploadFinish()收尾(含source_type: '4'与video.length)。 - configure:
this.client.media.configureVideo(configureOptions)最终发出POST /api/v1/media/configure/?video=1请求(见 MediaRepository.configureVideo),其form通过this.client.request.sign(form)签名后提交。 - 返回:请求响应体
body即对应本接口所描述的 JSON 结构。
configureVideo内部通过applyConfigureDefaults为表单补充默认值(media.repository.ts):自动注入_csrftoken、_uid、_uuid、device等签名必需字段,并填充timezone_offset、date_time_original、caption、source_type: '4'、filter_type: '0'、audio_muted: false、poster_frame_index: 0等默认项;若传入了usertags或location,则会先序列化为 JSON 字符串再随表单发送,与响应中的Usertags结构一一对应。
配置入参类型定义在 src/types/media.configure-video.options.ts(MediaConfigureTimelineVideoOptions),可选字段包括filter_type、timezone_offset、usertags、location、source_type、device_id、caption、date_time_original等。
细节提示:在 src/responses/media.repository.configure-video.response.ts 中同时声明了
MediaRepositoryConfigureResponseRootObject与MediaRepositoryConfigureVideoResponseRootObject两个顶层接口,二者结构相同;repository 方法当前的返回类型标注为前者,文档侧则记录了后者。使用时两者可按相同结构对待。
四、错误处理与状态判断
发布阶段若失败,PublishService.video做了多层防护(publish.service.ts):
- 上传阶段错误包装为
IgUploadVideoError(src/errors/ig-upload-video-error.ts),携带响应体与视频信息。 - 遇到 HTTP 202(转码待完成)时,
catchTranscodeError会按options.transcodeDelay(默认 5000ms)等待后重试(publish.service.ts)。 - configure 阶段最多重试 6 次(指数退避
(i+1)*2秒);超过次数或收到>= 400状态码时抛出IgConfigureVideoError(src/errors/ig-configure-video-error.ts)。
因此在业务代码中,拿到MediaRepositoryConfigureVideoResponseRootObject后,建议按以下顺序校验:
- 检查
status === 'ok',否则视为发布未成功; - 读取
media.pk/media.id拼接完整 mediaId,用于后续ig.media.info()、ig.media.delete()等操作; - 从
media.image_versions2.candidates[0].url取封面图,从media.code构造帖子短链接。
五、完整示例:发布视频并解析响应
参考 examples/upload-video.example.ts,可写出如下端到端用法:
import { IgApiClient } from './src'; import { readFile } from 'fs'; import { promisify } from 'util'; const readFileAsync = promisify(readFile); const ig = new IgApiClient(); async function login() { ig.state.generateDevice(process.env.IG_USERNAME); ig.state.proxyUrl = process.env.IG_PROXY; await ig.account.login(process.env.IG_USERNAME, process.env.IG_PASSWORD); } (async () => { await login(); const publishResult = await ig.publish.video({ video: await readFileAsync('./myVideo.mp4'), // MP4 Buffer coverImage: await readFileAsync('./myVideoCover.jpg'), // 封面图 Buffer caption: 'posted via instagram-private-api', // 亦支持 usertags、location,参见 upload-photo.example.ts }); // publishResult 即 MediaRepositoryConfigureVideoResponseRootObject 对应结构 if (publishResult.status !== 'ok') { throw new Error('video configure failed'); } console.log('mediaId =', publishResult.media.pk, '/', publishResult.media.id); console.log('short code =', publishResult.media.code); console.log('cover url =', publishResult.media.image_versions2.candidates[0].url); console.log('upload_id =', publishResult.upload_id); })();六、总结
MediaRepositoryConfigureVideoResponseRootObject是 instagram-private-api 视频发布链路中 configure 阶段的响应契约,以极简的三字段(media/upload_id/status)承载完整的视频帖元数据。其嵌套结构——Media、Image_versions2、CandidatesItem、User、Usertags、InItem、Fb_user_tags——与上传表单的参数设计相互呼应(如usertags表单字段对应响应中的Usertags.in)。理解这一数据模型,配合 PublishService 的重试与错误包装机制,即可在自动化发布、内容归档、封面预览等场景中稳健地处理视频发布结果。更多响应类型可查阅 docs/modules/responses.md 索引继续深入。
- 后端
【免费下载链接】instagram-private-api
NodeJS Instagram private API SDK. Written in TypeScript.
相关推荐
Lighthouse CI Viewer 深度解析:基于拖拽的 Lighthouse 报告对比工具
Lighthouse CI Viewer 深度解析:基于拖拽的 Lighthouse 报告对比工具 导读 @lhci/viewer (packages/view
后端instagram-private-api 响应结构解析:IgtvBrowseFeedResponseUser 接口完全指南
instagram private api 响应结构解析:IgtvBrowseFeedResponseUser 接口完全指南 本文面向使用 TypeScript
后端instagram-private-api 响应结构解析:IgtvChannelFeedResponseVideoVersionsItem 视频版本接口实战指南
instagram private api 响应结构解析:IgtvChannelFeedResponseVideoVersionsItem 视频版本接口实战指南
后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考