API de Transcrições do YouTube não funciona? Checklist de diagnóstico
Todo motivo real pelo qual uma requisição de transcrição falha, construído a partir dos issues mais discutidos da própria comunidade open-source - não de suposições - mais o código de erro exato e a correção para cada um.
Checklist de diagnóstico
Compare seu código de erro (ou o formato da sua resposta) com a tabela abaixo.
| Código | O que significa | O que fazer |
|---|---|---|
MISSING_URL / INVALID_URL · 400 | O parâmetro v está ausente, ou não é um ID/URL de vídeo que o YouTube reconhece. | Envie um ID de vídeo válido de 11 caracteres ou uma URL completa youtube.com/watch?v=... |
VIDEO_UNAVAILABLE · 404 | O vídeo é privado, foi excluído, ou está bloqueado por região - não existe do ponto de vista do servidor. | Confirme primeiro se o vídeo carrega em um navegador normal. Se não carregar, não há nada que uma API possa recuperar. |
TRANSCRIPT_DISABLED · 404 | Geralmente significa que quem enviou o vídeo desativou as legendas - mas bloqueios de região e de IP podem gerar um erro com a mesma aparência. | Veja o aviso abaixo antes de assumir que é permanente. |
LANGUAGE_NOT_AVAILABLE · 404 | O vídeo tem legendas, só que não no idioma solicitado. | Remova o parâmetro de idioma para obter o que estiver disponível, ou verifique antes a lista de idiomas do próprio vídeo. |
TRANSCRIPT_NOT_FOUND · 404 | Não existe transcrição em nenhum idioma para este vídeo. | O mesmo que legendas desativadas - não há nada para recuperar. Nem todo vídeo tem uma. |
RATE_LIMITED · 429 | Sua chave de API fez mais requisições do que o limite por minuto do seu plano permite. | Reduza o ritmo e tente novamente, ou faça upgrade para um limite maior. |
UPSTREAM_* · 429/503/504 | Um problema transitório ao falar com o próprio YouTube, não com sua chave ou requisição. | Seguro tentar novamente após um breve atraso - exatamente o tipo de falha que uma API hospedada absorve em vez de você ter que lidar com isso. |
"Legendas desativadas" nem sempre significa desativadas
O issue mais discutido em toda a história do youtube-transcript-api open-source (187 comentários) é um script que lança "TranscriptsDisabled" para um vídeo que na verdade não está desativado - ele reproduz legendas normalmente em um navegador comum. Três causas reais diferentes produzem um erro quase idêntico:
- Realmente desativado - quem enviou o vídeo desligou as legendas. Não há nada para recuperar, em nenhum idioma.
- Bloqueado por região - o vídeo ou suas legendas não estão disponíveis a partir do país do seu servidor, mas funcionam em um navegador em outra região.
- Bloqueado por IP - o YouTube retorna uma falha genérica em vez de uma específica, e a causa real é o problema de hospedagem em nuvem abaixo.
Um erro bruto de parse de XML ("no element found", "line 1, column 0") em vez de uma exceção limpa é da mesma família de problema - um corpo de resposta vazio, geralmente pela mesma causa de bloqueio de IP ou PoToken abaixo, não um bug no próprio código de parse.
Bloqueado na AWS, GCP, Azure ou uma VPS?
Se um script funciona perfeitamente no seu notebook e falha assim que é implantado em um servidor na nuvem, quase sempre é por isso: o endpoint de legendas do YouTube bloqueia faixas inteiras de IPs de datacenter, não apenas IPs individuais abusivos. O espaço de IPs de todo grande provedor de nuvem acaba sendo afetado, porque milhares de scripts sem relação entre si compartilham as mesmas faixas de endereços.
Could not retrieve a transcript for the video https://www.youtube.com/watch?v=...!
This is most likely caused by:
YouTube is blocking requests from your IP.Formas realistas de contornar isso, mais ou menos em ordem de esforço:
- Rotear requisições por um pool de proxies residenciais ou móveis - funciona às vezes, mas relatos de que até configurações residenciais rotativas pagas continuam falhando são cada vez mais comuns. Não é uma correção permanente.
- Alternar entre vários provedores de nuvem ou regiões - ganha tempo até essas faixas também serem sinalizadas.
- Fazer cache agressivamente para não buscar os mesmos vídeos de novo - reduz a frequência do bloqueio, não o elimina.
- Usar uma API hospedada que já mantém essa infraestrutura - o problema deixa de ser 'seu projeto' e passa a ser 'alguém cujo trabalho real é manter isso funcionando'.
Essa é a lacuna real que nossa própria API de Transcrições do YouTube preenche - não uma biblioteca diferente, mas infraestrutura já construída especificamente para esse problema.
Está recebendo PoTokenRequired?
Uma falha mais recente: o endpoint de legendas do YouTube cada vez mais exige um token de origem gerado em tempo de execução pelo próprio JavaScript do player - não um cookie, não uma verificação de reputação de IP, um valor criptográfico. Uma requisição HTTP simples não tem como gerar isso.
Veja o detalhe técnico real em jdepoix/youtube-transcript-api#592 - segundo esse relato, não existe solução documentada na biblioteca open-source.
Esse é exatamente o tipo de problema que uma API hospedada deve absorver - chame um endpoint e receba uma transcrição ou um erro claro, sem precisar resolver a geração do token você mesmo.
O que nossa própria API retorna para cada falha
Se você já usa nossa API e quer tratar a falha exata em vez de adivinhar só pelo status HTTP, todo erro vem com um campo `code` estável:
curl "https://getyoutubetranscript.com/api/v1/transcript?v=dQw4w9WgXcQ" \
-H "Authorization: Bearer sk_live_..."
# A failure looks like:
# { "success": false, "code": "TRANSCRIPT_DISABLED", "message": "Transcripts are disabled for this video." }A referência completa de parâmetros e todos os códigos de status estão na documentação da API.
Erros comuns da API de Transcrições do YouTube
Por que recebo 'YouTube is blocking requests from your IP'?
Você está chamando o endpoint de legendas do YouTube a partir de um IP de nuvem/datacenter (AWS, GCP, Azure, uma VPS...), e o YouTube bloqueia essas faixas de forma mais agressiva do que IPs residenciais. Geralmente não é algo pessoal - é a faixa de IP inteira, compartilhada com milhares de outros scripts.
Por que meu script funciona localmente mas falha ao ser implantado?
Seu notebook tem um IP residencial; seu servidor tem um IP de datacenter. Mesmo código, reputação de rede diferente - a causa mais comum de "funciona aqui, falha lá" para quem hospeda sua própria biblioteca de transcrição do YouTube.
Por que 'legendas desativadas' às vezes acaba sendo errado?
Porque o YouTube nem sempre retorna um motivo específico - um bloqueio de região ou de IP pode gerar o mesmo erro genérico de um vídeo realmente desativado. Verifique se o vídeo reproduz legendas em um navegador normal a partir de outra rede antes de assumir que está indisponível permanentemente.
O que é PoTokenRequired?
O YouTube exigindo um token de origem gerado pelo JavaScript real do player em tempo de execução, não um valor estático que você pode fixar ou extrair uma vez. Requisições HTTP simples - e a maioria das bibliotecas de scraping - não têm como gerar isso, por isso atualmente não há solução documentada na biblioteca open-source.
Por que não há transcrição no idioma que pedi?
O vídeo tem legendas, só que não nesse idioma. Peça sem o parâmetro de idioma para obter o que estiver disponível, ou verifique antes quais idiomas existem.
Como evito limites de taxa?
Existem dois limites diferentes: o teto de requisições por minuto do seu próprio plano (faça upgrade para um maior), e os limites próprios do YouTube (seguro tentar novamente após um breve atraso - uma API hospedada absorve a maior parte disso para você).