You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 07:33:20