Converter entradas IPv4 ip:port:user:password para o Requests
Separe ip:port:user:password com uma divisão limitada e codifique os componentes das credenciais antes de montar o mapa de proxy.
No formato IPv4 ip:port:user:password de um provedor de proxy HTTP, converta os campos antes de entregar o valor ao 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}
A divisão limitada preserva quaisquer dois-pontos adicionais dentro da senha. Remover apenas os fins de linha também evita retirar silenciosamente espaços que podem pertencer a uma credencial.
Codifique o nome de usuário e a senha como componentes de URL separados. Um @ numa senha bruta não deve ser confundido com o separador antes do host do proxy. Esta função espera credenciais brutas; passar texto já codificado pode codificar o sinal de porcentagem outra vez.
O mapa retornado seleciona este proxy para destinos HTTP e HTTPS. Uma chave como http://192.0.2.10 tem outro significado no Requests: ela seleciona uma rota para esse host de destino. Não é um índice para um conjunto de servidores proxy.
O analisador aceita intencionalmente o formato IPv4 indicado. Ele não cobre nomes de usuário com dois-pontos nem endereços IPv6 sem colchetes; esses exigem um formato de entrada sem ambiguidade. Mantenha URLs geradas com credenciais fora dos logs rotineiros.