公司代理要一个账号,它后面的网站要另一个账号。Requests 为这两个 Basic 登录提供了分开的入口:代理 URL 中的凭据,以及请求的 auth 参数。

from urllib.parse import quote
import requests

proxy_url = (
    f"http://{quote(proxy_user, safe='')}:"
    f"{quote(proxy_password, safe='')}@proxy.example:8080"
)
response = requests.get(
    "https://reports.example/private/",
    proxies={"https": proxy_url},
    auth=(site_user, site_password),
    timeout=(5, 20),
)
response.raise_for_status()

四个账号变量来自应用的凭据配置。分别对代理用户名和密码做编码可以保留 at 符号这类字符,而不会把它们变成 URL 分隔符。

字典中的 https 键为 HTTPS 目标选择这条路由。它的值仍以 http:// 开头,因为访问这个示例代理用的就是这个协议。

对这个 HTTPS 请求来说,代理登录属于 CONNECT 交换;网站登录属于隧道建立之后的那次请求。让适配器从自己的 URL 推导代理授权,认证就留在相关的那一跳上;这个 Basic 场景不需要合并的认证类。

407 表示中间方的质询。来自网站的 401 表示目标方的质询。用这个响应判断两个已配置账号中哪一个需要处理。

相关文章