把博客做成视频后,每次还要手动打开创作中心、拖文件、填标题标签、传封面——一套点下来比写文章还累。本文把这一步收敛成一条命令:biliup-rs 负责投稿,一个 50 行的包装脚本负责自动抽封面、填参数,最终接上「博客→幻灯片视频」的产线,做到 mp4 一出片就能投到 B 站。
先说结论:B 站、抖音、小红书三家里,只有 B 站能比较可靠地用脚本投稿,因为它的接口签名风控最弱、社区有成熟的开源投稿工具;抖音要企业资质,小红书签名风控最毒,这两家个人想脚本化基本是逆向 + 高封号风险。所以这条产线优先打通 B 站。
环境
| 项 | 值 |
|---|---|
| 系统 | macOS 26.5.1 (arm64 / Apple Silicon) |
| 投稿工具 | biliup-rs 0.2.4(Rust 单文件二进制,无运行时依赖) |
| 依赖 | ffmpeg(抽封面用,Homebrew) |
| cookie | 固定存 ~/.bilibili/cookies.json |
以下路径/账号均为占位,替换成你自己的即可。
一、为什么是 B 站:三家投稿 API 现状
| 平台 | 官方上传 API | 个人能否脚本化 | 现实路线 |
|---|---|---|---|
| B 站 | 不对外开放 | ✅ 可以 | 社区开源工具 biliup(Cookie 登录,签名弱、最成熟) |
| 抖音 | 有,但需企业资质 + 应用审核 | ⚠️ 难 | 有资质走官方 API;否则只能逆向 / 网页自动化,风控强 |
| 小红书 | 无公开发布 API | ❌ 不建议 | 仅能逆向 creator.xiaohongshu.com,签名(x-s/x-t)风控公认最毒,封号风险最高 |
结论很直接:想自动化,先从 B 站做起。下面全部针对 B 站。
二、安装 biliup-rs
biliup-rs 是 Rust 写的单文件二进制,GitHub Release 直接给了 macOS 的预编译包,不用装任何运行时。
# 1. 取最新 release 里 macOS arm64 的包名(x86 选 x86_64-macos)
curl -sL https://api.github.com/repos/biliup/biliup-rs/releases/latest \| grep browser_download_url | grep aarch64-macos# 2. 下载并解压
cd /tmp
curl -sL -o biliup.tar.xz \https://github.com/biliup/biliup-rs/releases/download/v0.2.4/biliupR-v0.2.4-aarch64-macos.tar.xz
tar -xf biliup.tar.xz# 3. 装到 ~/bin,去掉 macOS 隔离属性(否则 Gatekeeper 会拦)
mkdir -p ~/bin
mv biliupR-v0.2.4-aarch64-macos/biliup ~/bin/biliup
xattr -d com.apple.quarantine ~/bin/biliup 2>/dev/null || true
chmod +x ~/bin/biliup# 4. 验证
~/bin/biliup --version
# biliup-cli 0.2.4
坑:从网上下载的二进制带
com.apple.quarantine扩展属性,直接跑会被 Gatekeeper 拦("无法验证开发者")。xattr -d删掉这个属性即可,比去「系统设置→隐私与安全性」点「仍要打开」省事。
upload 子命令的关键参数(biliup upload --help):
--copyright 1-自制 2-转载 (默认 1)
--tid 投稿分区 (默认 171 = 知识·野生技术协会)
--title 标题(B站上限80字)
--tag 标签,逗号分隔
--desc 简介
--cover 封面图
--line 上传线路 bda2/ws/qn/bldsa/tx/...(默认自动测速选最快)
三、扫码登录(cookie 固定路径)
biliup 默认把登录态写到当前工作目录的 cookies.json——这会导致 cookie 散落在你碰巧所在的目录里,下次换目录就找不到。用全局 -u 把它钉死到一个固定路径:
mkdir -p ~/.bilibili && chmod 700 ~/.bilibili
~/bin/biliup -u ~/.bilibili/cookies.json login
终端会显示二维码 → 手机 B 站 App「扫一扫」→ 点确认登录(光扫不点确认不算)。成功后 ~/.bilibili/cookies.json 出现,之后所有投稿带 -u ~/.bilibili/cookies.json 即免登录。
我第一次登录时没带
-u,以为成功了,结果全盘都搜不到 cookie——其实是存到了别的 cwd。固定路径这一步别省。
四、一键投稿脚本
直接用 biliup upload 也能投,但每次手敲一长串参数、还要自己准备封面很烦。写个包装脚本 ~/bili_publish.sh,做三件事:校验登录态、没给封面就自动从视频抽一帧、拼参数投稿。
#!/usr/bin/env bash
# 用法: ~/bili_publish.sh <视频.mp4> --title "标题" --tag "标签1,标签2" \
# [--desc "简介"] [--tid 171] [--cover 封面.jpg] [--dry-run]
set -euo pipefail
BILIUP="$HOME/bin/biliup"
COOKIE="$HOME/.bilibili/cookies.json"
VIDEO=""; TITLE=""; TAG=""; DESC=""; TID="171"; COVER=""; COPYRIGHT="1"; DRYRUN="0"while [[ $# -gt 0 ]]; docase "$1" in--title) TITLE="$2"; shift 2;; --tag) TAG="$2"; shift 2;;--desc) DESC="$2"; shift 2;; --tid) TID="$2"; shift 2;;--cover) COVER="$2"; shift 2;; --copyright) COPYRIGHT="$2"; shift 2;;--dry-run) DRYRUN="1"; shift;; *) VIDEO="$1"; shift;;esac
done[[ -f "$VIDEO" ]] || { echo "✗ 视频不存在: $VIDEO" >&2; exit 1; }
[[ -n "$TITLE" ]] || { echo "✗ 必须给 --title" >&2; exit 1; }
[[ -f "$COOKIE" ]] || { echo "✗ 未登录,先: $BILIUP -u $COOKIE login" >&2; exit 1; }
TITLE="${TITLE:0:80}" # B站标题上限80字# 没给封面就自动抽视频第1秒一帧
TMP_COVER=""
if [[ -z "$COVER" ]]; thenTMP_COVER="$(mktemp -t bilicover).jpg"ffmpeg -y -ss 1 -i "$VIDEO" -frames:v 1 -q:v 2 "$TMP_COVER" >/dev/null 2>&1 \&& COVER="$TMP_COVER" && echo "• 自动封面: $COVER"
fi[[ "$DRYRUN" == "1" ]] && { echo "[dry-run] $TITLE / tid=$TID / tag=$TAG"; exit 0; }ARGS=( -u "$COOKIE" upload "$VIDEO" --title "$TITLE" --tid "$TID" --copyright "$COPYRIGHT" )
[[ -n "$TAG" ]] && ARGS+=( --tag "$TAG" )
[[ -n "$DESC" ]] && ARGS+=( --desc "$DESC" )
[[ -n "$COVER" ]] && ARGS+=( --cover "$COVER" )
"$BILIUP" "${ARGS[@]}"
[[ -n "$TMP_COVER" ]] && rm -f "$TMP_COVER"
chmod +x ~/bili_publish.sh
投一条:
~/bili_publish.sh ~/Downloads/片名.mp4 \--title "标题(≤80字,自动截断)" \--tag "运维,SRE,Kubernetes,监控" \--desc "一句话简介,可附原博客链接"
# 默认 tid=171(知识·野生技术协会)、copyright=1(自制)、自动抽帧封面
# 想先看参数不真投:加 --dry-run
几个设计点:
- 自动封面:
ffmpeg -ss 1 -frames:v 1抽视频第 1 秒一帧当封面,省去单独准备封面图;想用自定义封面就传--cover。 - 标题截断:B 站标题上限 80 字,脚本用
${TITLE:0:80}兜底,避免超长报错。 - 默认自制:
copyright=1,因为是自己博客内容改编的视频。
五、真机投稿 + 一个风控坑
真投时遇到一个值得记的现象。日志显示 cookie 校验通过、封面也成功传到了图床,但视频在 pre_upload 阶段被挡:
INFO biliup::uploader: user: bili_xxxxxxxx # cookie 有效
INFO biliup::uploader: https://archive.biliimg.com/bfs/archive/....jpg # 封面已上传
INFO biliup::uploader::line: ... 自动测速选最快线路
Error: Failed to pre_upload ... "code":601,"message":"您上传视频过快,请您稍作休息后再继续"
这是 B 站账号侧的临时频控(code 601),不是脚本问题——cookie 和封面都正常,只是视频上传被节流了。我这边观测到:触发的账号是默认用户名(形如 bili_数字)的较新账号;推测(待进一步验证)与账号较新、上传配额低,或短时间内多次测速探测有关。处理办法很简单:等几分钟冷却,再用同一条命令重投即可,不必改任何参数。
经验:新号/小号 B 站的投稿频控更严。批量投稿时不要密集发,两条之间留点间隔。
串联「博客 → 视频 → 投稿」
这条投稿脚本的上游,是把博客文章做成讲解视频的产线(幻灯片 + 神经 TTS 配音,本机用 Pillow 逐帧渲染 + ffmpeg 合成,产出 ~/Downloads/*.mp4)。两段拼起来就是完整链路:
博客正文 ──► 手编 slides.json ──► md2video 渲染 ──► 片名.mp4 ──► bili_publish.sh ──► B站审核
要说明的是:「博客→视频」这一段不是纯自动——把文章精编成幻灯片数据(每页要点、口语化旁白)这一步需要人工,质量全在这里,照搬 Markdown 念稿听感会很差。所以整条产线是「人工精编脚本 + 自动出片 + 自动投稿」,真正一键的是出片之后的投稿环节。
快速参考
安装(macOS arm64)
curl -sL -o /tmp/b.tar.xz https://github.com/biliup/biliup-rs/releases/download/v0.2.4/biliupR-v0.2.4-aarch64-macos.tar.xz
tar -xf /tmp/b.tar.xz -C /tmp && mkdir -p ~/bin && mv /tmp/biliupR-*/biliup ~/bin/
xattr -d com.apple.quarantine ~/bin/biliup 2>/dev/null; chmod +x ~/bin/biliup
登录(一次)
~/bin/biliup -u ~/.bilibili/cookies.json login # 手机B站App扫码+确认
投稿
~/bin/biliup -u ~/.bilibili/cookies.json upload 片名.mp4 \--title "标题" --tid 171 --tag "标签1,标签2" --desc "简介" --copyright 1
几条铁律
- 下载的二进制先
xattr -d com.apple.quarantine,否则 Gatekeeper 拦。 - 登录务必带
-u 固定路径,否则 cookie 写进当前目录、换目录就丢。 - 默认分区
tid=171=知识·野生技术协会;标题上限 80 字。 - 遇
code 601 上传过快= 账号临时频控,等几分钟重投,别改参数、别硬刷。 - 三家里只有 B 站适合脚本化;抖音要企业资质,小红书别上自动化。
