gpt4 book ai didi

python - 请求库 https 通过代理获取导致错误

转载 作者:行者123 更新时间:2023-11-28 21:57:40 25 4
gpt4 key购买 nike

尝试通过代理发送一个简单的获取请求。我有“Proxy-Authorization”和“Authorization” header ,我认为我不需要“Authorization” header ,但还是添加了它。

import requests
URL = 'https://www.google.com'
sess = requests.Session()
user = 'someuser'
password = 'somepass'
token = base64.encodestring('%s:%s'%(user,password)).strip()
sess.headers.update({'Proxy-Authorization':'Basic %s'%token})
sess.headers['Authorization'] = 'Basic %s'%token
resp = sess.get(URL)

我收到以下错误:

requests.packages.urllib3.exceptions.ProxyError: Cannot connect to proxy. Socket error: Tunnel connection failed: 407 Proxy Authentication Required.

但是,当我将 URL 更改为简单的 http://www.google.com 时,它工作正常。

代理是否使用 Basic、Digest 或其他类型的 https 身份验证?它是代理服务器特定的吗?我如何发现该信息?我需要使用请求库来实现这一点。

更新

似乎对于 HTTP 请求,我们必须传入 Proxy-Authorization header ,但对于 HTTPS 请求,我们需要使用用户名和密码格式化代理 URL

#HTTP
import requests, base64
URL = 'http://www.google.com'
user = <username>
password = <password>
proxy = {'http': 'http://<IP>:<PORT>}
token = base64.encodestring('%s:%s' %(user, password)).strip()
myheader = {'Proxy-Authorization': 'Basic %s' %token}
r = requests.get(URL, proxies = proxies, headers = myheader)
print r.status_code # 200


#HTTPS
import requests
URL = 'https://www.google.com'
user = <username>
password = <password>
proxy = {'http': 'http://<user>:<password>@<IP>:<PORT>}
r = requests.get(URL, proxies = proxy)
print r.status_code # 200

发送 HTTP 请求时,如果我省略 header 并传入一个格式为 user/pass 的代理,我会收到 407 响应。

发送 HTTPS 请求时,如果我传入 header 并使代理未格式化,我会收到前面提到的 ProxyError。

我正在使用 requests 2.0.0 和一个 Squid 代理缓存网络服务器。为什么 header 选项不适用于 HTTPS?为什么格式化的代理不适用于 HTTP?

最佳答案

答案是 HTTP 案例被窃听了。这种情况下的预期行为与 HTTPS 情况相同:即,您在代理 URL 中提供您的身份验证凭据。

header 选项对 HTTPS 不起作用的原因是通过代理的 HTTPS 完全与通过代理的 HTTP 不同。当您通过代理路由 HTTP 请求时,您实际上只是向代理发送一个标准的 HTTP 请求,其中包含一个指示完全不同主机的路径,如下所示:

GET http://www.google.com/ HTTP/1.1
Host: www.google.com

然后代理基本上转发这个。

对于不可能工作的 HTTPS,因为您需要与远程服务器协商 SSL 连接。您没有像 HTTP 情况那样做任何事情,而是使用 CONNECT 动词。代理服务器代表客户端连接到远程端,并从他们那里代理 TCP 数据。 (更多信息 here .)

当您将 Proxy-Authorization header 附加到 HTTPS 请求时,我们不会将其放在 CONNECT 消息中,而是将其放在隧道 HTTPS 消息中。这意味着代理永远看不到它,因此拒绝您的连接。我们对代理 URL 中的身份验证信息进行特殊处理,以确保它将 header 正确附加到 CONNECT 消息。

Requests 和 urllib3 目前正在讨论这个 bug 修复的正确位置。 GitHub 问题目前是 here .我希望在下一个 Requests 版本中修复。

关于python - 请求库 https 通过代理获取导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19530793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com