Communitygithub.com

cassieliang6709/video-publish

Publica vídeos prontos em plataformas de mídia social (principalmente Bilibili, com suporte para YouTube, Douyin, Kuaishou, Xiaohongshu): prepara título, descrição, tags e capa, confirma item por item com o usuário antes do upload, e retorna o número BV.

O que é video-publish?

Esta skill automatiza o processo de publicação de vídeos em múltiplas plataformas de mídia social, com foco principal na Bilibili (B站) e suporte para YouTube, Douyin, Kuaishou e Xiaohongshu. Ela é projetada para ser usada após a geração do vídeo (por exemplo, pela skill 'tech-explainer-video'), preparando metadados como título, descrição, tags, capa e, em seguida, apresentando-os ao usuário para aprovação antes de enviar. A skill garante a conformidade com as diretrizes da plataforma, incluindo a declaração de conteúdo gerado por IA e a atribuição de música. Para plataformas como Bilibili, ela oferece upload em lote, gerenciamento de coleções (séries) e tratamento de erros de rede. Para Douyin, Kuaishou e Xiaohongshu, ela prepara comandos que o usuário executa em seu terminal, usando automação de navegador com detecção de automação oculta (patchright). A skill também possui um modo de pipeline em lote para séries autorizadas, onde pode fazer upload automaticamente e limpar os arquivos de vídeo originais, registrando os resultados (como números BV) de volta no arquivo de metadados.

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

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Publicação de Vídeo (Bilibili / YouTube / Douyin / Kuaishou / Xiaohongshu)

Regras de Ferro

  • Antes de cada publicação, apresente ao usuário uma tabela com: plataforma, conta, arquivo, capa, título, descrição, tags, categoria e método de publicação. Só execute quando o usuário disser explicitamente "publicar". O usuário pode aprovar várias postagens de uma vez (ex.: "publique EP2–EP4"), mas isso cobre apenas as postagens e conteúdos listados naquele momento; qualquer alteração no conteúdo requer nova confirmação.
  • O login só pode ser feito pelo próprio usuário (escaneamento de QR code no terminal). Não insira contas, senhas, números de telefone ou códigos de verificação para o usuário, e não leia ou imprima o conteúdo dos cookies.
  • O upload para Douyin, Kuaishou e Xiaohongshu é baseado em patchright (navegador que oculta vestígios de automação). O usuário decide se usa, mas o comando de upload deve ser executado pelo usuário em seu próprio terminal: O Claude prepara o comando completo e as informações de postagem, mas não executa o login/upload dessas plataformas, nem resolve captchas de arrastar para o usuário.

Preparação

  1. Antes de publicar, revise a lista de conformidade em references/plotome-lessons.md do tech-explainer-video: marque "Contém conteúdo gerado por IA" (mesmo que a narração seja IA), inclua licenças de música e atribuições na descrição, e não use rostos humanos reais ou marcas registradas.
  2. Escreva out/upload_meta.md seguindo references/upload-meta-template.md. A descrição deve conter apenas o que é realmente abordado no vídeo e começar com "自用学习笔记。" (preferência do usuário).
  3. Capa: 1920×1080, sem legendas; gerada pela composição cover-epK do tech-explainer-video.
  4. Envie ao usuário para revisão (SendUserFile), perguntando claramente: capa, necessidade de link do código (GitHub/Gist), e nome da coleção.

Bilibili (B站)

Ferramenta: dreammis/social-auto-upload (instalado em ~/tools/social-auto-upload), que baixa e usa o biliup automaticamente para a postagem.

Primeira instalação (primeiro informe ao usuário a origem, o conteúdo e o tamanho, e aguarde permissão para instalar):

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

Login (peça ao usuário para executar em seu terminal, selecione "Login por QR code" no menu e escaneie com o aplicativo Bilibili; se o QR code não aparecer inteiro, abra qrcode.png):

cd ~/tools/social-auto-upload && .venv/bin/sau bilibili login --account <nome da conta>

Não escolha login por SMS: ele exigirá resolver um captcha de arrastar e copiar manualmente o challenge, que expira facilmente e causa falhas. Verifique o login: .venv/bin/sau bilibili check --account <nome da conta>, a saída deve ser valid.

Upload:

  1. Teste as linhas primeiro: tools/probe_lines.sh, e escolha a mais rápida (geralmente tx ou bda2). Não deixe o biliup testar automaticamente, pois pode travar ao passar por um proxy.
  2. Poste cada item:
    ~/.claude/skills/video-publish/tools/bili_upload.sh <nome da conta> out/ep1.mp4 out/covers/ep1.jpg tx 231 "<título>" "<descrição>" "<tags,separadas por vírgula>"
    
    O script converte os caminhos para caminhos absolutos (ele faz cd para social-auto-upload internamente), então você pode usar caminhos relativos dentro do diretório do projeto de vídeo. Se bem-sucedido, imprimirá 投稿成功 BVxxxx 链接; se falhar, imprimirá o final do log. Envie vários episódios em ordem, um por vez, e informe o número BV ao usuário após cada um.
  3. Após o envio de todos, lembre o usuário: no "Centro de Criação" > "Gerenciamento de Coleções", crie uma coleção e adicione os vídeos em ordem; eles só ficarão públicos após a aprovação.

Solução de problemas de rede:

  • Upload muito lento, error sending request, connection reset, erro 500 do servidor: provavelmente o TUN do proxy está roteando o tráfego para nós internacionais. Peça ao usuário para adicionar DOMAIN-SUFFIX,bilibili.com,DIRECT e DOMAIN-SUFFIX,bilivideo.com,DIRECT no início das regras do proxy e recarregar a configuração; execute probe_lines.sh novamente e, quando a velocidade estiver acima de algumas centenas de KB/s, faça o upload.
  • Para monitorar o progresso: nettop -p <pid do biliup> -L 1 -x -J bytes_out. O log do biliup quase não tem saída até o fim do upload, então não julgue que está travado pela falta de logs.
  • macOS não tem o comando timeout.
  • Se o download do biliup falhar na primeira execução do sau (acesso lento ao GitHub Release): use https://gh-proxy.com/ ou https://gh-proxy.org/ antes do endereço do release para baixar manualmente.
  • Antes de reenviar, confirme se a postagem anterior não foi bem-sucedida (verifique se há bvid no log) para evitar duplicatas.

Bilibili: Limite de Uploads e Multi-Partes

  • Cerca de 7 novos envios por dia; exceder isso retorna 21566 投稿过于频繁 (envio muito frequente), sendo necessário esperar até o dia seguinte. Agrupe cada capítulo em um único vídeo com várias partes (o biliup upload envia vários arquivos de uma vez, os nomes dos arquivos são os títulos das partes; use links físicos out/parts/P<k> <título do episódio>.mp4 para não ocupar espaço extra).
  • Para adicionar partes a um vídeo existente, use biliup append --vid BV…, que não consome a cota de novos envios.
  • Máximo de 12 tags; corte se houver mais. Escolha a linha primeiro com probe_lines.sh; bldsa já apresentou certificado expirado, em caso de falha tente tx/bda2.
  • Exemplo de script de fila: tools/examples/upload_chapters.sh (reintenta a cada hora em caso de erro 21566, até 24 vezes; em caso de sucesso, escreve - 结果:BV… P<k> de volta no upload_meta.md).

Bilibili: Adicionar a Vídeo Existente (coleção de série, testado com base de conhecimento de out-nov 2026)

  • Uma série corresponde a um vídeo com várias partes; cada artigo subsequente usa biliup append --vid BV… para adicionar partes; não crie um novo vídeo (especialmente quando o usuário explicitamente não quiser).
  • Exemplo de script de fila tools/examples/upload_append.sh: cada linha app <nome> <BV> <diretório do projeto>, adiciona sequencialmente out/parts/*.mp4.
    • Idempotente: em caso de sucesso, escreve <nome> append <BV> <data> em results.log; ao executar novamente, pula automaticamente ("já anexado"), então basta adicionar novas linhas no final do arquivo e executar o script inteiro novamente.
    • Rodízio de linhas: alia → tx → bda2. Se todas as três falharem, espera 30 minutos e tenta novamente, até 48 rodadas. O critério de sucesso é a saída conter 稿件修改成功.
    • Inicie com nohup <script> > upload_kbN.log 2>&1 & disown; o log é numerado por lote. Inicie outro loop em segundo plano com until para esperar o log conter "队列完成" (fila concluída).
    • Falha comum client error (Connect): instabilidade da linha; o script tentará novamente sozinho, não reenvie manualmente (isso criaria partes duplicadas).
  • O título de cada parte é o nome do arquivo: out/parts/P<k> <gancho>:<tópico>.mp4 (link físico para out/epK.mp4, não ocupa espaço).
  • append não pode alterar a descrição: escreva um parágrafo "补充简介" (descrição complementar) no upload_meta.md de cada lote e adicione uma nota "待作者" no quadro para o usuário colar manualmente no final da descrição original no Centro de Criação.
  • Versões em outros idiomas (ex.: dublagem em inglês) não devem ser anexadas ao vídeo chinês; o destino é definido pelo usuário.

YouTube

  • Ferramenta: o mesmo sau (sau youtube login/upload-video, deve ser --headed, pois o Google não permite acesso ao Studio em modo headless). O uploader do YouTube do sau tem dois bugs; a correção está em tools/examples/sau-youtube-fixes.patch: a verificação de login espera apenas 3 segundos e usa modo headless (falso positivo de inválido); o seletor de playlist clica no lugar errado (playlist nunca é adicionada e a exceção é engolida). Após instalar o sau em uma máquina nova, aplique este patch primeiro.
  • As playlists devem ser criadas no Studio primeiro (senão --playlist não funciona); após o upload, verifique um episódio para confirmar se entrou na playlist. Se não, vá ao Studio e selecione a playlist manualmente na página de edição do vídeo.
  • Há um limite diário de uploads: se aparecer "Botão de publicar não encontrado" ou o vídeo ficar como rascunho, provavelmente o limite foi atingido. Não reenvie (isso criaria rascunhos duplicados). Vá ao Studio, complete os rascunhos e publique; o restante deve ser enviado no dia seguinte.
  • Exemplo de script de fila: tools/examples/youtube_queue.sh (filas longas usam nohup … & disown, pois tarefas em segundo plano de sessão são recicladas).
  • Alternativa via API (sem abrir navegador): youtubeuploader (brew install youtubeuploader) + tools/examples/youtube_api_upload.sh. Pré-requisitos: projeto no Google Cloud com YouTube Data API v3 ativada, tela de consentimento OAuth (externa, adicionar usuário de teste), e credenciais de aplicativo Web (callback http://localhost:8080/oauth2callback). Projetos não verificados: vídeos enviados pela API são bloqueados como privados. O formulário de verificação https://support.google.com/youtube/contact/yt_api_form requer: site público com página inicial, política de privacidade e termos de serviço (exemplo: GitHub Pages, cassieliang6709/video-uploader), capturas de tela da página inicial e de privacidade, capturas do fluxo OAuth, diagrama de arquitetura, fluxograma do usuário e script de upload completo. Continue usando automação de navegador até a verificação.

Douyin / Kuaishou / Xiaohongshu

Ferramenta: mesmo social-auto-upload, com sau douyin|kuaishou|xiaohongshu, automação de navegador (patchright). Os comandos devem ser executados pelo usuário em seu próprio terminal (veja Regras de Ferro). O Claude apenas prepara os comandos e verifica os resultados.

Vídeos: essas três plataformas são predominantemente verticais; recomenda-se 1080×1920 ou cortar para cerca de 1 minuto de destaque; se necessário, volte ao tech-explainer-video para renderizar uma versão vertical. Vídeos horizontais também podem ser enviados, mas terão bordas pretas.

Primeira instalação do navegador (o usuário executa):

cd ~/tools/social-auto-upload && PLAYWRIGHT_DOWNLOAD_HOST="https://npmmirror.com/mirrors/playwright" .venv/bin/patchright install chromium

Login e verificação (o usuário executa; <plataforma> é douyin / kuaishou / xiaohongshu):

cd ~/tools/social-auto-upload && .venv/bin/sau <plataforma> login --account <nome da conta> --headed
.venv/bin/sau <plataforma> check --account <nome da conta>

Upload (o Claude preenche o comando completo com base no upload_meta.md e o envia ao usuário; o usuário confirma o conteúdo e executa):

cd ~/tools/social-auto-upload && .venv/bin/sau <plataforma> upload-video --account <nome da conta> \
  --file <caminho absoluto do mp4> --title "<título>" --desc "<corpo do texto>" --tags <tags,separadas por vírgula> \
  [--thumbnail <capa>] [--schedule "YYYY-MM-DD HH:MM"] [--collection <nome da coleção existente>]
  • Douyin: --thumbnail deve ser formato vertical 3:4; existe também --thumbnail-landscape (4:3); título com no máximo 30 caracteres.
  • Kuaishou: --thumbnail qualquer proporção; o script preenche apenas as primeiras 3 tags, coloque as mais importantes primeiro.
  • Xiaohongshu: título com no máximo 20 caracteres; não suporta --collection.
  • Após a execução, o usuário cola a saída do terminal de volta; o Claude avalia se foi bem-sucedido e escreve o link no upload_meta.md. Se aparecer um captcha de arrastar, o usuário deve resolver.
  • Para Douyin, enviar um capítulo inteiro como uma coleção de vídeos (juntar todos os episódios em out/chapter.mp4, com capa horizontal 4:3) é mais fácil de gerenciar do que enviar episódio por episódio; exemplo de script de fila: tools/examples/douyin_upload_all.sh (o usuário executa em seu terminal; a verificação de login usa modo com interface DOUYIN_COOKIE_AUTH_HEADLESS=false).

Alternativa (quando não quiser usar scripts): no Chrome já logado do usuário, abra a página de publicação da plataforma de criação, ajude o usuário a selecionar o arquivo, preencher título e corpo do texto, e pare antes do botão de publicar; tire um print e deixe o usuário clicar em "Publicar" por conta própria.

Pipeline em Lote (apenas com autorização explícita do usuário)

O usuário pode dar autorização de longo prazo para uma série: "Renderizar um lote → fazer upload diretamente → deletar o vídeo final" (ex.: nudgecode 算法图解, autorizado em 24/10/2026). Essa autorização cobre apenas a série mencionada pelo usuário; para trocar de série ou plataforma, é necessário perguntar novamente. Dentro do escopo da autorização:

  1. Após renderizar cada capítulo deste lote, escreva título, descrição e tags seguindo o formato do upload_meta.md existente da série (a descrição ainda começa com "自用学习笔记。" e contém apenas o que está no vídeo), sem mostrar item por item ao usuário; ainda execute sau bilibili check para confirmar o login e probe_lines.sh para selecionar a linha.
  2. Faça upload por capítulo e por episódio, em ordem. Após cada capítulo, liste no diálogo "episódio / título / link" e escreva o número BV no upload_meta.md.
  3. Delete apenas o episódio para o qual o número BV foi obtido: out/epK.mp4, out/*.raw.mp4, out/check/, out/bundle/ (e o node_modules do projeto, mas não os links simbólicos compartilhados). Mantenha o código-fonte, a dublagem, o srt, a capa e o upload_meta.md para futuras re-renderizações. Episódios cujo upload falhou nunca devem ser deletados.
  4. Se o comando de exclusão for bloqueado por permissão, passe o comando exato para o usuário executar, sem contornar de outra forma.

Limpeza

  • Os vídeos finais só devem ser deletados depois que todos os links das plataformas de destino forem obtidos. A exclusão é frequentemente bloqueada por permissões; escreva um script e entregue ao usuário para executar. Exemplo: tools/examples/cleanup_uploaded.sh (deleta apenas os episódios que têm resultado no upload_meta.md; pode ser executado várias vezes).

Registro

Após a publicação, escreva o número BV de cada episódio de volta na coluna "结果" (resultado) do out/upload_meta.md e liste uma tabela "episódio / título / link" no diálogo.

Individual skills in this repo

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

Habilidades Relacionadas