Znaki specjalne w hasłach proxy
Koduj osobno nazwę użytkownika i hasło proxy, aby @, dwukropki, ukośniki i # nie uszkodziły URL.
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.