Ký tự đặc biệt trong mật khẩu proxy
Mã hóa riêng tên người dùng và mật khẩu proxy để @, dấu hai chấm, dấu gạch chéo và # không làm hỏng URL.
Mật khẩu chứa @ hoặc # có thể làm hỏng URL proxy ghép thủ công dù thông tin xác thực đúng. Các ký tự này đã có ý nghĩa trong URL, nên client có thể phân tích một phần mật khẩu thành tên máy chủ hoặc fragment.
Mã hóa riêng hai trường thông tin xác thực
Ví dụ này giữ nguyên dấu phân cách cấu trúc URL và chỉ mã hóa tên người dùng cùng mật khẩu:
from urllib.parse import quote
username = "user@team"
password = "p:a/ss#?"
proxy_url = (
"http://"
+ quote(username, safe="")
+ ":"
+ quote(password, safe="")
+ "@203.0.113.10:8080"
)
Dùng điểm cuối và thông tin xác thực thực tế của bạn. Địa chỉ hiển thị là ví dụ tài liệu. Đối số safe rỗng rất quan trọng: quote thường để dấu gạch chéo không được escape, nhưng dấu gạch chéo trong trường xác thực này phải được mã hóa.
Đừng mã hóa toàn bộ URL proxy. Mã hóa dấu phân cách lược đồ và @ giữa thông tin xác thực với máy chủ sẽ phá cấu trúc bạn muốn giữ. Cũng tránh mã hóa lần hai mật khẩu đã được mã hóa.
Dùng kết quả với Requests
import requests
response = requests.get(
"https://example.com/",
proxies={"http": proxy_url, "https": proxy_url},
timeout=(5, 15),
)
response.raise_for_status()
Nếu yêu cầu vẫn thất bại, kiểm tra proxy từ chối đăng nhập hay client đã thất bại sớm hơn khi phân tích hoặc kết nối. Thách thức xác thực 407 và URL không hợp lệ là hai lỗi khác nhau.
HTTPX có thể giữ xác thực riêng biệt
Đối tượng Proxy của HTTPX có thể nhận điểm cuối và thông tin xác thực bằng các đối số riêng:
import httpx
proxy = httpx.Proxy(
"http://203.0.113.10:8080",
auth=("user@team", "p:a/ss#?"),
)
with httpx.Client(proxy=proxy, trust_env=False, timeout=15) as client:
response = client.get("https://example.com/")
response.raise_for_status()
Nhờ đó bạn không phải tự tạo phần userinfo. Nó không mã hóa bảo mật thông tin xác thực độc lập với kết nối proxy, cũng không chọn phương thức xác thực được mọi dịch vụ hỗ trợ.
Nếu danh sách miễn phí chỉ cung cấp IP và cổng, ví dụ này không cung cấp thông tin xác thực mặc định. Chỉ dùng xác thực khi bên vận hành thực sự cấp tài khoản. Không đưa URL chứa thông tin xác thực vào log dùng chung hay tệp mã nguồn.