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
- Antes de publicar, revise a lista de conformidade em
references/plotome-lessons.mddo 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. - Escreva
out/upload_meta.mdseguindoreferences/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). - Capa: 1920×1080, sem legendas; gerada pela composição
cover-epKdo tech-explainer-video. - 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:
- Teste as linhas primeiro:
tools/probe_lines.sh, e escolha a mais rápida (geralmentetxoubda2). Não deixe o biliup testar automaticamente, pois pode travar ao passar por um proxy. - Poste cada item:
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á~/.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>"投稿成功 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. - 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 adicionarDOMAIN-SUFFIX,bilibili.com,DIRECTeDOMAIN-SUFFIX,bilivideo.com,DIRECTno início das regras do proxy e recarregar a configuração; executeprobe_lines.shnovamente 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/ouhttps://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 biliupuploadenvia vários arquivos de uma vez, os nomes dos arquivos são os títulos das partes; use links físicosout/parts/P<k> <título do episódio>.mp4para 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;bldsajá apresentou certificado expirado, em caso de falha tentetx/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 linhaapp <nome> <BV> <diretório do projeto>, adiciona sequencialmenteout/parts/*.mp4.- Idempotente: em caso de sucesso, escreve
<nome> append <BV> <data>emresults.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 comuntilpara 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).
- Idempotente: em caso de sucesso, escreve
- O título de cada parte é o nome do arquivo:
out/parts/P<k> <gancho>:<tópico>.mp4(link físico paraout/epK.mp4, não ocupa espaço). appendnã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á emtools/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
--playlistnã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 usamnohup … & 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 (callbackhttp://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:
--thumbnaildeve ser formato vertical 3:4; existe também--thumbnail-landscape(4:3); título com no máximo 30 caracteres. - Kuaishou:
--thumbnailqualquer 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 interfaceDOUYIN_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:
- 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 checkpara confirmar o login eprobe_lines.shpara selecionar a linha. - 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.
- 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 onode_modulesdo 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. - 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.