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.

Bài viết liên quan