如何绕过或自动化pytube的OAuth/PO Token验证实现音频下载?
解决pytube/pytubefix下载音频的Token问题
1. 直接传入Token到pytube
pytube和pytubefix支持手动传入Token,无需弹窗。初始化YouTube对象时,可通过headers或cookies参数注入:
- 传入PO/OAuth Token:
from pytube import YouTube auth_token = "你的Bearer Token" yt = YouTube( "目标视频URL", headers={"Authorization": f"Bearer {auth_token}"} ) # 筛选并下载音频流 audio_stream = yt.streams.filter(only_audio=True).order_by('abr').desc().first() audio_stream.download(output_path="./audio") - 传入浏览器Cookie(需从已登录YouTube的浏览器导出):
yt = YouTube( "目标视频URL", cookies={ "__Secure-3PAPISID": "你的SID值", "__Secure-3PSID": "你的SID值" } )
⚠️ 注意:Token和SID与个人Google账号绑定,分享程序时绝对不能硬编码自己的Token,避免账号权限泄露。
2. 自动化生成Token(无弹窗)
可以让用户导出自己的浏览器Cookie,再通过脚本自动生成可用的Token:
import hashlib import time import json def generate_sapisidhash(cookie_file_path): # 从用户导出的Cookie文件中读取SID with open(cookie_file_path, 'r', encoding='utf-8') as f: cookies = json.load(f) sapisid = next(c['value'] for c in cookies if c['name'] == '__Secure-3PAPISID') # 按照YouTube的算法生成SAPISIDHASH timestamp = str(int(time.time() // 3600)) origin = "https://www.youtube.com" hash_str = f"{timestamp} {sapisid} {origin}".encode('utf-8') sha1_hash = hashlib.sha1(hash_str).hexdigest() return f"SAPISIDHASH {timestamp}_{sha1_hash}" # 使用示例 auth_token = generate_sapisidhash("用户导出的cookie.json") yt = YouTube("目标视频URL", headers={"Authorization": auth_token})
这个逻辑基于YouTube的内部认证机制,可能随平台更新变动,但目前稳定性较好。
3. 无需Token的替代方案
如果不想处理Token问题,推荐使用yt-dlp——这款工具维护活跃,自动适配YouTube的反爬策略,无需手动配置Token:
import yt_dlp ydl_config = { 'format': 'bestaudio/best', 'postprocessors': [{ 'key': 'FFmpegExtractAudio', 'preferredcodec': 'mp3', # 可选:转换为mp3格式 'preferredquality': '192', }], 'outtmpl': './audio/%(title)s.%(ext)s', # 自定义输出路径和文件名 } with yt_dlp.YoutubeDL(ydl_config) as ydl: ydl.download(["目标视频URL"])
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

