YouTube 자막 API가 작동하지 않나요? 진단 체크리스트
자막 요청이 실패하는 모든 실제 이유를 추측이 아니라 오픈소스 커뮤니티 자체에서 가장 많이 논의된 이슈를 바탕으로 정리했습니다. 각각의 정확한 에러 코드와 해결책까지 포함합니다.
진단 체크리스트
에러 코드(또는 응답의 형태)를 아래 표와 비교해 보세요.
| 코드 | 의미 | 해야 할 일 |
|---|---|---|
MISSING_URL / INVALID_URL · 400 | v 파라미터가 없거나, YouTube가 인식하는 동영상 ID/URL이 아닙니다. | 유효한 11자리 동영상 ID나 완전한 youtube.com/watch?v=... URL을 전달하세요. |
VIDEO_UNAVAILABLE · 404 | 동영상이 비공개, 삭제됨, 또는 지역 제한 상태입니다 - 서버 입장에서는 존재하지 않습니다. | 먼저 일반 브라우저에서 동영상이 로드되는지 확인하세요. 로드되지 않는다면 API가 가져올 수 있는 것이 없습니다. |
TRANSCRIPT_DISABLED · 404 | 보통 업로더가 자막을 비활성화했다는 뜻이지만, 지역 제한과 IP 차단도 똑같이 보이는 에러를 만들 수 있습니다. | 영구적이라고 단정하기 전에 아래 안내를 확인하세요. |
LANGUAGE_NOT_AVAILABLE · 404 | 동영상에 자막은 있지만, 요청한 언어의 자막은 아닙니다. | 언어 파라미터를 빼고 이용 가능한 것을 받거나, 먼저 동영상 자체의 자막 목록을 확인하세요. |
TRANSCRIPT_NOT_FOUND · 404 | 이 동영상에는 어떤 언어로도 자막이 존재하지 않습니다. | 비활성화된 자막과 동일한 경우입니다 - 가져올 것이 없습니다. 모든 동영상에 자막이 있는 것은 아닙니다. |
RATE_LIMITED · 429 | API 키가 플랜의 분당 한도보다 많은 요청을 보냈습니다. | 속도를 늦추고 재시도하거나, 더 높은 속도 제한으로 업그레이드하세요. |
UPSTREAM_* · 429/503/504 | API 키나 요청이 아니라 YouTube 자체와 통신하는 과정에서의 일시적 문제입니다. | 잠시 후 재시도해도 안전합니다 - 호스팅된 API가 대신 흡수하는 바로 그 종류의 오류입니다. |
"자막 비활성화"가 항상 비활성화를 의미하지는 않습니다
오픈소스 youtube-transcript-api 역사상 가장 많이 논의된 이슈(댓글 187개)는 실제로는 비활성화되지 않은 동영상에 스크립트가 "TranscriptsDisabled"를 발생시키는 경우입니다 - 일반 브라우저에서는 자막이 문제없이 재생됩니다. 세 가지 서로 다른 실제 원인이 거의 동일해 보이는 에러를 만듭니다:
- 실제로 비활성화됨 - 업로더가 자막을 껐습니다. 어떤 언어로도 가져올 것이 없습니다.
- 지역 제한됨 - 동영상이나 자막이 서버가 위치한 국가에서는 이용할 수 없지만, 다른 지역의 브라우저에서는 작동합니다.
- IP 차단됨 - YouTube가 구체적인 이유 대신 일반적인 실패를 반환하며, 실제 원인은 아래의 클라우드 호스팅 문제입니다.
깔끔한 예외 대신 원시 XML 파싱 에러("no element found", "line 1, column 0")가 나오는 것도 같은 부류의 문제입니다 - 빈 응답 본문으로, 대개 아래와 같은 IP 차단이나 PoToken 원인 때문이며 파싱 코드 자체의 버그가 아닙니다.
AWS, GCP, Azure, 또는 VPS에서 차단되었나요?
스크립트가 노트북에서는 완벽히 작동하다가 클라우드 서버에 배포하는 순간 실패한다면, 거의 항상 이 때문입니다: YouTube의 자막 가져오기 엔드포인트는 개별적인 악성 IP뿐 아니라 데이터센터 IP 대역 전체를 차단합니다. 수천 개의 무관한 스크립트가 같은 주소 대역을 공유하기 때문에, 모든 주요 클라우드 제공업체의 IP 공간이 결국 이 문제를 겪게 됩니다.
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.현실적인 우회 방법을, 대략 노력이 적은 순서대로 정리하면:
- 레지덴셜 또는 모바일 프록시 풀을 통해 요청을 우회 - 어느 정도는 작동하지만, 유료 로테이팅 레지덴셜 설정조차 여전히 실패한다는 보고가 점점 늘고 있습니다. 영구적인 해결책은 아닙니다.
- 여러 클라우드 제공업체나 리전을 번갈아 사용 - 그 대역도 결국 표시되기 전까지 시간을 법니다.
- 같은 동영상을 다시 가져오지 않도록 적극적으로 캐싱 - 차단에 걸리는 빈도는 줄이지만 없애지는 못합니다.
- 이 인프라를 이미 운영하는 호스팅된 API를 사용 - 문제가 '내 프로젝트'에서 '이걸 계속 작동시키는 게 실제 업무인 누군가'에게로 넘어갑니다.
그것이 바로 저희 자체 YouTube 자막 API가 채우는 진짜 공백입니다 - 다른 라이브러리가 아니라, 정확히 이 문제를 위해 이미 구축된 인프라입니다.
PoTokenRequired가 발생하나요?
더 최근의 실패 유형입니다: YouTube의 자막 엔드포인트는 점점 더 자체 플레이어 JavaScript가 런타임에 생성하는 출처 증명 토큰을 요구합니다 - 쿠키도, IP 평판 검사도 아닌 암호학적 값입니다. 단순한 HTTP 요청으로는 이를 생성할 방법이 없습니다.
실제 기술적 세부사항은 jdepoix/youtube-transcript-api#592에서 확인하세요 - 해당 보고 시점 기준으로, 오픈소스 라이브러리에는 문서화된 우회 방법이 없습니다.
이것이 바로 호스팅된 API가 흡수하도록 만들어진 종류의 문제입니다 - 엔드포인트 하나만 호출하면 토큰 생성 문제를 직접 해결할 필요 없이 자막이나 명확한 에러를 돌려받습니다.
각 실패에 대해 저희 자체 API가 반환하는 것
이미 저희 API를 사용 중이고 HTTP 상태만으로 추측하는 대신 정확한 실패에 따라 분기하고 싶다면, 모든 에러는 안정적인 `code` 필드와 함께 반환됩니다:
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." }전체 파라미터 참조와 모든 상태 코드는 API 문서에 있습니다.
자주 발생하는 YouTube 자막 API 에러
왜 'YouTube is blocking requests from your IP'가 나타나나요?
클라우드/데이터센터 IP 주소(AWS, GCP, Azure, VPS 등)에서 YouTube의 자막 엔드포인트를 호출하고 있으며, YouTube는 홈/레지덴셜 IP보다 이런 대역을 더 적극적으로 차단합니다. 보통 개인적인 문제가 아니라 수천 개의 다른 스크립트와 공유되는 IP 대역 전체의 문제입니다.
왜 내 스크립트는 로컬에서는 작동하는데 배포하면 실패하나요?
노트북은 레지덴셜 IP를 가지고 있고, 서버는 데이터센터 IP를 가지고 있습니다. 코드는 같지만 네트워크 평판이 다릅니다 - 직접 YouTube 자막 라이브러리를 호스팅하는 사람에게 "여기서는 되는데 저기서는 안 된다"의 가장 흔한 원인입니다.
'자막 비활성화'가 가끔 잘못된 것으로 밝혀지는 이유는 무엇인가요?
YouTube가 항상 구체적인 이유를 반환하지는 않기 때문입니다 - 지역 제한이나 IP 차단이 실제로 비활성화된 동영상과 같은 일반적인 에러를 만들 수 있습니다. 영구적으로 이용할 수 없다고 단정하기 전에 다른 네트워크의 일반 브라우저에서 동영상이 자막을 재생하는지 확인하세요.
PoTokenRequired가 무엇인가요?
YouTube가 런타임에 실제 플레이어 JavaScript로 생성되는 출처 증명 토큰을 요구하는 것으로, 하드코딩하거나 한 번 추출할 수 있는 정적 값이 아닙니다. 단순한 HTTP 요청과 대부분의 스크래핑 라이브러리는 이를 생성할 방법이 없으며, 그래서 현재 오픈소스 라이브러리에는 문서화된 우회 방법이 없습니다.
요청한 언어로 자막이 없는 이유는 무엇인가요?
동영상에 자막은 있지만 그 언어가 아닙니다. 언어 파라미터 없이 요청해서 이용 가능한 것을 받거나, 먼저 어떤 언어가 존재하는지 확인하세요.
속도 제한을 피하려면 어떻게 해야 하나요?
두 가지 다른 제한이 있습니다: 자신의 플랜의 분당 요청 한도(더 높은 것으로 업그레이드)와 YouTube 자체의 업스트림 제한(잠시 후 재시도해도 안전 - 호스팅된 API가 대부분을 대신 흡수합니다).