求助:使用pytube下载YouTube视频时出现get_throttling_function_name匹配错误
解决pytube报错:get_throttling_function_name: could not find match for multiple
错误原因
这个错误的核心原因是YouTube更新了页面的JavaScript加密逻辑,pytube内置的节流函数名称匹配规则无法适应新的JS代码结构,导致无法解析视频流的加密参数——哪怕你安装了最新版pytube,也可能因为YouTube的更新速度快于pytube的官方修复节奏而触发这个问题。
修复方案
方案1:修改pytube源码中的正则匹配规则
找到你本地Python环境中pytube的cipher.py文件(通常路径类似Lib/site-packages/pytube/cipher.py),定位到get_throttling_function_name函数里的function_patterns列表,更新正则匹配规则来适配YouTube的新JS:
原代码片段:
function_patterns = [ r'a\.[a-zA-Z]\s*&&\s*\([a-z]\s*=\s*a\.get\("n"\)\)\s*&&.*?\|\|\s*([a-z]+)', r'\([a-z]\s*=\s*([a-zA-Z0-9$]+)(\[\d+\])?\([a-z]\)', ]
替换为:
function_patterns = [ r'a\.[a-zA-Z]\s*&&\s*\([a-z]\s*=\s*a\.get\("n"\)\)\s*&&.*?\|\|\s*([a-z]+)', r'\([a-z]\s*=\s*([a-zA-Z0-9$]+)(\[\d+\])?\([a-z]\)', r'\b[cs]\s*&&\s*[adf]\.set\([^,]+\s*,\s*encodeURIComponent\s*\(\s*([a-zA-Z0-9$]+)\(', ]
保存文件后重新运行代码即可。
方案2:使用OAuth认证绕过节流检查
在初始化YouTube对象时添加use_oauth和allow_oauth_cache参数,通过YouTube OAuth认证来避开节流参数的解析:
修改你的初始化代码:
video = YouTube(audio_link, use_oauth=True, allow_oauth_cache=True)
第一次运行时会弹出浏览器要求你登录YouTube账号,登录成功后凭据会被本地缓存,后续运行无需重复登录。这种方法不用修改源码,适合快速解决问题。
方案3:安装社区修复的pytube分支
如果官方版本迟迟没有修复,可以安装社区维护的修复分支:
pip install git+https://github.com/pytube/pytube.git@fix/throttling-function
安装完成后直接使用原有代码即可,无需额外修改。
内容的提问来源于stack exchange,提问作者Ahmad Hashemi
相关产品推荐
相关产品推荐

