Youtube Transcript API在DigitalOcean服务器端失效问题求助
Django部署到DigitalOcean App Platform后YouTubeTranscriptApi抛出TranscriptsDisabled异常(本地正常)
问题描述
我开发的Django Web应用中,以下获取YouTube视频字幕的代码在本地运行完全正常,但部署到DigitalOcean App Platform云服务器后,在transcript_list = YouTubeTranscriptApi.list_transcripts(video_id)行抛出TranscriptsDisabled异常,提示“Transcripts are disabled for this video.”。但我已确认目标视频确实存在字幕,本地能正常获取,部署后却失效,耗时两天仍未解决。
from youtube_transcript_api import YouTubeTranscriptApi, TranscriptsDisabled, NoTranscriptFound, VideoUnavailable def transcribe(video_url): video_id = video_url.split("v=")[-1] logger.debug("Extracted video ID: %s", video_id) try: transcript_list = YouTubeTranscriptApi.list_transcripts(video_id) transcript = None for transcript_info in transcript_list: try: transcript = transcript_info.fetch() break except Exception as e: logger.warning("Error fetching transcript: %s", e, exc_info=True) continue if transcript is None: logger.error("No transcripts available for this video.") return "No transcripts available for this video." except TranscriptsDisabled as e: logger.error("Transcripts are disabled for this video. %s", e, exc_info=True) return "Transcripts are disabled for this video." except NoTranscriptFound: logger.error("No transcript found for this video.") return "No transcript found for this video." except VideoUnavailable: logger.error("Video is unavailable.") return "Video is unavailable." except Exception as e: logger.error("Error in fetching transcript: %s", e, exc_info=True) return "Error in fetching transcript." # Concatenate all text from the transcript into a single string transcription_text = ' '.join([item['text'] for item in transcript]) logger.debug("Transcription text (first 50 characters): %s", transcription_text[:50]) return transcription_text
排查与解决方案
模拟浏览器请求头,避免被识别为机器人
DigitalOcean的服务器IP属于云服务商段,容易被YouTube识别为非人类请求。给API调用添加自定义User-Agent,模拟浏览器请求:try: headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } transcript_list = YouTubeTranscriptApi.list_transcripts(video_id, headers=headers) # 后续代码不变检查区域限制,指定目标语言字幕
部分视频的字幕仅对特定地区开放,本地IP所在地区可访问,但DigitalOcean服务器IP所在地区可能无权限。可以明确指定要获取的字幕语言,避免遍历所有可能的字幕时触发区域限制:# 替换原有的遍历逻辑 try: # 优先获取英文,其次中文简体,可根据需求调整 transcript = transcript_list.find_transcript(['en', 'zh-CN']) transcription_text = ' '.join([item['text'] for item in transcript.fetch()]) return transcription_text except NoTranscriptFound: # 处理无对应语言字幕的情况 return "No target language transcript found."同步本地与服务器的库版本
本地和服务器上的youtube-transcript-api版本不一致可能导致兼容性问题。在服务器上执行更新命令:pip install --upgrade youtube-transcript-api确保服务器库版本和本地完全一致。
添加缓存与请求频率控制
部署后请求量增大可能触发YouTube的频率限制,导致请求被拦截。用Django缓存机制缓存已获取的字幕,减少重复请求:from django.core.cache import cache def transcribe(video_url): video_id = video_url.split("v=")[-1] cache_key = f"youtube_transcript_{video_id}" cached_result = cache.get(cache_key) if cached_result: return cached_result # 原有获取字幕的逻辑... # 缓存结果,有效期1天 cache.set(cache_key, transcription_text, timeout=86400) return transcription_text
内容的提问来源于stack exchange,提问作者edn
相关产品推荐
相关产品推荐

