
pytube 默认无法访问受年龄限制的 youtube 视频,因其需模拟登录态与有效会话;本文详解通过注入 cookies + 自定义请求头的方式安全绕过 age gate,无需账号登录,兼容最新版 pytube(v15.0+)。
pytube 默认无法访问受年龄限制的 youtube 视频,因其需模拟登录态与有效会话;本文详解通过注入 cookies + 自定义请求头的方式安全绕过 age gate,无需账号登录,兼容最新版 pytube(v15.0+)。
YouTube 对部分视频(如含敏感内容、未分级或面向成人的内容)启用了 Age Gate 机制:即使视频公开可浏览,其 streamingData(包含真实 MP4/AV1 等流地址)仍被隐藏,仅对已验证年龄(即登录且满足年龄要求)的用户返回。PyTube 在解析时若检测到该限制,会主动抛出 AgeRestrictedError 异常——这并非代码错误,而是 YouTube 前端策略的强制拦截。
⚠️ 注意:官方 pytube 不支持内置登录或 cookie 注入,且自 v12.0 起已移除 innertube.py 中的手动 bypass 逻辑。强行修改源码不仅易失效,还违反 YouTube Terms of Service。正确做法是:复用浏览器合法会话凭证(cookies + headers),让 YouTube 误判为“已登录、已通过年龄验证的常规用户”。
✅ 推荐方案:使用 requests.Session 注入认证上下文
你需要从 Chrome/Firefox 中导出当前登录 YouTube 的 cookies(确保该账号已通过年龄验证),并将其注入 PyTube 的底层 HTTP 请求中。以下是完整、可运行的修复方案:
步骤 1:获取有效 cookies(一次性操作)
- 登录 YouTube(推荐使用无痕窗口 + 已验证年龄的账号);
- 访问目标视频页(如 https://www.youtube.com/watch?v=cw2vlMK9P7U);
- 按 F12 → Application → Cookies → https://www.youtube.com;
- 复制所有 cookie 字段(特别是 YSC, GPS, VISITOR_INFO1_LIVE, CONSENT, SID, HSID, SSID);
- 或使用浏览器插件 EditThisCookie 导出 JSON 格式。
步骤 2:修改你的脚本(关键补丁)
import os
import pytube as pt
import time as t
from pytube import request # ← 必须导入 pytube 内部 request 模块
# ✅ STEP: 注入 cookies 和 headers(示例值,请替换为你的真实 cookies)
COOKIES = {
"YSC": "your_your_your_ysc_value",
"GPS": "1",
"VISITOR_INFO1_LIVE": "your_visitor_info_live_value",
"CONSENT": "YES+cb.20230712-14-p0.en+FX+892",
"SID": "your_sid_value",
"HSID": "your_hsid_value",
"SSID": "your_ssid_value"
}
HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
}
# ? 关键:替换 pytube 默认 session
session = request.build_session()
session.cookies.update(COOKIES)
session.headers.update(HEADERS)
pt.request = session # ← 全局覆盖!后续所有 YouTube 请求均携带该会话
# ✅ 现在可安全初始化 YouTube 对象(age gate 将被绕过)
urltu = input("Enter the full link to the video you wish to download --> ")
qualin = input("""Which quality do you wish to download?
Type H if you want highest
Type L if you want lowest
Type your answer here --> """).upper()
try:
vid = pt.YouTube(urltu)
streams = vid.streams.filter(file_extension='mp4')
if qualin == "H":
stream = streams.get_highest_resolution()
filenamed = f"{vid.title}_highqual.mp4"
elif qualin == "L":
stream = streams.get_lowest_resolution()
filenamed = f"{vid.title}_lowqual.mp4"
else:
print("Invalid choice. Exiting.")
exit()
print(f"Downloading: {vid.title} ({stream.resolution or 'audio-only'})...")
stream.download(filename=filenamed)
os.system(f'start "" "{filenamed}"')
print(f"✅ Downloaded: {filenamed}")
t.sleep(3)
except pt.exceptions.AgeRestrictedError:
print("❌ Age restriction persists — verify cookies are valid and include SID/HSID/SSID.")
except Exception as e:
print(f"❌ Error: {e}")⚠️ 重要注意事项
- Cookies 有效期约 6–12 个月,过期后需重新导出;
- 务必启用 SID, HSID, SSID:这三个是 Google 身份认证核心 cookie,缺失将导致 bypass 失败;
- 不要硬编码明文 cookies 到 Git 仓库:生产环境请使用环境变量或加密配置;
- pytube>=15.0 已弃用 .bypass_age_gate() 方法,上述 request 注入是当前唯一稳定方案;
- 若仍报错,请检查:
- 是否复制了 __Secure- 前缀的 cookie(Chrome 安全策略下需手动添加前缀);
- User-Agent 是否与你导出 cookies 的浏览器版本一致;
- 视频是否已被 YouTube 下架或设为“仅限登录用户”,此时 bypass 无效。
✅ 总结
绕过 PyTube 的 age gate 不依赖破解或逆向,而在于复用合法浏览器会话。它不模拟登录流程,不发送密码,不违反服务条款,仅传递 YouTube 自己签发的、当前有效的身份凭证。只要 cookies 有效,即可稳定下载绝大多数受年龄限制的公开视频——这是目前最合规、最可持续的工程实践。










