PycURL と SOCKS による FTP ダウンロード
libcurl に FTP ダウンロードの制御接続とパッシブデータ接続を SOCKS5 プロキシ経由で処理させます。
PycURL は libcurl の FTP と SOCKS のサポートを 1 つの転送ハンドルで公開します。パッシブ FTP ダウンロードでは、制御接続と別個のデータ接続の両方をその実装に任せられます。
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 はアプリケーションの FTP リソース URL、output はすでに開かれたバイナリ出力ストリームです。タイムアウトは、想定されるファイルサイズと接続に応じて選ぶ例示的な上限です。公的な仲介業者が認められる公開 FTP リソースでは、SOCKS5 プロキシ一覧がプロキシ URL の候補を提供します。選んだノードが制御先とパッシブデータ先の両方を許可するか確認してください。
socks5h は宛先ホスト名の解決を SOCKS プロキシに委ねます。NOPROXY を明示的に空にするのは、継承された no_proxy 環境設定がこの転送の経路を迂回しないようにするためです。
アクティブ FTP は無効のままにしてください。サーバーからの着信接続を前提とし、このプロキシモードでは利用できません。プロキシの送信ポリシーは、FTP 制御ポートと転送用に選んだパッシブデータポートの両方を許可する必要があります。したがって、ログインの成功だけではファイルをダウンロードできることの証明になりません。
認証が必要な場合は、仲介業者に対して PycURL の PROXYUSERNAME と PROXYPASSWORD を使います。FTP サーバーの資格情報は FTP 接続に属します。