Um conector ciente de SOCKS para soquetes TCP do Python
Escolha um conector de soquete ciente de proxy e mantenha seu escopo separado da implementação de soquete de todo o processo do Python.
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.