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.

Artigos relacionados