项目地址: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站 │ … │ │
│ │ └────────┘ └────────┘ └───────┘ └────────┘ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
三、功能支持矩阵
| 平台 | 视频上传 | 图文上传 | 定时发布 | CLI | AI Skill | 备注 |
|---|---|---|---|---|---|---|
| 抖音 | ✅ | ✅ | ✅ | ✅ | ✅ | 当前主线最完整 |
| 小红书 | ✅ | ✅ | ✅ | ✅ | ✅ | 浏览器自动化 |
| 快手 | ✅ | ✅ | ✅ | ✅ | ✅ | 浏览器自动化 |
| Bilibili | ✅ | ❌ | ✅ | ✅ | ✅ | 基于 biliup,自动安装 |
| 视频号 | ✅ | ❌ | ✅ | ❌ | ❌ | 对应 tencent_uploader |
| 百家号 | ✅ | ❌ | ✅ | ❌ | ❌ | 浏览器自动化 |
| TikTok | ✅ | ❌ | ✅ | ❌ | ❌ | Chrome 版实现 |
四、安装指南
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.py 为 conf.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 是你自己取的名字,可以是 creator、main、work 等任意字符串。同一台机器可以同时管理多个账号。
六、快速开始(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 会自动:
- 按主线安装项目(优先
uv、sauCLI) - 验证抖音、B站、快手、小红书四个平台入口
- 根据 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站 ✅ │
└────────────────────────────────────────────┘
十六、参考资源
- 项目仓库:github.com/dreammis/so…
- 官方文档:sap-doc.nasdaddy.com
- 关注公众号:后台回复
上传获取加群方式,2000+ 人的交流社群 - biliup 项目(B站上传底层依赖):github.com/biliup/bili…
- patchright(浏览器自动化引擎):Playwright 的隐身增强版,降低平台检测风险