Hasło zawierające @ lub # może uszkodzić ręcznie złożony URL proxy, nawet jeśli dane logowania są poprawne. Te znaki mają już znaczenie w URL, więc klient może odczytać część hasła jako nazwę hosta lub fragment.

Koduj dwa pola danych logowania osobno

Ten przykład zachowuje strukturalne separatory URL i koduje tylko nazwę użytkownika oraz hasło:

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"
)

Użyj rzeczywistego punktu końcowego i danych logowania. Pokazany adres jest przykładem dokumentacyjnym. Pusty argument safe ma znaczenie: quote zwykle pozostawia ukośnik bez escapowania, ale w tym polu musi on zostać zakodowany.

Nie koduj całego URL proxy. Zakodowanie separatorów schematu i @ między danymi logowania a hostem niszczy strukturę, którą chcesz zachować. Nie koduj także już zakodowanego hasła po raz drugi.

Użyj wyniku z Requests

import requests

response = requests.get(
    "https://example.com/",
    proxies={"http": proxy_url, "https": proxy_url},
    timeout=(5, 15),
)
response.raise_for_status()

Jeśli żądanie nadal zawodzi, sprawdź, czy proxy odrzuca logowanie, czy klient zawiódł wcześniej podczas parsowania lub łączenia. Wyzwanie uwierzytelniające 407 i nieprawidłowy URL to różne błędy.

HTTPX może oddzielić uwierzytelnianie

Obiekt Proxy w HTTPX może przyjąć punkt końcowy i dane logowania jako osobne argumenty:

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()

Dzięki temu nie trzeba samemu budować części userinfo. Nie szyfruje to danych logowania niezależnie od połączenia z proxy ani nie wybiera metody uwierzytelniania obsługiwanej przez każdą usługę.

Jeśli darmowa lista podaje tylko IP i port, ten przykład nie zapewnia domyślnych danych logowania. Używaj uwierzytelniania tylko wtedy, gdy operator naprawdę daje konto. Nie umieszczaj URL z danymi logowania we współdzielonych logach i plikach źródłowych.

Powiązane artykuły