Specialtecken i proxylösenord
Koda proxyanvändarnamn och lösenord var för sig så att @, kolon, snedstreck och # inte förstör URL:en.
Ett lösenord med @ eller # kan förstöra en handbyggd proxy-URL även när inloggningsuppgifterna är rätt. Tecknen har redan betydelse i en URL, så klienten kan tolka en del av lösenordet som värdnamn eller fragment.
Koda de två fälten med inloggningsuppgifter var för sig
Det här exemplet bevarar URL:ens strukturella avgränsare och kodar bara användarnamn och lösenord:
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"
)
Använd din faktiska ändpunkt och dina inloggningsuppgifter. Adressen som visas är ett dokumentationsexempel. Det tomma argumentet safe är viktigt: quote lämnar normalt ett snedstreck oförändrat, men i det här fältet måste det kodas.
Koda inte hela proxy-URL:en. Kodning av schemats avgränsare och @ mellan uppgifter och värd förstör strukturen du ville bevara. Undvik också att koda ett redan kodat lösenord en gång till.
Använd resultatet med Requests
import requests
response = requests.get(
"https://example.com/",
proxies={"http": proxy_url, "https": proxy_url},
timeout=(5, 15),
)
response.raise_for_status()
Om förfrågan fortfarande misslyckas, undersök om proxyn avvisar inloggningen eller klienten misslyckades tidigare vid tolkning eller anslutning. En 407-autentiseringsutmaning och en ogiltig URL är olika fel.
HTTPX kan hålla autentiseringen åtskild
Ett HTTPX Proxy-objekt kan ta ändpunkt och inloggningsuppgifter som separata argument:
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()
Då behöver du inte bygga userinfo-delen själv. Det krypterar inte uppgifterna oberoende av proxyanslutningen och väljer ingen autentiseringsmetod som alla tjänster stöder.
Om en gratislista bara anger IP och port ger det här exemplet inga standarduppgifter för inloggning. Använd autentisering bara när operatören faktiskt tillhandahåller ett konto. Lägg inte URL:er med inloggningsuppgifter i delade loggar eller källfiler.