Завантаження FTP через SOCKS із PycURL
Дозвольте libcurl керувати керівним і пасивним з'єднанням даних під час FTP-завантаження через проксі SOCKS5.
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-з'єднанню.