Caractères spéciaux dans les mots de passe de proxy
Encodez séparément le nom d’utilisateur et le mot de passe du proxy pour que @, les deux-points, les barres obliques et # ne cassent pas l’URL.
Un mot de passe contenant @ ou # peut casser une URL de proxy assemblée à la main même si les identifiants sont corrects. Ces caractères ont déjà un sens dans une URL : le client peut donc interpréter une partie du mot de passe comme nom d’hôte ou fragment.
Encoder séparément les deux champs d’identification
Cet exemple préserve les séparateurs structurels de l’URL et encode uniquement le nom d’utilisateur et le mot de passe :
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"
)
Utilisez votre véritable point d’accès et vos identifiants. L’adresse affichée est un exemple de documentation. L’argument safe vide est important : quote laisse normalement une barre oblique non échappée, mais celle de ce champ d’identification doit être encodée.
N’encodez pas toute l’URL du proxy. Encoder les séparateurs du schéma et le @ entre les identifiants et l’hôte détruit la structure que vous vouliez préserver. Évitez aussi d’encoder une seconde fois un mot de passe déjà encodé.
Utiliser le résultat avec Requests
import requests
response = requests.get(
"https://example.com/",
proxies={"http": proxy_url, "https": proxy_url},
timeout=(5, 15),
)
response.raise_for_status()
Si la requête échoue encore, vérifiez si le proxy rejette l’authentification ou si le client a échoué plus tôt, à l’analyse ou à la connexion. Une demande d’authentification 407 et une URL invalide sont deux échecs différents.
HTTPX peut séparer l’authentification
Un objet Proxy de HTTPX peut recevoir le point d’accès et les identifiants comme arguments distincts :
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()
Cela évite de construire vous-même la partie userinfo. Cela ne chiffre pas les identifiants indépendamment de la connexion au proxy et ne choisit pas une méthode d’authentification acceptée par tous les services.
Si une liste gratuite ne fournit qu’une IP et un port, cet exemple ne donne pas d’identifiants par défaut. N’utilisez l’authentification que si l’opérateur fournit réellement un compte. Ne placez pas d’URL contenant des identifiants dans les journaux partagés ni dans les fichiers source.