当前位置: 首页 > news >正文

macOS 命令行自动投稿 B 站:biliup-rs 安装 + 一键投稿脚本

把博客做成视频后,每次还要手动打开创作中心、拖文件、填标题标签、传封面——一套点下来比写文章还累。本文把这一步收敛成一条命令: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 站适合脚本化;抖音要企业资质,小红书别上自动化。
http://www.rkmt.cn/news/1488599.html

相关文章:

  • 国产MCU替代实战:华大HC32F460串口DMA+超时中断,如何搞定不定长数据帧?
  • RTL8153B-VB-CG、集成 LDO / 开关稳压器,支持 EEE 节能与双唤醒功能的网口 IC
  • JAVA算法刷题---DAY2 牛牛的快递、最小花费爬楼梯、数组中两个字符串的最小距离
  • 航空危险品运输全流程智能监管平台技术方案
  • 亚马逊团队“最优快递员“:把一个臃肿的AI大脑变成高效专家小组
  • 告别HC-05!用ESP32内置蓝牙实现主从机通信,成本直降且更灵活
  • 朗禾品牌设计,深耕餐饮VI与空间设计,以专业实力赋能品牌成长 - TOP10品牌推荐榜单
  • Windows右键菜单管理架构解析:ContextMenuManager的核心技术与实现方案
  • KeSpeech:革新方言语音识别的分布式智能数据平台
  • 咸阳樱花热水器燃气灶售后维修电话|快速上门 - GrowthUME
  • 别再每次烧录了!用STM32F4内部Flash保存PID参数,一个完整工程示例
  • 马口铁盒定制厂家观察:东莞市万鑫隆制罐有限公司的业务纵深与认证体系 - 变量人生001
  • 3步构建嵌入式温度控制核心:从PID算法到工业级实现
  • 在职读EMBA怎么选?业内靠谱机构深度解析 - 品牌测评鉴赏家
  • 2026年6月无锡装修公司推荐:避坑攻略与五家靠谱企业实操评测 - 资讯速览
  • Streamlit搭建中文文本摘要Web应用实战
  • 在业务一线,AI能解决哪些实际问题?
  • 3分钟解锁你的加密音乐:浏览器中的音乐自由革命
  • 专业级AMD Ryzen硬件调试实战:SMUDebugTool深度使用指南
  • 5分钟掌握电子课本下载终极方案:智能解析国家中小学智慧教育平台教材
  • macOS百度网盘限速破解:免费解锁70倍全速下载的技术探索
  • 不想买一堆真机,有没有远程就能操作各种手机的测试工具?推荐优测云真机平台
  • 从设计到生产:用AD导出Gerber、钻孔、坐标及BOM文件的完整SOP(含IPC网表)
  • 【动态规划】粉刷房子
  • 嵌入式显示入门:12864液晶驱动芯片全解析与实战指南
  • 从FIFO设计到通信协议:深入理解格雷码在Verilog中的三种实战应用
  • 江诗丹顿闲置怎么处理?2026石家庄回收市场实测报告 - 奢侈品回收测评
  • 从LM324芯片内部电路出发,拆解集成运放的‘三级架构’设计哲学
  • 告别CLI手敲:用Python和ncclient库批量管理H3C交换机(附完整代码)
  • Zabbix监控华为交换机避坑指南:SNMPv2团体名、端口与Trap配置那些事儿