youtube-dl 通过代理(需要转义@符号)

youtube-dl 通过代理(需要转义@符号)

我正在尝试在 Windows 7 中使用 youtube-dl,使用下面的命令。

youtube-dl.exe --proxy "http://a12345:A@[email protected]:8080/" https://www.youtube.com/watch?v=XzZJuEDQ1a0

用户名:a12345

密码:A@1

代理:proxy.com

以下是我收到的回复。

  [youtube] Confirming age
    WARNING: Unable to confirm age: <urlopen error [Errno 10013] An attempt was made
     to access a socket in a way forbidden by its access permissions>
    [youtube] XzZJuEDQ1a0: Downloading webpage
    ERROR: Unable to download webpage: <urlopen error [Errno 10013] An attempt was m
    ade to access a socket in a way forbidden by its access permissions> (caused by
    URLError(error(10013, 'An attempt was made to access a socket in a way forbidden
     by its access permissions'),))

我怀疑它是密码中的 @ 符号,但我似乎无法逃脱它被视为普通字符。

详细

[debug] 系统配置:[] [debug] 用户配置:[] [debug] 命令行

参数:['--proxy','http://a12345:A%[电子邮件保护]:8080/',

https://www.youtube.com/watch?v=2bZd5r0iPGc', '--verbose'] [调试]

编码:locale cp1252、fs mbcs、out cp437、pref cp1252 [调试]

youtube-dl 版本 2014.11.27 [调试] Python 版本 2.7.8 -

Windows-7-6.1.7601-SP1 [调试] exe 版本:ffmpeg N-68102-,ffprobe N-68102- [调试] 代理图:{u'http':'http://a12345:A%[电子邮件保护]:8080/', u'https':

http://a12345:A%[电子邮件保护]:8080/'} [youtube] 确认年龄

警告:无法确认年龄:

尝试以访问方式被禁止的方式访问套接字

权限> [youtube] 2bZd5r0iPGc:下载网页错误:无法

下载网页:

以访问权限禁止的方式访问套接字>

(由 URLError(error(10013, '试图访问

以访问权限所禁止的方式访问套接字'),))

文件“youtube_dl\extractor\common.pyo”,第 273 行,位于 _request_webpage

文件“youtube_dl\YoutubeDL.pyo”,第 1321 行,在 urlopen 中
文件“urllib2.pyo”,第 404 行,在 open > 文件“urllib2.pyo”,第 422 行,在 _open 中
文件“urllib2.pyo”,第 382 行,在 _call_chain 中
文件“youtube_dl\utils.pyo”,第 410 行,在 https_open 中 文件“urllib2.pyo”,第 1184 行,在 do_open 中

答案1

您应该按照 URI 标准对@密码中的字符进行编码:%40

http://a12345:A%[email protected]:8080/

由于您报告此操作在 youtube-dl 中不起作用,我认为唯一的解决方法是避免在密码中使用 URI 特殊字符。ALPHA / DIGIT / "-" / "." / "_" / "~"如果可以,请更改密码以包含这些字符。

我不确定问题出在哪里,因为 urllib2 在将密码传递给代理之前取消了对密码的引用:

    if '@' in host:
        user_pass, host = host.split('@', 1)
        user_pass = base64.encodestring(unquote(user_pass)).strip()
        req.add_header('Proxy-Authorization', 'Basic '+user_pass)

并按预期urllib2.unquote("A%401")返回。也许你应该向 youtube-dl 开发人员报告此问题。A@1

答案2

如果您使用应用程序级防火墙,请检查 Youtube-dl 是否被防火墙阻止。由于它没有数字签名,某些防火墙可能会默认阻止它

显示为文件系统访问问题的错误与它是从 unix 移植的应用程序有关,其中网络访问可能表示为文件(我假设您没有对文件系统权限进行任何更改)

https://unix.stackexchange.com/questions/157351/why-are-tcp-ip-sockets-considered-open-files

相关内容