PycURL надає підтримку FTP і SOCKS з libcurl через один дескриптор передавання. Під час пасивного 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 — це URL FTP-ресурсу програми, а output — уже відкритий двійковий потік виводу. Тайм-аути — це прикладні межі, які вибирають за очікуваним розміром файлу та з'єднанням. Для публічного FTP-ресурсу, де дозволені публічні посередники, список проксі SOCKS5 пропонує кандидатів для URL проксі; перевірте, що вибраний вузол дозволяє і керівну, і пасивну адресу даних.

socks5h передає розв'язання імені хоста призначення проксі SOCKS. NOPROXY навмисно порожній, щоб успадкована змінна середовища no_proxy не обходила маршрут цього передавання.

Залиште активний FTP вимкненим: він очікує вхідного з'єднання від сервера й недоступний у цьому режимі проксі. Політика вихідних з'єднань проксі має дозволяти керівний порт FTP і пасивний порт даних, вибраний для передавання. Тож сам лише успішний вхід не доводить, що файл можна завантажити.

Коли потрібна автентифікація, використовуйте PROXYUSERNAME і PROXYPASSWORD із PycURL для посередника; облікові дані FTP-сервера належать FTP-з'єднанню.

Схожі статті