我正在尝试使用以下命令从YouTube视频中获取音频:
youtube-dl --extract-audio --audio-format mp3 [video link]
每次我尝试在macOS(High Sierra v10.13.2)的终端上运行此命令时,它都会给我这个错误:
ERROR: Unable to download webpage: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)> (caused by URLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)'),))
注意:我安装了youtube-dl,还有Python 2.7和Python 3.6(如果有帮助的话)
如果有人可以帮我解决这个问题,那就太棒了。
答案 0 :(得分:1)
我已经有这个问题了一段时间,但从来没有能够解决它。所以我做了
的临时修复[终端]
- 没有检查证书
可悲的是,这只是将您的HTTPS youtube-dl请求转换为纯文本HTTP请求。
经过一番挖掘后,我发现这是一个Python v3.6问题。
https://bugs.python.org/issue29065#msg283984
如果您使用VIM或任何编辑来检查
vim '/Applications/Python 3.6/ReadMe.rtf'
如果您寻找(证书验证和OpenSSL \) 你会看到......
在安装Python v3.6期间,他们决定使用自己的私有版本的OpenSSL,遗憾的是,它本身不能使用默认的根证书。但是,它附带一个命令脚本来安装一组策略的默认根证书。
该bug推荐我使用python certifi模块。这些模块似乎很适合查找证书的位置。
[Python v3.6]
import certifi
certifi.where()
'/库/框架/ Python.framework /版本/ 3.6 / LIB / python3.6 /站点包/ CERTIFI / cacert.pem'
那真的只是说明了它的位置,但是为了以防万一,我使用了python终端解释器。
[终端]
打开'/ Applications / Python 3.6 /安装Certificates.command'
我个人这是我的终极回应...
[终端]
- pip install --upgrade certifi
要求已经是最新的:/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages中的证书
- 删除任何现有文件或链接
- 创建符号链接到证书证书包
- 设置权限
追踪(最近一次呼叫最后一次):
文件“”,第44行,
文件“”,第40行,主要
PermissionError:[Errno 1]不允许操作:'cert.pem'
注销
保存会话...
...复制共享历史记录......
...保存历史记录...截断历史记录文件...
...完成。
[已完成处理]
但它工作了,我无需处理任何SSL验证失败! (-.-)\ /( - .-)/
答案 1 :(得分:0)
我将尝试针对此问题采取适当的方法,而不仅仅是列出对我有用的方法。以下内容不需要Install Certificates.command
脚本,该脚本可能会或可能不会与Python一起安装。
需要指出的是,错误的根源不是Python本身。仔细查看错误消息,您会发现Python只是传达了OpenSSL库(由_ssl.c调用)产生的错误。如果您使用的Python是使用homebrew安装的,则可能有更多使用自制软件安装的网络实用程序(例如wget
)也有类似的问题。
这意味着为了解决该问题,我们需要确保Python使用的OpenSSL库可以访问有效的最新证书包。
由于系统上可能安装了许多OpenSSL库,因此需要找到Python解释器使用的库。 OpenSSL库由ssl
Python模块加载,因此我们需要首先找到它:
pyssld=$(python3 -c 'import ssl, pathlib; print(pathlib.Path(ssl.__file__).parent)')
echo "$pyssld"
这将打印出目录,我们应该在其中寻找ssl
用来加载OpenSSL的C库。这是通过以下命令完成的:
pyssl=$(find "$pyssld" -iname '*ssl*.so')
echo "$pyssl"
最后,我们可以检查Python ssl
模块加载的OpenSSL库的位置:
pyopenssl=$(otool -L "$pyssl" | grep libssl | awk '{print $1}')
echo "$pyopenssl"
这将打印如下内容:
/opt/homebrew/opt/openssl@1.1/lib/libssl.1.1.dylib
这指向Python使用的OpenSSL库所在的位置。
要获取与OpenSSL库一起使用的最新证书捆绑包,您可以安装Python certifi
软件包。
pip3 install --upgrade certifi
cabundle=$(python3 -c 'import certifi; print(certifi.where())')
echo $cabundle
最后,我们需要将证书捆绑包放在OpenSSL可以找到它的地方。我们知道图书馆的位置。但是捆绑包存储在其他目录中。要跳到正确的目录并链接捆绑软件,请使用:
cd $(echo "$pyopenssl" | sed -E 's%/opt/(openssl[^/]*).*%/etc/\1%')
ln -sf "$cabundle" cert.pem
在检查了一切正常之后,您现在可以清理我们使用的环境变量。
unset cabundle pyopenssl pyssl pyssld