Convertir les entrées IPv4 ip:port:user:password pour Requests
Analysez ip:port:user:password avec un découpage borné et encodez les composants des identifiants avant de construire la carte proxy.
Pour le format IPv4 d'un fournisseur de proxy HTTP ip:port:user:password, convertissez les champs avant de transmettre la valeur à Requests :
from ipaddress import IPv4Address
from urllib.parse import quote
def proxy_map(line):
host, port, user, password = line.rstrip('\r\n').split(':', 3)
host = str(IPv4Address(host))
port = int(port)
if not 1 <= port <= 65535:
raise ValueError('Proxy port is out of range')
credentials = quote(user, safe='') + ':' + quote(password, safe='')
url = f'http://{credentials}@{host}:{port}'
return {'http': url, 'https': url}
Le découpage borné conserve les éventuels deux-points supplémentaires à l'intérieur du mot de passe. Ne retirer que les fins de ligne évite aussi de supprimer silencieusement des espaces qui pourraient appartenir à un identifiant.
Encodez le nom d'utilisateur et le mot de passe comme des composants d'URL distincts. Un @ dans un mot de passe brut ne doit pas être confondu avec le séparateur qui précède l'hôte du proxy. Cette fonction attend des identifiants bruts ; lui passer du texte déjà encodé peut réencoder le signe pour cent.
La carte renvoyée sélectionne ce proxy pour les destinations HTTP et HTTPS. Une clé comme http://192.0.2.10 a un autre sens dans Requests : elle sélectionne une route pour cet hôte de destination. Ce n'est pas un index dans un pool de serveurs proxy.
L'analyseur accepte délibérément uniquement le format IPv4 indiqué. Il ne couvre ni les noms d'utilisateur contenant des deux-points ni les adresses IPv6 sans crochets ; ceux-ci exigent un format d'entrée non ambigu. Gardez les URL générées porteuses d'identifiants hors des journaux habituels.