Sonderzeichen in Proxy-Passwörtern
Proxy-Benutzername und Passwort getrennt kodieren, damit @, Doppelpunkte, Schrägstriche und # die URL nicht beschädigen.
Ein Passwort mit @ oder # kann eine von Hand zusammengesetzte Proxy-URL beschädigen, obwohl die Zugangsdaten stimmen. Diese Zeichen haben in einer URL bereits eine Bedeutung; der Client kann deshalb Teile des Passworts als Hostnamen oder Fragment auswerten.
Die beiden Zugangsdatenfelder getrennt kodieren
Dieses Beispiel lässt die strukturellen Trennzeichen der URL unverändert und kodiert nur Benutzername und Passwort:
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"
)
Verwenden Sie Ihren tatsächlichen Endpunkt und Ihre Zugangsdaten. Die gezeigte Adresse ist ein Dokumentationsbeispiel. Das leere Argument safe ist wichtig: quote lässt einen Schrägstrich normalerweise unmaskiert, innerhalb dieses Zugangsdatenfelds muss er aber kodiert werden.
Kodieren Sie nicht die gesamte Proxy-URL. Wer die Schematrennzeichen und das @ zwischen Zugangsdaten und Host kodiert, zerstört die zu bewahrende Struktur. Vermeiden Sie auch, ein bereits kodiertes Passwort ein zweites Mal zu kodieren.
Das Ergebnis mit Requests verwenden
import requests
response = requests.get(
"https://example.com/",
proxies={"http": proxy_url, "https": proxy_url},
timeout=(5, 15),
)
response.raise_for_status()
Scheitert die Anfrage weiterhin, prüfen Sie, ob der Proxy die Anmeldung ablehnt oder der Client schon früher beim Parsen oder Verbinden gescheitert ist. Eine 407-Authentifizierungsanforderung und eine ungültige URL sind unterschiedliche Fehler.
HTTPX kann die Authentifizierung getrennt halten
Ein HTTPX-Proxy-Objekt kann Endpunkt und Zugangsdaten als getrennte Argumente annehmen:
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()
Dadurch müssen Sie den userinfo-Teil nicht selbst aufbauen. Die Zugangsdaten werden damit weder unabhängig von der Proxyverbindung verschlüsselt noch wird eine von jedem Dienst unterstützte Authentifizierungsmethode gewählt.
Liefert eine kostenlose Liste nur IP und Port, stellt dieses Beispiel keine Standardzugangsdaten bereit. Verwenden Sie Authentifizierung nur, wenn der Betreiber tatsächlich ein Konto bereitstellt. URLs mit Zugangsdaten gehören nicht in gemeinsam genutzte Logs oder Quelldateien.