Um download FTP através de SOCKS com PycURL
Deixe o libcurl tratar da ligação de controlo e da ligação de dados passiva de um download FTP através de um proxy SOCKS5.
O PycURL expõe o suporte de FTP e SOCKS do libcurl através de um único handle de transferência. Num download FTP passivo, a aplicação pode deixar tanto a ligação de controlo como a ligação de dados separada a essa implementação.
import pycurl
transfer = pycurl.Curl()
try:
transfer.setopt(pycurl.URL, ftp_url)
transfer.setopt(pycurl.PROXY, "socks5h://proxy.example.net:1080")
transfer.setopt(pycurl.NOPROXY, "")
transfer.setopt(pycurl.WRITEDATA, output)
transfer.setopt(pycurl.CONNECTTIMEOUT, 10)
transfer.setopt(pycurl.TIMEOUT, 60)
transfer.perform()
finally:
transfer.close()
ftp_url é o URL do recurso FTP da aplicação, e output é um fluxo de saída binário já aberto. Os tempos limite são limites de exemplo a escolher conforme o tamanho de ficheiro e a ligação esperados. Para um recurso FTP público onde são permitidos intermediários públicos, a lista de proxies SOCKS5 oferece candidatos para o URL do proxy; verifique se o nó escolhido permite tanto o destino de controlo como o de dados passivos.
socks5h delega a resolução do nome do anfitrião de destino no proxy SOCKS. NOPROXY está explicitamente vazio para que uma definição de ambiente no_proxy herdada não contorne a rota nesta transferência.
Deixe o FTP ativo desativado: espera uma ligação de entrada do servidor e não está disponível neste modo de proxy. A política de saída do proxy tem de permitir a porta de controlo FTP e a porta de dados passivos escolhida para a transferência. Por isso, um início de sessão bem-sucedido não prova, por si só, que o ficheiro pode ser descarregado.
Quando for necessária autenticação, use PROXYUSERNAME e PROXYPASSWORD do PycURL para o intermediário; as credenciais do servidor FTP pertencem à ligação FTP.