影片發布(B 站 / YouTube / 抖音 / 快手 / 小紅書)
鐵律
- 每一條發布前,將平台、帳號、檔案、封面、標題、簡介、標籤、分區、發布方式列成表格給用戶,用戶明確說「發」才執行。 用戶可以一次批准多條(例如「EP2–EP4 都發」),但只涵蓋當時列出的那幾條和那些內容;內容有任何改動都要重新確認。
- 登入只能由用戶自己進行(終端掃碼)。不替用戶輸入帳號、密碼、手機號、驗證碼,不讀取或列印 cookie 內容。
- 抖音、快手、小紅書的 sau 上傳基於 patchright(隱藏自動化痕跡的瀏覽器)。用戶決定使用它,但由用戶在自己的終端裡執行上傳命令: Claude 負責準備好完整命令和投稿資訊,不自己執行這幾個平台的 login / upload,也不替用戶處理滑塊驗證碼。
準備
- 發布前先過一遍 tech-explainer-video 的
references/plotome-lessons.md合規清單:勾選「含 AI 生成內容」(旁白是 AI 也要勾)、音樂授權和署名寫進簡介、不使用真人臉和商標。 - 按照
references/upload-meta-template.md撰寫out/upload_meta.md。簡介只寫影片裡確實提到的內容,開頭加上「自用學習筆記。」(用戶偏好)。 - 封面:1920×1080、沒有字幕;由 tech-explainer-video 的
cover-epKcomposition 產生。 - 發送給用戶審閱(SendUserFile),問清楚:封面、是否需要程式碼連結(GitHub/Gist)、合集名稱。
B 站
工具:dreammis/social-auto-upload(安裝在 ~/tools/social-auto-upload),實際投稿使用它自動下載的 biliup。
首次安裝(先告知用戶來源、內容和大小,等用戶同意再裝):
git clone --depth 1 https://github.com/dreammis/social-auto-upload.git ~/tools/social-auto-upload
cd ~/tools/social-auto-upload && uv venv --python 3.12 && uv pip install -e . && uv pip install playwright
cp conf.example.py conf.py
登入(讓用戶在自己的終端裡執行,選單選擇「掃碼登入」,用 B 站 App 掃碼;二維碼顯示不全就打開 qrcode.png):
cd ~/tools/social-auto-upload && .venv/bin/sau bilibili login --account <帳號名>
不要選擇簡訊登入:它會要求處理滑塊驗證碼並手動抄寫 challenge,很容易過期失敗。
檢查登入:.venv/bin/sau bilibili check --account <帳號名>,輸出 valid 即可。
上傳:
- 先測試線路:
tools/probe_lines.sh,取速度最快的那條(通常 tx 或 bda2)。不要讓 biliup 自動測速,經過代理時會卡住。 - 逐條投稿:
腳本會將路徑轉成絕對路徑(它內部 cd 到 social-auto-upload),在影片專案目錄裡用相對路徑呼叫即可。 成功會列印「投稿成功 BVxxxx 連結」,失敗會列印日誌末尾。多集按順序一集一集傳,每傳完一集就告知用戶 BV 號。~/.claude/skills/video-publish/tools/bili_upload.sh <帳號名> out/ep1.mp4 out/covers/ep1.jpg tx 231 "<標題>" "<簡介>" "<標籤,逗號分隔>" - 全部傳完後提醒用戶:在創作中心「合集管理」建立合集並按順序加入;審核通過後才公開。
網路排障:
- 上傳極慢、
error sending request、connection reset、伺服器 500:多半是代理 TUN 把流量繞到了海外節點。 讓用戶在代理規則裡將DOMAIN-SUFFIX,bilibili.com,DIRECT、DOMAIN-SUFFIX,bilivideo.com,DIRECT放在靠前的位置,並重新載入設定; 再跑一次probe_lines.sh,速度達到每秒幾百 KB 以上再傳。 - 查看進度:
nettop -p <biliup pid> -L 1 -x -J bytes_out。biliup 日誌在傳完之前幾乎沒有輸出,不要因為沒日誌就判斷卡住。 - macOS 沒有
timeout命令。 - 首次執行 sau 下載 biliup 失敗(GitHub Release 存取慢):使用
https://gh-proxy.com/或https://gh-proxy.org/加在 release 位址前手動下載。 - 重傳前先確認上一次沒有投稿成功(日誌裡有沒有 bvid),避免重複投稿。
B 站:投稿上限與分 P
- 新建稿件每天約 7 個,超過會回傳
21566 投稿過於頻繁,要等第二天。一章打成一個分 P 稿件(biliupupload一次傳多個檔案,檔名就是分 P 標題,使用硬連結out/parts/P<k> <集標題>.mp4命名不佔空間)。 - 往已有稿件追加分 P 使用
biliup append --vid BV…,不佔新建額度。 - 標籤最多 12 個,超過則截斷。線路先
probe_lines.sh;bldsa出現過憑證過期,失敗請換tx/bda2。 - 佇列腳本範例:
tools/examples/upload_chapters.sh(21566 每小時重試,最多 24 次;成功將「- 結果:BV… P」寫回 upload_meta.md)。
B 站:追加到已有稿件(系列合集,2026-10 ~ 11 知識庫跑通)
- 一個系列一個分 P 稿件,之後每篇都使用
biliup append --vid BV…追加;不新建稿件(用戶明確不要新建時更不能建)。 - 佇列腳本範例
tools/examples/upload_append.sh:每篇一行app <名字> <BV> <專案目錄>,按順序追加out/parts/*.mp4。- 幂等:成功寫入
<名字> append <BV> <日期>到results.log,再次執行自動跳過(「已追加過」),所以新一批只要在末尾加行、整份重跑。 - 線路輪換 alia → tx → bda2,三條都失敗就休息 30 分鐘再來,最多 48 輪;成功判據是輸出裡有「稿件修改成功」。
- 使用
nohup <腳本> > upload_kbN.log 2>&1 & disown啟動,日誌按批編號;另起一個背景 until 迴圈等待日誌出現「佇列完成」。 - 常見失敗
client error (Connect):線路抖動,腳本會自己重試,不要手動重傳(會產生重複分 P)。
- 幂等:成功寫入
- 分 P 標題就是檔名:
out/parts/P<k> <鉤子>:<主題>.mp4(硬連結到out/epK.mp4,不佔空間)。 - append 無法修改簡介:每批在 upload_meta.md 寫一段「簡介補充」,再追加到看板裡一條「待作者」筆記,讓用戶在創作中心手動貼到原稿件簡介末尾。
- 不同語言的版本(如英文配音版)不要追加進中文稿件,發布到哪裡由用戶決定。
YouTube
- 工具:同一個 sau(
sau youtube login/upload-video,必須--headed,無頭模式 Google 不允許進入 Studio)。 sau 自帶的 YouTube 上傳器有兩個 bug,修復方式在tools/examples/sau-youtube-fixes.patch:登入檢查只等 3 秒且使用無頭(誤報 invalid);播放清單選擇器點錯(播放清單從未加上,且異常被吞)。新機器裝完 sau 後先套用此補丁。 - 播放清單要先在 Studio 建立好(否則
--playlist不生效);上傳後抽查一集是否進入清單,沒進就到 Studio 影片編輯頁補選。 - 單日有上傳上限:出現「找不到發布按鈕」、影片停在草稿,多半是到上限了。不要重傳(會留下重複草稿),到 Studio 把草稿補齊發布,剩下的第二天再傳。
- 佇列腳本範例:
tools/examples/youtube_queue.sh(長佇列使用nohup … & disown,連線階段背景任務會被回收)。 - API 方案(不開瀏覽器):youtubeuploader(
brew install youtubeuploader)+tools/examples/youtube_api_upload.sh。 前提:Google Cloud 專案啟用 YouTube Data API v3、OAuth 同意畫面(外部、加入測試用戶)、Web 應用程式憑證(回呼http://localhost:8080/oauth2callback)。 未通過審核的專案,API 上傳的影片一律鎖定為私人;審核表單 https://support.google.com/youtube/contact/yt_api_form 要求公開的首頁、隱私政策、服務條款 (可使用 GitHub Pages,範例 cassieliang6709/video-uploader)、首頁/隱私頁截圖、OAuth 流程截圖、架構圖、用戶流程圖、完整上傳腳本。審核前繼續使用瀏覽器自動化。
抖音 / 快手 / 小紅書
工具:同一個 social-auto-upload 的 sau douyin|kuaishou|xiaohongshu,瀏覽器自動化(patchright)。
命令由用戶在自己的終端裡執行(見鐵律),Claude 只準備命令、檢查結果。
影片:這三個平台以豎屏為主,建議 1080×1920 或剪成 1 分鐘左右的精華;需要的話回到 tech-explainer-video 另渲染豎版。 橫版也能傳,但會帶黑邊。
首次安裝瀏覽器(用戶執行):
cd ~/tools/social-auto-upload && PLAYWRIGHT_DOWNLOAD_HOST="https://npmmirror.com/mirrors/playwright" .venv/bin/patchright install chromium
登入與檢查(用戶執行,<平台> 是 douyin / kuaishou / xiaohongshu):
cd ~/tools/social-auto-upload && .venv/bin/sau <平台> login --account <帳號名> --headed
.venv/bin/sau <平台> check --account <帳號名>
上傳(Claude 按照 upload_meta.md 填好整條命令發送給用戶,用戶確認內容後自行執行):
cd ~/tools/social-auto-upload && .venv/bin/sau <平台> upload-video --account <帳號名> \
--file <mp4 絕對路徑> --title "<標題>" --desc "<正文>" --tags <標籤,逗號分隔> \
[--thumbnail <封面>] [--schedule "YYYY-MM-DD HH:MM"] [--collection <已存在的合集名>]
- 抖音:
--thumbnail需為 3:4 豎版,另有--thumbnail-landscape(4:3);標題不超過 30 字。 - 快手:
--thumbnail任意比例;腳本只填前 3 個標籤,最重要的放前面。 - 小紅書:標題不超過 20 字;不支援
--collection。 - 用戶跑完後將終端輸出貼回來,Claude 判斷是否成功、將連結寫回 upload_meta.md。出現滑塊驗證碼由用戶自己處理。
- 抖音一章發一個整章合集(各集拼成
out/chapter.mp4,4:3 橫版封面)比逐集發更好管理;佇列腳本範例tools/examples/douyin_upload_all.sh(用戶在自己終端執行,登入檢查使用有介面模式DOUYIN_COOKIE_AUTH_HEADLESS=false)。
備選(不想使用腳本時):在用戶已登入的 Chrome 裡打開創作者平台的發布頁,幫用戶選好檔案、填好標題和正文,停在發布按鈕前截圖,由用戶自己點擊「發布」。
批次流水線(僅當用戶明確授權)
用戶可以對一個系列給予長期授權:「渲染完一批 → 直接上傳 → 刪成片」(例如 nudgecode 演算法圖解,2026-10-24 授權)。 這種授權只涵蓋用戶說過的那個系列,換系列或換平台要重新詢問。授權範圍內:
- 這一批每章渲染完後,按照該系列已有的 upload_meta.md 格式自行撰寫標題、簡介、標籤(簡介仍以「自用學習筆記。」開頭,只寫影片裡有的內容),
不再逐條給用戶看;仍然先執行
sau bilibili check確認登入、probe_lines.sh選擇線路。 - 按照章、集順序上傳,每章傳完後在對話中列出「集 / 標題 / 連結」,BV 號寫回 upload_meta.md。
- 只有取得 BV 號的那一集才可以刪除:
out/epK.mp4、out/*.raw.mp4、out/check/、out/bundle/(以及該專案自己的 node_modules,共享的軟連結不動)。 保留原始碼、配音、srt、封面、upload_meta.md,以便日後重新渲染。上傳失敗的集一律不刪。 - 刪除命令被權限攔下時,將命令原樣交給用戶自行執行,不換其他方式繞過。
清理
- 成片要所有目標平台都取得連結才可刪除;刪除常被權限攔下,寫成腳本交給用戶執行,範例
tools/examples/cleanup_uploaded.sh(只刪除 upload_meta.md 裡有結果的集,可反覆執行)。
記錄
發布完成後將每集的 BV 號寫回 out/upload_meta.md 的「結果」欄位,並在對話中列出「集 / 標題 / 連結」表格。