Curl cffi

Материал из Неолурк, народный Lurkmore
Перейти к навигации Перейти к поиску

curl_cffi — это попытка прикрутить к Питону мощь и славу curl (точнее, его библиотеки libcurl) через механизм CFFI (C Foreign Function Interface), который позволяет питонячьему скрипту дёргать Си-шные функции, делая вид, что так и было задумано. Главная фишка и причина существования сего творения — возможность прикидываться браузером на уровне TLS-рукопожатия, обходя хитрожопые защиты, которые палят стандартные питонячьи SSL/TLS-стеки за версту.

Зачем и почему?[править]

Представь себе типичную ситуацию: некий школьник или быдлокодер решает накодить скрипт для парсинга котиков (или чего поинтереснее, вроде курсов крипты или цен на аниме-фигурки) с очередного сайтеца. Он берёт свой любимый requests, пишет три строки кода и… получает кукиш с маслом. Сайт, защищённый какой-нибудь вундервафлей типа Cloudflare, вежливо посылает его куда подальше, определив по уникальному отпечатку пальца TLS-хендшейка, что перед ним не хомо сапиенс с Хромом последней версии, а жалкий бот на питоне.

Тут-то на сцену и выходит наш герой — curl_cffi. В отличие от стандартных питоньих библиотек, которые используют свои, зачастую палящиеся реализации TLS (вроде OpenSSL в стандартной комплектации), curl_cffi тащит за собой libcurl. А libcurl, в свою очередь, может быть скомпилирован с использованием тех же TLS-библиотек, что и браузеры (например, BoringSSL, форк OpenSSL от Google, используемый в Chrome). При правильной настройке (или просто удачном стечении обстоятельств и версии библиотеки) curl_cffi может сгенерировать TLS-рукопожатие, неотличимое от браузерного (привет, JA3/JA4 и прочие акронимы из трёх/четырёх букв!).


В результате сервер думает, что к нему ломится обычный юзер, и невозбранно отдаёт контент. Лулз в том, что это вечная игра в кошки-мышки: завтра Cloudflare выкатит новую проверку, послезавтра обновятся браузеры и их отпечатки, и придётся снова обновлять curl_cffi или искать новый, ещё более хитрый велосипед.

Альтернативы и перспективы[править]

Конечно, curl_cffi — не единственный способ борьбы с ветряными мельницами веб-защит. Есть старый добрый Selenium или более модный Playwright, которые запускают полноценный браузер. Но это тяжеловесно, медленно и жрёт память как не в себя. Есть хардкорный pycurl — прямые биндинги к libcurl без CFFI-прослойки, но с ещё более вырвиглазным API. Есть даже попытки патчить стандартные библиотеки или использовать нодовские поделия через subprocess.

Movax1010h.png Глубокий смысл скрыт в этих неестественных языках
Языки программированияПромышленные: BATC#CC++JavaJavaScript (AJAX) • PascalPerlPHPPythonRubyABAPАссемблерВасикFortran (Профессор)
Эзотерические: BrainFuckHQ9++ErlangForthHaskellLISP (My other car) • PrologTclΤΕΧOracleMySQLGolangВ++Scala
ПрофессииБыдлокодерПрограммистТестировщикХакерХеллоуворлдщикIT-звёздыПрограммист (существо)Тернарный операторUnreal MCP
Методы и стилиReverse EngineeringАнти-паттернВыстрелить себе в ногуГрязный хакКод (индусский) • КостыльМетод научного тыкаПомолясьСвистелки и перделкиОчередьСпортивное программированиеОбфускацияБета-тестАльфа-тестШаблоныRegReplaceФреймворкБыдлокодIndex.phpОхота за жукамиКуМирКлеточный автоматПроцедурное программированиеПоиск файлов в Unix по содержимомуPetoohФункция активации нейронаПерегрузка операторов в PythonЗерокодинг
Средства разработкиSublime TextПодсветка синтаксиса кодаUnstable DiffusionAPIPythonTutorCodeWarsDataCampUnity3DКнижный PythonMallocСвязный списокSOLIDООПУказательNULLWeLang++XenonRecompFuse.js
ЛюдиИлья КанторЮрий КлючевскийЭдуард ЛаасЭдвард СноуденСеймур Пейперт
Прочее++i + ++iДедлайн%s640 килобайтCMSDummy modeЕГГОГFoobarGod is real, unless explicitly declared as integerGOTOIfconfigKISSRegExpSICPsql.ruXyzzyДискетаИнжалид дежицеКОИ-8ЛогМанРекурсияСУБДТест ТьюрингаУмение разбираться в чужом кодеФаза ЛуныФатальный недостатокПроблема 2000ТаймстампКэшЗапись в файл без кэша (Perl)Танцы с бубномКодачХукCurl cffi