Communitygithub.com

cassieliang6709/video-publish

완성된 영상을 Bilibili, YouTube, Douyin, Kuaishou, Xiaohongshu 등 자체 미디어 플랫폼에 업로드합니다. 제목, 설명, 태그, 썸네일을 준비하고 사용자 확인 후 업로드하여 BV 번호를 반환합니다.

video-publish란 무엇인가요?

이 스킬은 AI 에이전트가 완성된 영상 콘텐츠를 여러 자체 미디어 플랫폼(Bilibili 중심, YouTube/Douyin/Kuaishou/Xiaohongshu 보조)에 업로드할 수 있게 해줍니다. 사용자가 'Bilibili에 올려줘', 'YouTube에 올려줘', 'Douyin에 올려줘', 'Kuaishou에 올려줘', 'Xiaohongshu에 올려줘', '투고', '영상 게시' 등의 명령을 내릴 때 사용됩니다. 일반적으로 tech-explainer-video 스킬 이후에 사용됩니다. 이 스킬의 핵심 특징은 사용자 확인 중심의 안전한 게시 프로세스입니다. 각 업로드 전에 플랫폼, 계정, 파일, 썸네일, 제목, 설명, 태그, 분류, 게시 방식을 표로 정리하여 사용자에게 보여주고, 사용자가 명시적으로 '게시'를 허락할 때만 업로드를 실행합니다. Bilibili의 경우 social-auto-upload 도구(dreammis/social-auto-upload)를 사용하며, 업로드 전에 probe_lines.sh로 최적의 회선을 테스트합니다. 각 에피소드 업로드가 완료되면 BV 번호를 반환하고 upload_meta.md에 기록합니다. Douyin, Kuaishou, Xiaohongshu의 경우 브라우저 자동화(patchright, 자동화 흔적을 숨기는 브라우저)를 사용하지만, 에이전트는 준비된 명령어와 투고 정보만 제공하고 사용자가 직접 자신의 터미널에서 로그인 및 업로드 명령을 실행합니다. 또한 Slack 검증 코드는 사용자가 직접 처리해야 합니다. 배치 업로드 파이프라인(사용자의 명시적 승인 필요)과 자동 정리(업로드 완료 후 소스 파일 삭제) 기능을 지원합니다. 이 스킬은 AI 에이전트가 영상 콘텐츠를 관리하고 여러 플랫폼에 업로드하는 프로세스를 대폭 간소화하면서도, 각 단계에서 사용자 확인을 통해 실수나 중복 업로드를 방지합니다. 플랫폼별 제한 사항(예: Bilibili의 일일 업로드 한도, YouTube의 API 인증 요구사항, Douyin의 세로형 썸네일 필요성)을 사전에 처리하고, 문제 해결 가이드를 제공하여 안정적인 업로드를 보장합니다.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/cassieliang6709/video-skills/tree/HEAD/skills/video-publish

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

영상 게시 (Bilibili / YouTube / Douyin / Kuaishou / Xiaohongshu)

철칙

  • 게시 전마다 플랫폼, 계정, 파일, 썸네일, 제목, 설명, 태그, 분류, 게시 방식을 표로 정리하여 사용자에게 보여주고, 사용자가 명시적으로 "게시"라고 말할 때만 실행합니다. 사용자는 한 번에 여러 개를 승인할 수 있습니다(예: "EP2–EP4 모두 게시"). 하지만 이는 당시 나열된 항목과 그 내용에만 적용됩니다. 내용이 변경되면 다시 확인해야 합니다.
  • 로그인은 사용자만 직접 할 수 있습니다(터미널 QR 코드). 사용자 대신 계정, 비밀번호, 전화번호, 인증 코드를 입력하지 않으며, 쿠키 내용을 읽거나 출력하지 않습니다.
  • Douyin, Kuaishou, Xiaohongshu의 sau 업로드는 patchright(자동화 흔적을 숨기는 브라우저)를 기반으로 합니다. 사용자가 사용을 결정하지만, 사용자가 자신의 터미널에서 업로드 명령을 실행합니다: Claude는 완전한 명령어와 투고 정보를 준비하고, 이들 플랫폼의 login/upload를 직접 실행하지 않으며, 사용자 대신 슬라이드 검증 코드를 처리하지 않습니다.

준비

  1. 게시 전에 tech-explainer-video의 references/plotome-lessons.md 규정 준수 체크리스트를 검토합니다: "AI 생성 콘텐츠 포함" 체크(내레이션이 AI여도 체크), 음악 라이센스 및 저작자 표시를 설명에 포함, 실제 얼굴 및 상표 사용 금지.
  2. references/upload-meta-template.md에 따라 out/upload_meta.md를 작성합니다. 설명은 영상에서 실제로 다루는 내용만 작성하고, 앞에 "자습용 학습 노트."를 추가합니다(사용자 선호도).
  3. 썸네일: 1920×1080, 자막 없음; tech-explainer-video의 cover-epK composition으로 생성합니다.
  4. 사용자에게 검토를 요청하고(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 출력 확인.

업로드:

  1. 먼저 회선 테스트: tools/probe_lines.sh, 가장 빠른 회선 선택(일반적으로 tx 또는 bda2). biliup이 자동으로 속도를 테스트하도록 두지 마십시오. 프록시를 통과하면 멈출 수 있습니다.
  2. 항목별 투고:
    ~/.claude/skills/video-publish/tools/bili_upload.sh <계정명> out/ep1.mp4 out/covers/ep1.jpg tx 231 "<제목>" "<설명>" "<태그,쉼표로 구분>"
    
    스크립트가 경로를 절대 경로로 변환합니다(내부적으로 social-auto-upload 디렉토리로 cd). 비디오 프로젝트 디렉토리에서 상대 경로로 호출하면 됩니다. 성공 시 투고 성공 BVxxxx 링크 출력, 실패 시 로그 끝부분 출력. 여러 편은 순서대로 하나씩 업로드하고, 각 편 업로드 완료 시 사용자에게 BV 번호를 알립니다.
  3. 모든 업로드 완료 후 사용자에게 알림: 크리에이터 센터 '시리즈 관리'에서 시리즈를 만들고 순서대로 추가; 심사 통과 후에 공개됩니다.

네트워크 문제 해결:

  • 업로드 매우 느림, 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 투고가 너무 빈번함 반환, 다음 날까지 기다려야 함. 한 챕터를 하나의 분할 원고로 만듭니다(biliup upload로 여러 파일을 한 번에 전송, 파일명이 분할 제목이 됨, 하드 링크 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 승인). 이러한 승인은 사용자가 언급한 해당 시리즈에만 적용되며, 시리즈나 플랫폼이 변경되면 다시 질문해야 합니다. 승인 범위 내에서:

  1. 이 배치의 각 챕터 렌더링 완료 후, 해당 시리즈의 기존 upload_meta.md 형식에 따라 제목, 설명, 태그를 직접 작성(설명은 여전히 "자습용 학습 노트."로 시작하고, 영상에 있는 내용만 작성), 더 이상 사용자에게 개별적으로 보여주지 않음; 여전히 sau bilibili check로 로그인 확인, probe_lines.sh로 회선 선택.
  2. 챕터 순서, 에피소드 순서대로 업로드, 각 챕터 업로드 완료 시 대화에 "에피소드 / 제목 / 링크" 목록 표시, BV 번호를 upload_meta.md에 기록.
  3. BV 번호를 받은 에피소드만 삭제: out/epK.mp4, out/*.raw.mp4, out/check/, out/bundle/ (및 해당 프로젝트의 node_modules, 공유 심볼릭 링크는 유지). 소스 코드, 더빙, srt, 썸네일, upload_meta.md는 보존하여 나중에 재렌더링 가능. 업로드 실패한 에피소드는 절대 삭제하지 않음.
  4. 삭제 명령이 권한에 의해 차단되면 명령어를 그대로 사용자에게 전달하여 사용자가 직접 실행하도록 하고, 다른 방식으로 우회하지 않음.

정리

  • 완성본은 모든 대상 플랫폼에서 링크를 얻은 후에만 삭제; 삭제가 권한에 의해 차단되는 경우가 많으므로 스크립트로 작성하여 사용자에게 제공, 예시 tools/examples/cleanup_uploaded.sh (upload_meta.md에 결과가 있는 에피소드만 삭제, 반복 실행 가능).

기록

게시 완료 후 각 에피소드의 BV 번호를 out/upload_meta.md의 "결과" 항목에 기록하고, 대화에 "에피소드 / 제목 / 링크" 표를 제시합니다.

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

관련 스킬