7.9 KiB
7.9 KiB
多平台视频分发系统 — 优化迭代总结
更新时间: 2026-03-10
一、五平台最终技术方案
| 平台 | 方案一(优先) | 方案二(兜底) | 单条耗时 | 状态 |
|---|---|---|---|---|
| B站 | bilibili-api-python 纯 API | Playwright 可见浏览器 | ~8s | 已验证 |
| 抖音 | douyin_pure_api 纯 API(VOD分片) | — | ~15s | 已验证 |
| 快手 | Playwright Headless | — | ~20s | 已验证 |
| 视频号 | Playwright Headless | — | ~20s | 已验证 |
| 小红书 | Playwright Headless | — | ~25s | 已验证 |
方案选择逻辑
- 纯 API 可行 → 优先用 API:B站(bilibili-api-python 成熟稳定)、抖音(VOD 分片上传 + bd-ticket-guard)
- API 不可行 → Playwright Headless:快手(__NS_sig3 签名过于复杂)、视频号(无公开 API)、小红书(X-S/X-T 签名频繁变动)
- B站特殊:纯 API 优先,失败自动降级到可见浏览器
二、各平台遇到的问题与解决方案
B站
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 纯 API 403 Forbidden | WAF/反爬 | 放弃手动逆向,改用 bilibili-api-python 库 |
| Playwright GeeTest 验证码 | headless 触发极验 | 改用可见浏览器模式(headless=False) |
| bilibili-api-python 406 | 早期版本 bug | 升级到最新版,解决 preupload 问题 |
| VideoUploader cover 空路径报错 | cover="" 触发文件读取 | 用 ffmpeg 提取第一帧作为 cover 传入 |
| 最终方案 | — | 纯 API 7.9s 完成投稿(之前 80s+) |
快手
| 问题 | 原因 | 解决方案 |
|---|---|---|
"发布"按钮不是 <button> |
自定义 div 实现 | 用 div[class*="button-primary"] 选择器 |
| 发布按钮在页面底部不可见 | y=1287px 超出 viewport | scroll_into_view_if_needed() + scrollTo(bottom) |
| 草稿对话框阻挡 | "上次未发布的视频" | 检测并自动点击"放弃" |
| 未登录(storage_state 无效) | login 脚本检测不准 | 修复 login 检测:等待 cp.kuaishou.com 域 cookie |
| __NS_sig3 签名太复杂 | webpack + JSVMP 混淆 | 放弃纯 API,Playwright 方案已足够稳定 |
视频号
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 无公开上传 API | 微信封闭生态 | 直接用 Playwright Headless |
| "直接发表"按钮不可见 | 弹窗动画延迟 | force=True + JS 点击兜底 |
| 描述框不易定位 | contenteditable div 动态加载 | 点击"添加描述" → 定位 [contenteditable="true"]:visible |
| 原创声明弹窗 | 默认触发 | 检测并点击"直接发表" |
小红书
| 问题 | 原因 | 解决方案 |
|---|---|---|
| API 返回 HTML 而非 JSON | session cookie 机制变更 | 放弃纯 API,改 Playwright |
| "发布"按钮被 tooltip 拦截 | data-tippy-root 覆盖 | JS 清除 tooltip + force=True |
| 发布按钮 disabled 状态 | 标题/描述未正确填入 | 精确选择器 + 等待 disabled 消失 |
| 发布后不跳转 | 页面重置而非跳转 | 检测"拖拽视频到此"作为成功标志 |
| 标题截断 | 小红书标题限 20 字 | title[:20] 自动截断 |
抖音
| 问题 | 原因 | 解决方案 |
|---|---|---|
| a_bogus 签名 | JSVMP 虚拟机保护 | 已有 douyin_pure_api.py 解决 |
| Cookie 2-4h 过期 | 抖音 session 机制 | cookie_manager 定期检查 + 告警 |
| AWS4-HMAC-SHA256 | 文件上传需双层签名 | 已在 pure_api 中实现 |
三、本次优化内容
3.1 B站方案升级(最大改进)
旧方案: Playwright 可见浏览器 → 80s/条,需桌面环境
新方案: bilibili-api-python 纯 API → 8s/条,无需浏览器
性能提升: 10x
3.2 统一发布结果结构
新增 publish_result.py 模块,所有平台统一返回 PublishResult 数据结构:
@dataclass
class PublishResult:
platform: str # "B站" | "快手" | "视频号" | "小红书" | "抖音"
video_path: str
title: str
success: bool
status: str # "published" | "reviewing" | "failed" | "error"
message: str # 人类可读的结果描述
error_code: str # 机器可读的错误码(NOT_LOGGED_IN 等)
screenshot: str # 截图路径
content_url: str # 发布后的链接
elapsed_sec: float # 耗时
timestamp: str # ISO 时间戳
3.3 发布日志持久化
每次发布结果自动追加到 publish_log.json(JSON Lines 格式),支持:
- 历史查询
- 失败重试
- 统计分析
3.4 汇总表输出
========================================================================
发布结果汇总
========================================================================
[✓] B站 | 信任不是求来的 发三个月邮件拿下德… | reviewing
[✓] 快手 | 懒人也能赚钱?动作简单、有利可图… | published
[✓] 视频号 | 易经两小时学个七七八八… | reviewing
[✓] 小红书 | 后端花170万搭体系… | published
------------------------------------------------------------------------
成功: 4/4 | 耗时: 72.7s
========================================================================
四、各平台 API 可行性分析
| 平台 | 纯 API | 难度 | 稳定性 | 当前方案 | 升级可能 |
|---|---|---|---|---|---|
| B站 | 可行 | 低 | 高 | 已升级纯API | — |
| 抖音 | 可行 | 高 | 中 | 已有纯API | 维护 bd-ticket-guard |
| 快手 | 可行但难维护 | 高 | 低 | Playwright | __NS_sig3 变动太频繁 |
| 小红书 | 可行(官方开放API) | 中 | 中高 | Playwright | 可申请开发者资质 |
| 视频号 | 不可行 | — | — | Playwright | 微信未开放上传API |
五、文件结构
03_卡木(木)/木叶_视频内容/
├── 多平台分发/脚本/
│ ├── distribute_all.py # 一键多平台分发(入口)
│ ├── publish_result.py # 统一结果结构 + 日志
│ ├── cookie_manager.py # Cookie 管理(检查/加载/过期)
│ ├── video_utils.py # 封面提取 + 视频元数据
│ ├── publish_log.json # 发布历史日志(自动生成)
│ └── requirements.txt
├── B站发布/脚本/
│ ├── bilibili_publish.py # 纯API优先 + Playwright兜底
│ └── bilibili_login.py # 扫码登录
├── 快手发布/脚本/
│ ├── kuaishou_publish.py # Playwright Headless
│ └── kuaishou_login.py # 扫码登录
├── 视频号发布/脚本/
│ ├── channels_publish.py # Playwright Headless
│ └── channels_login.py # 微信扫码登录
├── 小红书发布/脚本/
│ ├── xiaohongshu_publish.py # Playwright Headless
│ └── xiaohongshu_login.py # 扫码/手机号登录
└── 抖音发布/脚本/
├── douyin_pure_api.py # 纯API(VOD分片上传)
└── douyin_login.py # Playwright扫码登录
六、使用方式
# 检查所有平台 Cookie 状态
python3 distribute_all.py --check
# 一键分发到所有已登录平台
python3 distribute_all.py
# 只分发到指定平台
python3 distribute_all.py --platforms B站 快手
# 分发单条视频
python3 distribute_all.py --video /path/to/video.mp4
# 自定义视频目录
python3 distribute_all.py --video-dir /path/to/videos/
七、后续优化方向
- 小红书官方 API:申请开发者资质后可升级为纯 API
- 定时发布:各平台支持设置发布时间(已有"定时发布"选项)
- 失败自动重试:基于 publish_log.json 的失败记录自动重试
- Cookie 过期预警:集成到飞书/微信通知
- 并行分发:不同平台间并行上传(当前为串行)