自动摘要
正在生成中……
这几天我很纳闷,为什么yt-dlp下载视频后上传云盘那套方法总是报错,错误日志大概长这样子:
ERROR: [youtube] Q0W6wcio384: Sign in to confirm you’re not a bot.
...
我也是搜索后才找到这个issue,新近的issue:https://github.com/yt-dlp/yt-dlp/issues/10128,原因是 油管判断你使用下载工具,把ip给 ban 了,有回复解决方案是72小时内不要下载了,更不要提供cookie去下载,否则可能直接把你油管账号给封了。
解决方法就是换个ip!
PS: 也有不更换ip或代理的方式,更新在文章最后面了。
行吧,鉴于我使用的是docker方式的yt-dlp,代理端口位于宿主机,而linux要从docker容器内访问宿主机还比较麻烦,如果使用了防火墙还要修改规则,windows和mac反而容易,只要使用 host.docker.internal
即可。
添加代理和修改防火墙规则
我的解决办法是在内网网卡,比如 10.0.8.4:7777 打开一个sockes代理,ufw添加规则:
ufw allow from 172.0.0.0/8 to any
172是docker默认网关的ip地址开头,这条规则是允许docker容器访问宿主机的全部网卡地址,如果要严格限制,只访问 10.0.8.4
,应该这样写:
ufw allow from 172.0.0.0/8 to 10.0.8.4
测试代理:
使用curl测试
# 进入容器:
docker run -it --rm --entrypoint /bin/bash falconchen/amd64-yt-dlp
#检查是否代理成功
curl -v -x socks5h://10.0.8.4:7777 ip.fm
#也可以使用一条命令,成功后会输出代理的ip
docker run -it --rm --entrypoint /bin/bash falconchen/amd64-yt-dlp -c "curl -x socks5h://10.0.8.4:7777 ip.fm"
使用yt-dlp测试
docker run -i --rm -v `pwd`:/data falconchen/amd64-yt-dlp --proxy socks5://10.0.8.4:7777 https://www.youtube.com/shorts/VJb8JTtwRP0
下载没有问题,把
--proxy socks5://10.0.8.4:7777
写入yt-dlp.conf
,完成!
20240905 更新:
YouTube似乎在加强访问控制,导致许多应用和服务受到影响。如果一定要使用用户登录,比如下载私密或受限视频,可以尝试使用OAuth认证
代替Cookie
。实测用上这种方式后不需要更换ip或代理也能下载。
方法如下:
- 先更新
yt-dlp
到最新版
yt-dlp -U
如果你的yt-dlp
是使用pip安装的,则执行
pip install -u yt-dlp
- 给
yt-dlp
安装 这个插件
python3 -m pip install -U https://github.com/coletdjnz/yt-dlp-youtube-oauth2/archive/refs/heads/master.zip
- 运行
yt-dlp --username oauth2 --password '' https://www.youtube.com/watch?v=aHq72PNRMlQ
出现以下内容
[youtube+oauth2] oauth2: Initializing OAuth2 Authorization Flow
[youtube+oauth2] To give yt-dlp access to your account, go to https://www.google.com/device and enter code XYZ-XYZ-ABCD
这是电视设备的Oauth验证流程,在浏览器打开https://www.google.com/device ,然后按要求验证,输入前面最后出现的那一串随机字符,比如 XYZ-XYZ-ABCD
,每个人的不一样。
最后会看到成功!设备已连接
的页面。
同时终端下的yt-dlp也开始下载
$ yt-dlp --username oauth2 --password '' https://www.youtube.com/watch\?v\=aHq72PNRMlQ
[youtube+oauth2] oauth2: Initializing OAuth2 Authorization Flow
[youtube+oauth2] To give yt-dlp access to your account, go to https://www.google.com/device and enter code XYZ-XYZ-ABCD
[youtube+oauth2] Authorization successful
[youtube+oauth2] Extracting URL: https://www.youtube.com/watch?v=aHq72PNRMlQ
[youtube+oauth2] aHq72PNRMlQ: Downloading webpage
如果没有问题,把
--username oauth2 --password ''
写入你的 yt-dlp.conf
配置文件,以后就可以不用加这串参数下载了。
直接运行:
yt-dlp https://www.youtube.com/watch?v=aHq72PNRMlQ
One More Thing
这个插件会把OAUTH的凭据保存在缓存,使用了yt-dlp的缓存机制,默认缓存的路径在Mac或者Linux上是:
~/.cache/yt-dlp/youtube-oauth2
在Windows上是
%LOCALAPPDATA%\yt-dlp\Cache\youtube-oauth2
如果想指定 yt-dlp 的缓存目录路径,可以使用--cache-dir
参数
yt-dlp --cache-dir /path/to/custom/cache
如果想删除缓存
yt-dlp --rm-cache-dir
这条命令不仅会清除缓存,还会在终端中显示缓存目录的位置。例如:
[cache] Cleared cache at /home/user/.cache/yt-dlp
知道这个对普通用户没什么用,但对做Docker image有用,好了,我准备给我的Docker image也加上这个插件。
20240923更新
我重新构建了yt-dlp 的 docker amd64镜像,并且为镜像加入oauth2 插件,使用方法:
# 拉取镜像
docker pull falconchen/amd64-yt-dlp:oauth2
# 建立oauth缓存,并测试下载
docker run -it --rm -v /var/run/cache/youtube-oauth2-cache:/yt-dlp/cache/youtube-oauth2 -v `pwd`:/data falconchen/amd64-yt-dlp:oauth2 https://youtu.be/AS3M-x7AeZU?si=cMeSGhsxbN2NLcDk
如果成功,按前面的认证方式在浏览器填入认证码,文件将下载到当前目录下,并将oauth2的凭据缓存在的/var/run/cache/youtube-oauth2-cache目录下。
以后下载只需要执行
docker run -it --rm -v /var/run/cache/youtube-oauth2-cache:/yt-dlp/cache/youtube-oauth2 -v `pwd`:/data falconchen/amd64-yt-dlp:oauth2
你的油管链接
可以将此保存成 shell script 并放入路径,如放在
/bin/yt-oauth2
,内容如下:
#!/bin/bash
docker run -it --rm \
-v /var/run/cache/youtube-oauth2-cache:/yt-dlp/cache/youtube-oauth2 \
-v `pwd`:/data falconchen/amd64-yt-dlp:oauth2 $@
注意要加入可执行权限 chmod +x /bin/yt-oauth2
以后下载时只需要这样执行就可以了
yt-oauth2 https://youtu.be/AS3M-x7AeZU
20241112更新
使用oauth2
下载出现400错误
完蛋,看了几条相关的issue,oauth2马上要下线,要么冒险用cookie,要么换回代理的方法。
参考资料:
-
https://github.com/yt-dlp/yt-dlp/issues/10128
-
https://github.com/coletdjnz/yt-dlp-youtube-oauth2/tree/master