前言
视频号崛起之后,朋友圈的视频内容同样越来越受重视。无论是品牌每日定时发视频朋友圈、私域运营批量触达,还是SCRM系统把素材库直接同步到员工朋友圈,背后都离不开一个核心能力:通过接口自动化发送视频朋友圈。然而微信官方并未开放此能力,市面上现有方案良莠不齐。本文系统梳理视频朋友圈接口的实现原理、完整调用流程、关键参数与避坑细节,帮助开发者用最短路径落地这一高价值功能。
一、为什么视频朋友圈比图文朋友圈更难自动化
朋友圈发图文,本质上是把文本和已上传的图片素材 ID 组装成一条消息体提交。但视频朋友圈的流程更复杂,分为三个阶段:
- 视频文件上传:需要先把视频文件(MP4)上传到微信的媒体服务器,取得一个临时的媒体资源引用(
mediaId或等效标识); - 封面图上传:朋友圈视频必须附带封面缩略图,封面单独上传,同样需要引用;
- 发送指令下发:携带上述两个资源引用、可见范围、文案等参数,发起真正的朋友圈发布请求。
这三步中的任何一步出错,都会导致发布失败或只发出纯文字朋友圈。此外,视频还有格式、分辨率、时长、文件大小的限制,需要在上传前做好预处理。
正因为流程链路长,大多数基于模拟点击的 RPA 方案极其脆弱——一旦微信客户端更新界面,脚本就会失效。相比之下,基于 微信iPad协议 的接口方案直接在协议层面操作,不依赖界面,稳定性高出一个量级。
二、iPad协议接口方案原理
WechatApi 采用 iPad 协议接入微信网络,模拟真实 iPad 客户端与微信服务器通信。其核心优势在于:
- 不依赖安卓/PC端的界面自动化,协议层直接发包,稳定可靠;
- 独立设备 ID(appId),每个托管账号对应一台虚拟 iPad,账号隔离,互不影响;
- 完整支持视频朋友圈三段式流程,上传、发布均有对应接口;
- HTTP REST 风格,JSON 传参,开发者无需了解微信协议细节,按文档调用即可。
鉴权方式统一采用请求头 VideosApi-token 传递 API Token,业务参数中 appId 指定目标设备(即托管的微信账号)。整体调用范式如下:
POST /接口路径
Headers:
VideosApi-token: <your_api_token>
Content-Type: application/json
Body:
{ "appId": "<设备ID>", ...业务参数 }
Response:
{ "ret": 200, "msg": "ok", "data": { ... } }
ret 为 200 表示成功,非 200 时 msg 字段会描述错误原因,data 携带返回的业务数据。
三、视频朋友圈完整调用流程
第一步:上传视频文件
视频文件通过 multipart/form-data 或 base64 编码方式上传(推荐 base64,避免 Content-Type 设置错误导致的上传失败)。上传接口返回一个 mediaId,代表视频在微信服务器的临时资源,有效期通常为数分钟到数小时,需在有效期内完成发布。
pythonimport requests
import base64
API_BASE = "https://api.wechatapi.net" # 示意域名,以开发文档为准
TOKEN = "your_api_token_here"
APP_ID = "your_device_app_id"
# 读取视频文件并 base64 编码
with open("demo.mp4", "rb") as f:
video_b64 = base64.b64encode(f.read()).decode()
resp = requests.post(
f"{API_BASE}/sns/upload-video", # 示意路径
headers={"VideosApi-token": TOKEN},
json={
"appId": APP_ID,
"videoData": video_b64, # base64 编码的视频内容
"fileExt": "mp4"
}
)
result = resp.json()
# result 示例:{"ret": 200, "msg": "ok", "data": {"mediaId": "xxx_video_media_id"}}
video_media_id = result["data"]["mediaId"]
print("视频 mediaId:", video_media_id)
注意:视频文件需满足微信要求的格式规范(见下方参数表格),建议在上传前用 ffmpeg 做标准化处理。
第二步:上传封面缩略图
封面图同样需要单独上传,通常从视频第一帧截取,分辨率建议与视频等比缩放至不超过 1280×720。
pythonwith open("cover.jpg", "rb") as f:
cover_b64 = base64.b64encode(f.read()).decode()
resp_cover = requests.post(
f"{API_BASE}/sns/upload-image", # 示意路径
headers={"VideosApi-token": TOKEN},
json={
"appId": APP_ID,
"imageData": cover_b64,
"fileExt": "jpg"
}
)
cover_result = resp_cover.json()
cover_media_id = cover_result["data"]["mediaId"]
print("封面 mediaId:", cover_media_id)
第三步:发布视频朋友圈
携带前两步拿到的 mediaId,加上文案、可见范围等参数,调用发布接口:
bashcurl -X POST "https://api.wechatapi.net/sns/post-moment" \
-H "VideosApi-token: your_api_token_here" \
-H "Content-Type: application/json" \
-d '{
"appId": "your_device_app_id",
"content": "今天的产品演示视频,欢迎围观~",
"videoMediaId": "xxx_video_media_id",
"coverMediaId": "xxx_cover_media_id",
"visible": 0,
"atUsers": []
}'
成功响应示例:
json{
"ret": 200,
"msg": "ok",
"data": {
"momentId": "moment_abc123",
"createTime": 1718000000
}
}
四、关键参数说明
下表汇总了视频朋友圈接口涉及的主要参数及其约束:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
appId | string | 是 | 设备ID,即托管微信账号的唯一标识 |
content | string | 否 | 朋友圈文案,最多1500字,可空(纯视频无文案) |
videoMediaId | string | 是 | 第一步上传视频后返回的 mediaId |
coverMediaId | string | 是 | 第二步上传封面图后返回的 mediaId |
visible | int | 否 | 可见范围:0=所有人,1=私密,3=部分可见 |
visibleList | array | 否 | visible=3 时生效,指定可见的微信 wxid 列表 |
atUsers | array | 否 | 提到的好友 wxid 列表,对应"@谁" |
location | object | 否 | 位置信息,含 name、longitude、latitude |
videoData | string | 是(上传时) | base64 编码的视频文件内容 |
fileExt | string | 是(上传时) | 文件扩展名,如 mp4 |
视频文件规格约束(微信平台硬性限制,上传前务必核查):
| 项目 | 要求 |
|---|---|
| 格式 | MP4(H.264编码,AAC音频) |
| 时长 | 1秒 ~ 30秒(朋友圈短视频限制) |
| 文件大小 | 建议不超过 25MB |
| 分辨率 | 最大 1920×1080,最小 480×360 |
| 帧率 | 25fps 或 30fps |
| 封面图格式 | JPG 或 PNG,建议与视频同比例 |
五、ffmpeg 预处理:上传前的视频标准化
实际工程中,原始素材格式千差万别,直接上传极易报错。建议统一用 ffmpeg 转码:
bashffmpeg -i input.mov \
-vcodec libx264 -acodec aac \
-vf "scale=1280:720" \
-r 30 -b:v 2000k -b:a 128k \
-t 30 \
-movflags +faststart \
output.mp4
参数说明:
-vf "scale=1280:720":强制缩放至 720P,避免因超分辨率被拒;-t 30:截取前 30 秒,超长视频自动截断;-movflags +faststart:把 MP4 元数据移到文件头部,减少上传后微信解析耗时。
封面图提取可直接从输出的 MP4 截帧:
bashffmpeg -i output.mp4 -ss 0 -vframes 1 -q:v 2 cover.jpg
六、定时批量发送的工程实践
私域运营场景里,往往需要给多个微信账号在不同时间点发不同内容的视频朋友圈。结合 个人微信API 的多账号管理能力,可以这样设计调度系统:
- 素材预处理队列:用脚本批量转码,转码完成后上传至接口并记录 mediaId 入库;
- 发布任务调度:每个任务记录
appId(目标账号)、videoMediaId、coverMediaId、计划发送时间、文案; - 定时触发:cron 或任务队列(Celery、APScheduler 等)按时调用发布接口;
- 结果回写:根据接口返回的
ret字段记录成功/失败,失败时触发告警或重试。
这种架构下,100 个账号、每账号每天 3 条视频朋友圈的量级,单台普通服务器完全可以承载,主要瓶颈在于视频转码和上传带宽,而非接口并发。
对于需要更深度定制的场景——比如根据客户标签动态生成视频封面文字、或把视频朋友圈与私信跟进结合成完整触达链路——可以参考 微信二次开发 的更多能力组合方案。
七、常见错误与排查思路
错误一:ret: 400,视频格式不支持
多半是编码格式问题。按第五节的 ffmpeg 命令重新转码,重点确认 -vcodec libx264 -acodec aac 已生效(用 ffprobe output.mp4 验证)。
错误二:ret: 401,鉴权失败
检查请求头 VideosApi-token 是否拼写正确(区分大小写),以及 Token 是否已在 控制台 生成并处于有效状态。
错误三:ret: 4013,mediaId 已过期
视频/封面上传后,mediaId 有时效性。若上传和发布之间耗时较长(如处理队列积压),需在发布前重新上传,或在设计时把上传步骤紧贴发布步骤执行,避免中间插入耗时操作。
错误四:ret: 4031,账号未在线 / 设备离线
托管账号需处于登录在线状态。可通过接口查询账号在线状态,离线时触发重新登录流程。频繁掉线一般与网络环境有关,建议把 iPad 协议节点部署在稳定的大陆 IDC 而非家庭宽带。
错误五:发布成功但朋友圈不显示
少数情况是微信的内容审核机制延迟(通常几秒内自动放出);若长时间不显示,排查文案是否触发关键词过滤,或视频画面是否含违规内容。频繁发同一条视频也可能被微信识别为异常行为,建议对内容做差异化处理(比如添加随机水印、微调首帧截图)。
小结
微信发视频朋友圈接口的核心链路是"视频上传→封面上传→发布下发"三段式调用,每段都有参数约束和常见坑点。WechatApi 基于 iPad 协议实现了完整的支持,配合标准的 HTTP POST + JSON 调用范式,开发者可以在几百行代码内搭建起稳定的多账号视频朋友圈自动发布系统。如果你的业务场景还涉及群发、私信、好友管理等更多维度,欢迎查阅 微信API对接 文档,或直接前往控制台开通试用账号,从最小可行 Demo 跑起来再逐步扩展。
