Um soquete Python bruto não negocia proxy só porque http_proxy existe. Para um aplicativo que fala seu próprio protocolo TCP, use um conector que entenda o serviço no ponto final do proxy.

Com o PySocks já disponível, crie a conexão explicitamente:

import socks

with socks.socksocket() as connection:
    connection.set_proxy(socks.SOCKS5, '203.0.113.10', 1080)
    connection.settimeout(10)
    connection.connect(('example.com', 12345))
    # Exchange the destination protocol here.

Substitua o endereço de documentação e a porta de destino. Para um destino público permitido, selecione um candidato da lista de proxies SOCKS5 somente depois de verificar que ele permite a porta de destino do aplicativo. Verifique o pacote instalado, os métodos suportados e os requisitos do ponto final em relação à interface do PySocks.

O restante do aplicativo troca seu protocolo por esta conexão estabelecida. Se esse protocolo usar TLS, inicie-o após a negociação do proxy e verifique o nome real do host de destino. A autenticação do proxy estabelece a rota; ela não fornece o login do destino nem criptografia.

Um listener SOCKS precisa de negociação SOCKS. Um serviço HTTP precisa de um conector compatível com CONNECT para um destino TCP arbitrário e pode negar sua porta. Escolha o conector a partir do serviço realmente oferecido, em vez de mudar um endereço deixando o handshake errado.

Mantenha a substituição local. Atribuir uma classe a socket.socket pode afetar importações e bibliotecas não relacionadas. Se outra biblioteca controla a criação de soquetes, use a fábrica de conexões ou a opção de proxy documentada por ela; um dicionário que ela nunca lê não pode alterar essa conexão.

Artigos relacionados