n8n 워크플로에서 YouTube 영상 자막을 받아와 LLM 으로 요약하는 흐름을 만들고 있었다. 그런데 같은 코드가 로컬 노트북에서는 잘 동작하는데, 운영 VM 에서만 자막이 안 잡혔다. 그것도 자막이 분명히 켜져 있는 TED 강연에서.
from youtube_transcript_api import YouTubeTranscriptApi
YouTubeTranscriptApi.get_transcript("jNQXAC9IVRw")
# → youtube_transcript_api._errors.TranscriptsDisabled
“자막이 비활성화돼있다” 는 응답. 실제 영상에는 자막이 있다. 즉 라이브러리가 자막 트랙을 못 찾는 게 아니라, YouTube 가 우리 요청에 자막 메타데이터 자체를 안 돌려주고 있는 것이었다.
1. yt-dlp 도 더 노골적인 메시지를 띄운다
같은 영상으로 yt-dlp --skip-download --print title 을 시도하면 메시지가 훨씬 노골적이다.
ERROR: [youtube] jNQXAC9IVRw:
Sign in to confirm you're not a bot.
“봇이 아닌지 확인하려면 로그인해라”. YouTube 가 요청 출처를 의심스러워한다는 뜻이고, 보통은 요청 IP 단위로 적용되는 일시적·반영구적 차단이다.
2. IP 차단인지 다른 문제인지 — 다른 머신에서 재현 시도
같은 코드를 로컬 노트북, 그리고 다른 클라우드 인스턴스에서 돌려봤다. 둘 다 정상. 이 VM 의 공인 IP 에서만 차단되고 있었다.
Oracle Cloud, AWS, GCP 등 대형 클라우드 사업자의 IP 대역은 봇/스크래핑 트래픽이 워낙 많이 나오기 때문에 YouTube 가 일찌감치 신호로 잡고 있다. 어느 시점에 일반 가정용 IP 처럼 통과해주다가, 어느 시점에 갑자기 차단이 들어온다. 이번이 그 경계를 넘은 시점이었던 셈.
3. 그래도 살아있는 경로 — oEmbed, watch 페이지 HTML
전부 막힌 건 아니다. 다음 두 경로는 차단되지 않았다.
# oEmbed — 제목 / 채널명만
curl -s "https://www.youtube.com/oembed?url=https://youtu.be/jNQXAC9IVRw&format=json"
# watch 페이지 HTML — description, duration, 일부 메타
curl -sL "https://www.youtube.com/watch?v=jNQXAC9IVRw" | grep -oP '"description":"[^"]+"' | head -1
자막 본문은 못 받지만, 영상 설명(description) 과 제목 정도는 가져올 수 있다. 자막이 부실해도 영상 설명이 잘 쓰여 있는 채널(강연, 리뷰, 튜토리얼)은 description 만으로도 꽤 쓸 만한 요약이 나온다. 일단 폴백으로 충분.
4. 자막 본문을 정말 받으려면 — 옵션 셋
description 으로는 안 되는 경우(음악, 짧은 클립, 설명 없는 vlog 등)가 있다. 그때 쓸 수 있는 우회 옵션 세 가지.
(a) Residential 프록시 경유
가정용 IP 를 잠시 빌려 요청하는 방식. Datacenter 프록시는 같이 막혀있을 가능성이 높으므로 Residential 만 유효하다.
from youtube_transcript_api import YouTubeTranscriptApi
from youtube_transcript_api.proxies import WebshareProxyConfig
api = YouTubeTranscriptApi(
proxy_config=WebshareProxyConfig(
proxy_username="...", proxy_password="...",
),
)
api.get_transcript("jNQXAC9IVRw")
- 비용: 트래픽 단가가 GB 당 수 달러대. 자막은 영상당 KB 단위라 작은 플랜으로 매우 오래 쓸 수 있다.
- 함정: 영상 파일을 다운로드하면 GB 가 빠르게 사라진다. 자막용으로만 쓰는 게 비용 효율적.
(b) Whisper STT 사이드카
자막 트랙을 받지 못해도, 영상의 오디오 트랙은 별도 추출이 가능한 경우가 있다. 추출한 오디오를 OpenAI Whisper 또는 자체 호스팅 Whisper 에 넣어 트랜스크립션. 자막 없는 영상까지 커버되지만 비용·지연이 크다.
(c) 외부 자막 API
Supadata, Apify 같은 외부 서비스가 자막을 받아주는 엔드포인트를 판다. 자체 프록시 관리 부담이 없는 대신, 영상 수에 따라 요금이 빠르게 누적된다.