social-auto-upload 完全指南:从零开始玩转多平台自动化视频发布

6 阅读16分钟

项目地址:github.com/dreammis/so… 当前 Star:10000+,社群人数:2000+


一、为什么需要这个项目?

你是内容创作者吗?如果是,下面这个场景你一定不陌生:

剪好一条视频,要发抖音、发小红书、发B站、发快手……每个平台都要打开网页、点击上传、填写标题、加话题标签、设置发布时间——光这一套操作就要花掉半个小时以上。

social-auto-upload 就是为了解决这个问题而生的。它的核心思路是:用程序模拟浏览器操作,把这些重复、无聊、高频的上传动作全部自动化。

与那些"AI帮你看界面"的临时方案不同,它经过大量真实验证,稳定可靠,可以作为长期运行的基础设施。


二、项目全景一图

在深入细节前,先看一张整体架构图,建立全局认知:

┌─────────────────────────────────────────────────────────────────────┐
│                      social-auto-upload 架构全景                      │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│   ┌─────────────┐   ┌─────────────┐   ┌──────────────────────────┐ │
│   │  使用方式 1  │   │  使用方式 2  │   │       使用方式 3          │ │
│   │  SAU CLI    │   │  Python API │   │   AI Agent + Skill       │ │
│   │  命令行接口  │   │  直接调用    │   │  OpenClaw/Claude Code    │ │
│   └──────┬──────┘   └──────┬──────┘   └───────────┬──────────────┘ │
│          │                 │                       │                │
│          └─────────────────┴───────────────────────┘                │
│                                      │                              │
│                             ┌────────▼────────┐                     │
│                             │   sau_cli.py    │                     │
│                             │  (统一调度入口)   │                     │
│                             └────────┬────────┘                     │
│                                      │                              │
│              ┌───────────────────────┼───────────────────────────┐  │
│              │                       │                           │  │
│   ┌──────────▼──────────┐  ┌────────▼────────┐  ┌──────────────▼┐ │
│   │  uploader/ 核心模块  │  │  utils/ 工具集   │  │  conf.py 配置  │ │
│   ├─────────────────────┤  ├─────────────────┤  └───────────────┘ │
│   │  douyin_uploader    │  │ files_times.py  │                     │
│   │  xiaohongshu_upload │  │ constant.py     │                     │
│   │  ks_uploader        │  │ log.py          │                     │
│   │  bilibili_uploader  │  │ login_qrcode.py │                     │
│   │  tencent_uploader   │  └─────────────────┘                     │
│   │  tk_uploader        │                                          │
│   │  baijiahao_uploader │                                          │
│   └─────────────────────┘                                          │
│              │                                                      │
│              ▼                                                      │
│   ┌─────────────────────────────────────────────────────────────┐  │
│   │              Patchright(浏览器自动化引擎)                    │  │
│   │    ┌────────┐  ┌────────┐  ┌───────┐  ┌────────┐           │  │
│   │    │ 抖音   │  │ 小红书  │  │ 快手  │  │ B站    │  …        │  │
│   │    └────────┘  └────────┘  └───────┘  └────────┘           │  │
│   └─────────────────────────────────────────────────────────────┘  │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

三、功能支持矩阵

平台视频上传图文上传定时发布CLIAI Skill备注
抖音当前主线最完整
小红书浏览器自动化
快手浏览器自动化
Bilibili基于 biliup,自动安装
视频号对应 tencent_uploader
百家号浏览器自动化
TikTokChrome 版实现

四、安装指南

4.1 环境要求

  • Python 3.10 ~ 3.12(注意:不支持 3.13+)
  • 推荐使用 uv 管理虚拟环境(更快更稳)

4.2 安装步骤

方式一:使用 uv(推荐)

# 1. 克隆仓库
git clone https://github.com/dreammis/social-auto-upload.git
cd social-auto-upload

# 2. 用 uv 创建虚拟环境并安装依赖
uv sync

# 3. 安装 patchright 浏览器驱动
uv run patchright install chromium

# 4. 复制配置文件
cp conf.example.py conf.py

# 5. 验证安装
uv run sau --help

方式二:使用传统 pip

pip install -r requirements.txt
playwright install chromium
cp conf.example.py conf.py
python sau_cli.py --help

4.3 配置文件说明

复制 conf.example.pyconf.py,主要配置项如下:

from pathlib import Path

# 项目根目录(自动解析,一般不用改)
BASE_DIR = Path(__file__).parent.resolve()

# 小红书本地服务地址(只在小红书相关流程中使用)
XHS_SERVER = "http://127.0.0.1:11901"

# 可选:指定本地 Chrome 路径(留空则使用内置浏览器)
LOCAL_CHROME_PATH = ""  
# 示例:LOCAL_CHROME_PATH = "C:/Program Files/Google/Chrome/Application/chrome.exe"

# 是否默认无头模式(headless=True 表示后台运行,不弹出浏览器窗口)
LOCAL_CHROME_HEADLESS = True

# 调试模式
DEBUG_MODE = True

什么是无头模式?

有头模式(headed):浏览器窗口可见,适合调试
  ┌────────────────────┐
  │  🌐 Chrome 窗口    │  ← 你能看到浏览器在操作
  │  正在上传视频...    │
  └────────────────────┘

无头模式(headless):浏览器在后台静默运行
  [后台进程]  ← 没有窗口,但操作照常执行
  适合:服务器、定时任务、CI/CD

五、核心概念:账号管理机制

理解账号(Account)机制,是使用本项目的关键。

项目用 Cookie 文件 来维持登录状态,而不是保存明文账号密码。每次登录后,平台的登录凭据会以 JSON 文件的形式保存到 cookies/ 目录下。

cookies/
├── douyin_creator.json       # 抖音"creator"账号的 cookie
├── douyin_work.json          # 抖音"work"账号的 cookie
├── kuaishou_creator.json     # 快手账号
├── xiaohongshu_creator.json  # 小红书账号
└── bilibili_creator.json     # B站账号(格式略不同)

账号命名规则: {平台名}_{account_name}.json,其中 account_name 是你自己取的名字,可以是 creatormainwork 等任意字符串。同一台机器可以同时管理多个账号。


六、快速开始(3分钟上手)

第一步:登录账号

以抖音为例,执行以下命令后,会弹出(或生成)一个二维码,用手机扫码授权:

# 有头模式登录(会弹出浏览器,方便看到过程)
sau douyin login --account creator --headed

# 无头模式登录(会在当前目录生成 qrcode.png,扫码即可)
sau douyin login --account creator --headless

第二步:验证登录状态

sau douyin check --account creator
# 输出 "valid" 表示 cookie 有效,"invalid" 表示需要重新登录

第三步:上传视频

sau douyin upload-video \
  --account creator \
  --file ./videos/my_video.mp4 \
  --title "我的第一个自动上传视频 🎉" \
  --desc "这是视频简介" \
  --tags "自动化,Python,效率工具"

就这三步,一条视频就发出去了。


七、详细使用示例

7.1 简单示例:立即发布

场景: 你拍了一条日常视频,想马上发到多个平台。

# 发抖音
sau douyin upload-video --account creator \
  --file ./videos/daily.mp4 \
  --title "今天的日常 vlog" \
  --tags "日常,vlog,生活"

# 发小红书
sau xiaohongshu upload-video --account creator \
  --file ./videos/daily.mp4 \
  --title "今天的日常 vlog" \
  --desc "记录美好生活~" \
  --tags "日常,vlog,生活记录"

# 发快手
sau kuaishou upload-video --account creator \
  --file ./videos/daily.mp4 \
  --title "今天的日常 vlog" \
  --tags "日常,vlog"

7.2 简单示例:图文笔记(小红书风格)

# 发抖音图文
sau douyin upload-note --account creator \
  --images ./imgs/1.png ./imgs/2.png ./imgs/3.png \
  --title "今日穿搭分享" \
  --note "今天的穿搭灵感来自..." \
  --tags "穿搭,OOTD,时尚"

# 发小红书图文
sau xiaohongshu upload-note --account creator \
  --images ./imgs/1.png ./imgs/2.png ./imgs/3.png \
  --title "今日穿搭 ins风" \
  --note "分享一下今天的穿搭思路" \
  --tags "穿搭,小红书,时尚"

7.3 进阶示例:定时发布

定时发布的时间格式为 YYYY-MM-DD HH:MM,且必须晚于当前时间2小时以上

# 明天下午3点发布到B站(需要指定分区 tid)
sau bilibili upload-video --account creator \
  --file ./videos/tech_review.mp4 \
  --title "这款神器真的绝了!" \
  --desc "今天测评一款超好用的效率工具" \
  --tid 230 \
  --tags "科技,测评,效率" \
  --schedule "2026-04-24 15:00"

# 后天早上10点发布到抖音
sau douyin upload-video --account creator \
  --file ./videos/morning.mp4 \
  --title "晨间routine分享" \
  --tags "早起,生活方式,健康" \
  --schedule "2026-04-25 10:00"

7.4 进阶示例:批量定时发布(Python 脚本)

这是项目真正强大的地方——把 sau CLI 嵌入 Python 脚本,实现批量自动化调度。

# batch_upload.py
import subprocess
import sys
from pathlib import Path
from datetime import datetime, timedelta

def generate_schedule_times(video_count, start_day=1, hour=16):
    """生成从明天开始的定时发布时间列表"""
    now = datetime.now()
    times = []
    for i in range(video_count):
        day = now + timedelta(days=start_day + i)
        publish_time = day.replace(hour=hour, minute=0, second=0)
        times.append(publish_time)
    return times

def batch_upload_to_douyin(video_dir: str, account: str = "creator"):
    """扫描目录下所有 mp4,批量排期上传到抖音"""
    video_files = list(Path(video_dir).glob("*.mp4"))
    schedule_times = generate_schedule_times(len(video_files))
    
    for video, schedule in zip(video_files, schedule_times):
        # 约定:同名 .txt 文件存储标题和标签
        txt_file = video.with_suffix(".txt")
        if txt_file.exists():
            lines = txt_file.read_text(encoding="utf-8").strip().split("\n")
            title = lines[0]
            tags = lines[1].replace("#", "").split() if len(lines) > 1 else []
        else:
            title = video.stem
            tags = []
        
        schedule_str = schedule.strftime("%Y-%m-%d %H:%M")
        
        cmd = [
            sys.executable, "sau_cli.py",
            "douyin", "upload-video",
            "--account", account,
            "--file", str(video),
            "--title", title,
            "--tags", ",".join(tags),
            "--schedule", schedule_str,
        ]
        
        print(f"📤 上传:{video.name} → 定时发布:{schedule_str}")
        result = subprocess.run(cmd, check=True)
        print(f"✅ 已提交")

if __name__ == "__main__":
    batch_upload_to_douyin("./videos", account="creator")
videos/
├── 健身教程01.mp4
├── 健身教程01.txt   ← 内容:第一行标题,第二行 #话题1 #话题2
├── 健身教程02.mp4
└── 健身教程02.txt

7.5 高级示例:多平台一键分发

# multi_platform_publish.py
"""
高级场景:一个视频同时发布到抖音、快手、小红书、B站,
每个平台使用不同的定时策略。
"""
import asyncio
import subprocess
import sys
from datetime import datetime, timedelta
from pathlib import Path


PLATFORMS = [
    {
        "name": "douyin",
        "cmd": ["douyin", "upload-video"],
        "delay_hours": 0,   # 立刻发
    },
    {
        "name": "xiaohongshu",
        "cmd": ["xiaohongshu", "upload-video"],
        "delay_hours": 1,   # 1小时后
    },
    {
        "name": "kuaishou",
        "cmd": ["kuaishou", "upload-video"],
        "delay_hours": 2,   # 2小时后
    },
]

def publish_to_platform(platform_cfg, video_file, title, tags, account="creator"):
    """向单个平台发布视频"""
    platform = platform_cfg["name"]
    delay = platform_cfg["delay_hours"]
    
    # 计算发布时间
    if delay == 0:
        schedule_args = []  # 立即发布,不加 --schedule
    else:
        publish_time = datetime.now() + timedelta(hours=delay + 2)
        schedule_args = ["--schedule", publish_time.strftime("%Y-%m-%d %H:%M")]
    
    cmd = [
        sys.executable, "sau_cli.py",
        *platform_cfg["cmd"],
        "--account", account,
        "--file", str(video_file),
        "--title", title,
        "--tags", ",".join(tags),
        *schedule_args,
    ]
    
    try:
        subprocess.run(cmd, check=True, timeout=300)
        print(f"✅ [{platform}] 发布成功")
        return True
    except subprocess.CalledProcessError as e:
        print(f"❌ [{platform}] 发布失败:{e}")
        return False

def one_click_publish(video_path: str, title: str, tags: list, account="creator"):
    """一键多平台发布"""
    video_file = Path(video_path)
    print(f"\n🚀 开始一键发布:{video_file.name}")
    print(f"📝 标题:{title}")
    print(f"🏷️  标签:{tags}\n")
    
    results = {}
    for platform in PLATFORMS:
        print(f"📤 正在提交到 {platform['name']}...")
        success = publish_to_platform(platform, video_file, title, tags, account)
        results[platform["name"]] = success
    
    print("\n📊 发布汇总:")
    for platform, success in results.items():
        status = "✅ 成功" if success else "❌ 失败"
        print(f"  {platform}: {status}")

if __name__ == "__main__":
    one_click_publish(
        video_path="./videos/my_content.mp4",
        title="分享一个让效率翻倍的工具",
        tags=["效率工具", "Python", "自动化", "程序员"],
        account="creator"
    )

7.6 高级示例:直接调用 Python API

对于需要更精细控制的场景(比如集成到自己的系统),可以直接调用 uploader 的 Python API:

# 直接调用抖音 uploader API
import asyncio
from datetime import datetime
from pathlib import Path
from conf import BASE_DIR
from uploader.douyin_uploader.main import (
    DOUYIN_PUBLISH_STRATEGY_SCHEDULED,
    DouYinVideo,
    DouYinNote,
    douyin_setup,
)

async def upload_with_cover():
    """上传带自定义封面的视频"""
    account_file = Path(BASE_DIR) / "cookies" / "douyin_creator.json"
    
    # 检查 cookie 状态
    is_ready = await douyin_setup(str(account_file), handle=False)
    if not is_ready:
        raise RuntimeError("Cookie 已过期,请先重新登录")
    
    app = DouYinVideo(
        title="Python 自动化上传演示",
        file_path=str(Path(BASE_DIR) / "videos/demo.mp4"),
        tags=["Python", "自动化", "效率"],
        publish_date=datetime.strptime("2026-04-25 12:00", "%Y-%m-%d %H:%M"),
        account_file=str(account_file),
        desc="这是一条自动上传的视频,展示了 social-auto-upload 的能力",
        # 设置自定义封面(竖版)
        thumbnail_portrait_path=str(Path(BASE_DIR) / "videos/cover.png"),
        publish_strategy=DOUYIN_PUBLISH_STRATEGY_SCHEDULED,
        headless=True,  # 无头模式
        debug=False,    # 关闭调试输出
    )
    
    await app.douyin_upload_video()
    print("✅ 视频上传完成!")

asyncio.run(upload_with_cover())
# 发布小红书图文(多图)
import asyncio
from pathlib import Path
from conf import BASE_DIR
from uploader.xiaohongshu_uploader.main import (
    XIAOHONGSHU_PUBLISH_STRATEGY_IMMEDIATE,
    XiaoHongShuNote,
)

async def upload_xhs_note():
    account_file = Path(BASE_DIR) / "cookies" / "xiaohongshu_creator.json"
    
    app = XiaoHongShuNote(
        image_paths=[
            str(Path(BASE_DIR) / "imgs/photo1.jpg"),
            str(Path(BASE_DIR) / "imgs/photo2.jpg"),
            str(Path(BASE_DIR) / "imgs/photo3.jpg"),
        ],
        title="周末好去处推荐 🌿",
        desc="今天去了一个超美的地方...",
        note="详细的图文内容正文",
        tags=["周末打卡", "城市探店", "生活方式"],
        publish_date=0,  # 0 表示立即发布
        account_file=str(account_file),
        publish_strategy=XIAOHONGSHU_PUBLISH_STRATEGY_IMMEDIATE,
        headless=True,
    )
    
    await app.main()

asyncio.run(upload_xhs_note())

八、核心模块深度解析

8.1 目录结构总览

social-auto-upload/
├── sau_cli.py           # 🎯 CLI 统一入口,所有 sau 命令由此分发
├── conf.py              # ⚙️  全局配置(从 conf.example.py 复制)
├── pyproject.toml       # 📦 项目元数据与依赖声明
│
├── uploader/            # 🔧 各平台上传器核心模块
│   ├── base_video.py    #    基类:文件校验、时间校验等公共逻辑
│   ├── douyin_uploader/ #    抖音上传器
│   ├── xiaohongshu_uploader/ # 小红书上传器(重构版)
│   ├── ks_uploader/     #    快手上传器
│   ├── bilibili_uploader/    # B站上传器(基于 biliup)
│   ├── tencent_uploader/     # 视频号上传器
│   ├── tk_uploader/     #    TikTok 上传器
│   └── baijiahao_uploader/   # 百家号上传器
│
├── utils/               # 🛠️ 工具函数集
│   ├── files_times.py   #    文件扫描、定时排期生成
│   ├── constant.py      #    平台分区常量(B站分区ID等)
│   ├── log.py           #    日志配置
│   └── login_qrcode.py  #    二维码生成与显示
│
├── skills/              # 🤖 AI Agent 技能描述文件
│   ├── douyin-upload/   #    抖音 skill
│   ├── xiaohongshu-upload/   # 小红书 skill
│   ├── kuaishou-upload/ #    快手 skill
│   └── bilibili-upload/ #    B站 skill
│
├── examples/            # 📚 示例脚本
├── cookies/             # 🔐 账号 cookie 存储目录(自动生成)
├── videos/              # 📹 视频文件目录(示例)
│
├── sau_backend.py       # 🌐 Flask Web 后端(历史版本)
├── sau_frontend/        # 🖥️ Vue.js 前端(历史版本)
└── Dockerfile           # 🐳 Docker 部署文件

8.2 BaseVideoUploader:所有上传器的基石

这是一个基类,定义了所有平台上传器共享的校验逻辑:

BaseVideoUploader
├── SUPPORTED_VIDEO_EXTENSIONS  (.mp4, .mov, .avi, .mkv, .m4v, .webm, .flv, .wmv)
├── SUPPORTED_IMAGE_EXTENSIONS  (.jpg, .jpeg, .png, .webp, .bmp)
├── MIN_SCHEDULE_LEAD_TIME      (至少提前 2 小时)
│
├── validate_video_file(path)   → Path   # 校验视频文件格式与存在性
├── validate_image_file(path)   → Path   # 校验图片文件格式与存在性
└── validate_publish_date(date) → datetime|int  # 校验定时时间合法性

8.3 登录流程图解

用户执行:sau douyin login --account creator
          │
          ▼
   ┌──────────────────────┐
   │  douyin_setup() 函数  │
   │  解析账号文件路径      │
   └──────────┬───────────┘
              │
              ▼
   ┌──────────────────────┐
   │  启动 Patchright      │
   │  打开抖音创作者平台    │
   └──────────┬───────────┘
              │
              ▼
   ┌──────────────────────┐
   │  检测是否需要登录     │
   │  (已登录则跳过)     │
   └──────────┬───────────┘
              │ 需要登录
              ▼
   ┌──────────────────────┐
   │  生成二维码           │
   │  ① 打印到终端        │
   │  ② 保存为 qrcode.png │
   └──────────┬───────────┘
              │
              ▼
   ┌──────────────────────┐
   │  等待用户扫码授权     │ ← 用手机扫码
   └──────────┬───────────┘
              │ 扫码成功
              ▼
   ┌──────────────────────┐
   │  提取并保存 Cookie   │
   │  → cookies/douyin_creator.json
   └──────────────────────┘

8.4 上传视频流程图解

用户执行:sau douyin upload-video --account creator --file video.mp4 ...
          │
          ▼
   ┌────────────────────────┐
   │  CLI 解析参数           │
   │  DouyinVideoUploadRequest 数据结构
   └──────────┬─────────────┘
              │
              ▼
   ┌────────────────────────┐
   │  校验阶段               │
   │  ✓ 视频文件存在?       │
   │  ✓ 格式支持?          │
   │  ✓ Cookie 有效?       │
   └──────────┬─────────────┘
              │ 全部通过
              ▼
   ┌────────────────────────┐
   │  启动无头浏览器          │
   │  打开抖音创作平台        │
   └──────────┬─────────────┘
              │
              ▼
   ┌────────────────────────┐
   │  浏览器自动操作序列      │
   │  1. 进入上传页面        │
   │  2. 选择视频文件        │
   │  3. 等待上传进度        │
   │  4. 填写标题            │
   │  5. 填写描述/标签       │
   │  6. 设置定时(如有)    │
   │  7. 设置封面(如有)    │
   │  8. 点击发布            │
   └──────────┬─────────────┘
              │
              ▼
   ┌────────────────────────┐
   │  上传完成,返回结果     │
   └────────────────────────┘

九、Bilibili 特殊说明

B站的上传方式与其他平台不同,它基于开源项目 biliup 进行封装,走的是 API 接口而非浏览器模拟,因此更加稳定。

首次使用会自动安装 biliup:

# 首次执行会自动下载 biliup 可执行文件
sau bilibili login --account creator

# 扫码方式:如果终端二维码显示不完整,打开当前目录的 qrcode.png 扫码

B站视频分区 ID 查询:

from utils.constant import VideoZoneTypes

# 常用分区示例
VideoZoneTypes.KNOWLEDGE_COMPUTER_TECH  # 计算机技术 → 231
VideoZoneTypes.SPORTS_FOOTBALL          # 足球 → 249
VideoZoneTypes.LIFE_DAILY               # 日常 → 21
VideoZoneTypes.TECH_APPLICATION         # 软件应用 → 230

# CLI 使用时直接填数字
sau bilibili upload-video --tid 231 ...

十、files_times 工具:排期神器

utils/files_times.py 是一个高频使用的工具模块,提供了视频排期相关的核心函数。

generate_schedule_time_next_day

from utils.files_times import generate_schedule_time_next_day

# 场景:有 6 个视频,每天发 2 个,发布时间为每天 10:00 和 16:00
schedule = generate_schedule_time_next_day(
    total_videos=6,
    videos_per_day=2,
    daily_times=[10, 16],
    start_days=0,  # 从明天开始
)

# 结果示例:
# [2026-04-24 10:00, 2026-04-24 16:00,
#  2026-04-25 10:00, 2026-04-25 16:00,
#  2026-04-26 10:00, 2026-04-26 16:00]

参数说明:

参数说明默认值
total_videos总视频数量必填
videos_per_day每天发几条1
daily_times每天发布的小时数列表[6, 11, 14, 16, 22]
timestamps是否返回时间戳(而非 datetime)False
start_days从几天后开始0(从明天)

get_title_and_hashtags

约定视频同目录下有同名 .txt 文件,第一行是标题,第二行是话题标签:

videos/
├── 跑步日记ep01.mp4
└── 跑步日记ep01.txt  ← 内容如下:
    从零开始的跑步计划 第1期
    #跑步 #健身 #打卡
from utils.files_times import get_title_and_hashtags

title, tags = get_title_and_hashtags("videos/跑步日记ep01.mp4")
# title = "从零开始的跑步计划 第1期"
# tags  = ["跑步", "健身", "打卡"]

十一、AI Agent 集成(进阶)

这是项目近期的一大亮点:通过 skills/ 目录下的 Skill 描述文件,可以把本项目接入 OpenClaw、Codex、Claude Code 等 AI Agent 工具,让 AI 帮你自动完成上传任务。

Skill 工作原理

AI Agent(如 Claude Code)
        │
        │ 读取
        ▼
skills/douyin-upload/SKILL.md    ← Skill 描述文件
        │
        │ 解析后知道如何调用
        ▼
sau douyin upload-video --account ...  ← Agent 自动生成并执行命令
        │
        ▼
视频发布成功

向 Agent 传递启动提示

当你把仓库交给 AI Agent 时,配合官方的 Agent Bootstrap Prompt(见仓库文档),Agent 会自动:

  1. 按主线安装项目(优先 uvsau CLI)
  2. 验证抖音、B站、快手、小红书四个平台入口
  3. 根据 Skill 文件调用对应命令

十二、Docker 部署

项目提供了完整的 Dockerfile,适合服务器端部署:

# 构建镜像
docker build -t social-auto-upload .

# 运行(挂载 cookies 和 videos 目录到容器外便于持久化)
docker run -d \
  -p 5409:5409 \
  -v $(pwd)/cookies:/app/cookiesFile \
  -v $(pwd)/videos:/app/videoFile \
  social-auto-upload

Docker 镜像包含:

  • Python 3.10 + 所有依赖
  • Vue.js 前端构建产物
  • Chromium 无头浏览器
  • Flask Web 后端(历史版 Web UI)

注意:Docker 版对应的是历史 Web 版本,当前主线更推荐直接使用 CLI。


十三、常见问题与排坑

Q: Cookie 频繁失效怎么办?

大多数平台的 Cookie 有效期在 7~30 天不等。可以定期跑一个 cron 任务检查:

# 每天检查一次 cookie 状态
0 9 * * * sau douyin check --account creator || sau douyin login --account creator

Q: 上传卡住不动?

  • 检查网络连接
  • 尝试切换到有头模式(--headed)观察浏览器的实际行为
  • 视频文件大于 500MB 时上传时间会较长,注意超时设置

Q: 提示"不支持的视频格式"?

当前支持:.mp4, .mov, .avi, .mkv, .m4v, .webm, .flv, .wmv。将视频转码为 MP4(H.264)是最保险的选择。

Q: 定时发布报错"时间必须大于当前时间2小时"?

这是 BaseVideoUploader 内置的保护逻辑,平台本身也有最短提前时间的限制。确保 --schedule 的时间至少比当前时间晚 2 小时:

from datetime import datetime, timedelta

# 计算一个安全的定时发布时间:当前时间 + 3 小时
safe_time = datetime.now() + timedelta(hours=3)
schedule_str = safe_time.strftime("%Y-%m-%d %H:%M")
print(f"安全的定时时间:{schedule_str}")

Q: B站登录时二维码显示不完整?

终端对特殊字符的支持有限,项目会同时在当前目录生成 qrcode.png,直接用手机扫这张图片即可。

Q: 如何管理多个账号(比如公司号 + 个人号)?

只需使用不同的 account_name

# 登录公司号
sau douyin login --account company

# 登录个人号
sau douyin login --account personal

# 分别发布
sau douyin upload-video --account company --file ./company_video.mp4 --title "品牌推广" ...
sau douyin upload-video --account personal --file ./personal_video.mp4 --title "个人分享" ...

对应生成的 Cookie 文件:

cookies/
├── douyin_company.json
└── douyin_personal.json

Q: 小红书上传视频卡在"等待"状态?

项目已在最新版本(2026.04.08)修复了这个问题,将原来的精准定点等待改为全局模糊识别和多信号状态检测。确保使用最新代码:

git pull origin main

十四、项目演进路线图

理解项目的历史和未来方向,有助于做技术选型。

时间线

├── 2023.12  项目创建(个人工具)
            单纯用 Playwright 模拟浏览器

├── 2024     功能扩展
            新增多平台支持
            增加 Web UI(Flask + Vue.js)

├── 2025.11  增加 Docker 支持

├── 2026.03  主线重构开始 
            ├── 迁移到 Patchright(更隐蔽更稳定)
            ├── 统一 CLI 接口(sau 命令)
            ├── 推进无头模式
            ├── 抖音快手小红书B站 全部接入 CLI
            └── 引入 AI Agent Skill 体系

└── 未来计划
             ├── 视频号百家号TikTok 接入 CLI
             ├── 补齐图文上传能力
             └── 更多 Agent 平台 Skill 上架

历史 Web 版 vs 当前 CLI 版:

维度历史 Web 版当前 CLI 版(主线)
使用方式浏览器 Web UI命令行 / Python API
适合场景图形化操作服务器、自动化、Agent
维护状态保留但不主线主线持续更新
AI 集成✅ Skill 体系
无头模式部分支持全面支持

十五、完整工作流总结图

┌────────────────────────────────────────────────────────────────────┐
│                      完整工作流                                      │
└────────────────────────────────────────────────────────────────────┘

 第一次使用
 ──────────
  1. git clone + uv sync
  2. cp conf.example.py conf.py
  3. uv run patchright install chromium
  4. sau {平台} login --account {name}  ← 扫码登录,保存 Cookie
  5. sau {平台} check --account {name}  ← 验证 Cookie 有效

 日常使用
 ──────────
  ┌────────────────────────────────────────────┐
  │  准备内容                                   │
  │  video.mp4  +  video.txt(标题+标签)       │
  └───────────────────────┬────────────────────┘
                          │
                          ▼
  ┌────────────────────────────────────────────┐
  │  发布方式选择                                │
  │                                            │
  │  ① 立即发布                                 │
  │     sau douyin upload-video --file ...     │
  │                                            │
  │  ② 定时发布                                 │
  │     sau douyin upload-video --schedule ... │
  │                                            │
  │  ③ 批量排期(Python 脚本)                  │
  │     python batch_upload.py                 │
  │                                            │
  │  ④ AI Agent 全自动                          │
  │     将仓库 + Skill 交给 Agent 执行          │
  └───────────────────────┬────────────────────┘
                          │
                          ▼
  ┌────────────────────────────────────────────┐
  │  多平台同步发布                              │
  │  抖音 ✅  小红书 ✅  快手 ✅  B站 ✅         │
  └────────────────────────────────────────────┘

十六、参考资源