영상 게시 (Bilibili / YouTube / Douyin / Kuaishou / Xiaohongshu)
철칙
- 게시 전마다 플랫폼, 계정, 파일, 썸네일, 제목, 설명, 태그, 분류, 게시 방식을 표로 정리하여 사용자에게 보여주고, 사용자가 명시적으로 "게시"라고 말할 때만 실행합니다. 사용자는 한 번에 여러 개를 승인할 수 있습니다(예: "EP2–EP4 모두 게시"). 하지만 이는 당시 나열된 항목과 그 내용에만 적용됩니다. 내용이 변경되면 다시 확인해야 합니다.
- 로그인은 사용자만 직접 할 수 있습니다(터미널 QR 코드). 사용자 대신 계정, 비밀번호, 전화번호, 인증 코드를 입력하지 않으며, 쿠키 내용을 읽거나 출력하지 않습니다.
- Douyin, Kuaishou, Xiaohongshu의 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), 시리즈 이름.
Bilibili
도구: 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
로그인(사용자가 자신의 터미널에서 실행, 메뉴에서 'QR 코드 로그인' 선택, Bilibili App으로 QR 코드 스캔; QR 코드가 완전히 표시되지 않으면 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이 자동으로 속도를 테스트하도록 두지 마십시오. 프록시를 통과하면 멈출 수 있습니다. - 항목별 투고:
스크립트가 경로를 절대 경로로 변환합니다(내부적으로 social-auto-upload 디렉토리로 cd). 비디오 프로젝트 디렉토리에서 상대 경로로 호출하면 됩니다. 성공 시~/.claude/skills/video-publish/tools/bili_upload.sh <계정명> out/ep1.mp4 out/covers/ep1.jpg tx 231 "<제목>" "<설명>" "<태그,쉼표로 구분>"투고 성공 BVxxxx 링크출력, 실패 시 로그 끝부분 출력. 여러 편은 순서대로 하나씩 업로드하고, 각 편 업로드 완료 시 사용자에게 BV 번호를 알립니다. - 모든 업로드 완료 후 사용자에게 알림: 크리에이터 센터 '시리즈 관리'에서 시리즈를 만들고 순서대로 추가; 심사 통과 후에 공개됩니다.
네트워크 문제 해결:
- 업로드 매우 느림,
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가 있는지), 중복 투고 방지.
Bilibili: 투고 한도 및 분할
- 신규 원고는 하루 약 7개, 초과 시
21566 투고가 너무 빈번함반환, 다음 날까지 기다려야 함. 한 챕터를 하나의 분할 원고로 만듭니다(biliupupload로 여러 파일을 한 번에 전송, 파일명이 분할 제목이 됨, 하드 링크out/parts/P<k> <에피소드 제목>.mp4로 이름을 지정하여 공간 절약). - 기존 원고에 분할 추가:
biliup append --vid BV…, 신규 원고 할당량 소모 없음. - 태그 최대 12개, 초과 시 잘림. 회선은 먼저
probe_lines.sh;bldsa는 인증서 만료 문제 발생, 실패 시tx/bda2로 전환. - 큐 스크립트 예시:
tools/examples/upload_chapters.sh(21566 오류 시 매시간 재시도, 최대 24회; 성공 시- 결과: BV… P<k>를 upload_meta.md에 기록).
Bilibili: 기존 원고에 추가(시리즈 모음, 2026-10 ~ 11 지식 베이스에서 테스트 완료)
- 한 시리즈를 하나의 분할 원고로 만들고, 이후 각 편을
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): 회선 불안정, 스크립트가 자체적으로 재시도하므로 수동으로 재업로드하지 마십시오(분할 중복 발생).
- 멱등성: 성공 시
- 분할 제목은 파일명:
out/parts/P<k> <훅>:<주제>.mp4(out/epK.mp4에 하드 링크, 공간 차지 안 함). - append로는 설명을 변경할 수 없음: 각 배치에 대해 upload_meta.md에 "설명 보충" 한 단락을 작성하고, 보드에 "작성자에게" 노트로 추가하여 사용자가 크리에이터 센터에서 수동으로 기존 원고 설명 끝에 붙여넣도록 합니다.
- 다른 언어 버전(예: 영어 더빙판)은 중국어 원고에 추가하지 않으며, 게시 위치는 사용자가 결정합니다.
YouTube
- 도구: 동일한 sau (
sau youtube login/upload-video, 반드시--headed, 헤드리스 모드에서는 Google이 Studio 접속을 허용하지 않음). sau 기본 YouTube 업로더에는 두 가지 버그가 있으며, 수정 방법은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 동의 화면(외부, 테스트 사용자 추가), 웹 애플리케이션 인증 정보(콜백http://localhost:8080/oauth2callback). 심사를 통과하지 못한 프로젝트의 API 전송 비디오는 모두 비공개로 잠깁니다; 심사 양식 https://support.google.com/youtube/contact/yt_api_form 에서 공개 홈페이지, 개인정보 처리방침, 서비스 약관 필요 (GitHub Pages 사용 가능, 예시 cassieliang6709/video-uploader), 홈페이지/개인정보 페이지 스크린샷, OAuth 흐름 스크린샷, 아키텍처 다이어그램, 사용자 흐름 다이어그램, 전체 업로드 스크립트. 심사 전까지는 브라우저 자동화를 계속 사용합니다.
Douyin / Kuaishou / Xiaohongshu
도구: 동일한 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 <기존 시리즈명>]
- Douyin:
--thumbnail은 3:4 세로형, 추가로--thumbnail-landscape(4:3) 있음; 제목 30자 이내. - Kuaishou:
--thumbnail비율 자유; 스크립트는 처음 3개 태그만 입력, 가장 중요한 것을 앞에 배치. - Xiaohongshu: 제목 20자 이내;
--collection미지원. - 사용자가 실행 후 터미널 출력을 붙여넣으면 Claude가 성공 여부를 판단하고 링크를 upload_meta.md에 기록. 슬라이드 검증 코드는 사용자가 직접 처리.
- Douyin은 한 챕터를 전체 챕터 시리즈(각 편을
out/chapter.mp4로 합치고, 4:3 가로 썸네일)로 게시하는 것이 에피소드별 게시보다 관리에 좋음; 큐 스크립트 예시tools/examples/douyin_upload_all.sh(사용자가 자신의 터미널에서 실행, 로그인 확인은 GUI 모드 사용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의 "결과" 항목에 기록하고, 대화에 "에피소드 / 제목 / 링크" 표를 제시합니다.