PycURL expón a compatibilidade de libcurl con FTP e SOCKS mediante un único identificador de transferencia. Nunha descarga FTP pasiva, a aplicación pode deixar tanto a conexión de control como a conexión de datos separada a esa implementación.

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 aplicación, e output é un fluxo de saída binario xa aberto. Os tempos de espera son límites de exemplo que se deben escoller segundo o tamaño de ficheiro e a conexión previstos. Para un recurso FTP público onde se permiten intermediarios públicos, a lista de proxies SOCKS5 ofrece candidatos para o URL do proxy; comproba que o nodo elixido permita tanto o destino de control como o de datos pasivos.

socks5h delega a resolución do nome de host de destino no proxy SOCKS. NOPROXY está explicitamente baleiro para que un axuste de ambiente no_proxy herdado non evite a ruta desta transferencia.

Deixa o FTP activo desactivado: espera unha conexión entrante do servidor e non está dispoñible con este modo de proxy. A política de saída do proxy debe permitir o porto de control FTP e o porto de datos pasivos elixido para a transferencia. Polo tanto, un inicio de sesión correcto por si só non demostra que o ficheiro se poida descargar.

Cando se requira autenticación, usa PROXYUSERNAME e PROXYPASSWORD de PycURL para o intermediario; as credenciais do servidor FTP pertencen á conexión FTP.

Artigos relacionados