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.

Artigos relacionados