Как система теперь обходит капчи и читает живые данные с сайтов, которые режут ботов.
integrations/stealth-browser · integrations/flight-search · 2026-06-13Коротко: раньше любой автоматический браузер с нашего VPS упирался в капчу Aviasales и Cloudflare на каждом шагу, а лендинги-агрегаторы кормили приманкой «билет от 97 тысяч», которой в реальности нет. Теперь у системы есть собственный маскирующийся браузер — он проходит эти стены и достаёт настоящие цены по дням.
Сайты вроде Aviasales защищаются от роботов по трём признакам, и нас ловили по всем:
| Признак | Что выдавало нас |
|---|---|
| Отпечаток браузера | headless-режим светит navigator.webdriver=true, нет реального GPU и шрифтов — «я робот» |
| Репутация IP | наш VPS — датацентровый адрес, он у антибота в чёрном списке по умолчанию |
| Капча | как следствие — Yandex SmartCaptcha («выберите автобусы») или Cloudflare «Just a moment» |
Плюс отдельная ловушка: SEO-лендинги (aeroport-*.ru, uniticket) показывают цену «от …» как приманку. Реальная живая цена была вдвое выше — это и был корень неверного ответа в начале.
Каждый слой включается по нарастанию. Главное: первого слоя в одиночку хватило пробить и Aviasales, и aviata.kz прямо с нашего VPS.
Анти-детект Firefox. Подменяет весь отпечаток (webdriver, canvas, шрифты, WebGL),
добавляет человеческое движение курсора, поднимает свой виртуальный экран (Xvfb внутри —
режим headless="virtual"). Для антибота выглядит как обычный человек.
Патченый Playwright Chromium — закрывает утечки, по которым палится обычный
Chrome. Запасной движок, если где-то Firefox не зайдёт. Запускается под xvfb-run.
Меняет датацентровый IP на «домашний». Нужен там, где отпечаток прошёл, а
по IP всё равно режут. Включается одной переменной STEALTH_PROXY.
Пока не заведён — не требуется.
Если капча всё-таки выскочила — отдаёт её решателю (SmartCaptcha / Turnstile),
вставляет токен обратно в страницу. ~$0.5–3 за 1000 решений. Ключ TWOCAPTCHA_KEY.
Резерв на жёсткие цели.
У Aviasales есть легальный партнёрский API (Travelpayouts): бесплатный токен,
отдаёт цены и календарь структурой без всякого браузера и капчи. Это не обход,
а штатный канал. Код готов (flights.api_prices), ждёт только бесплатный токен.
Если бы капча появилась: → прокси (слой 2) → 2captcha (слой 3). На Aviasales до этого не дошло — слой 1 прошёл сам.
| Цель | Защита | Результат через стелс |
|---|---|---|
| aviata.kz | Cloudflare «Just a moment» | ✓ пройдено |
| Aviasales.kz | Yandex SmartCaptcha | ✓ пройдено, цены прочитаны |
| Trip.com | whaleguard | не нужен — задачу закрыл Aviasales |
Достаточно сказать в чат «найди билет … когда дешевле» — подхватывается скилл
flight-search. Под капотом:
# календарь — где в окне дешевле cli.py cal ALA KZN 2306 # прямой+пересадка сразу по нескольким датам cli.py scan ALA KZN 2306 2706 0407 # карточки одной даты: прямой / дешёвый / пересадка + цена «с багажом» cli.py cards ALA KZN 2306
Для любого другого bot-walled сайта — stealth-browser/cli.py URL --wait-text "…".
Полные доки — в integrations/stealth-browser/README.md и
integrations/flight-search/README.md.
Живые цены, добытые новым стеком (а не приманка). Видно главное: прямой рейс дешевле всего 23 июня, и это в окне «конец июня — начало июля».
| Дата | Прямой Red Wings | Прямой + багаж 10 кг | Через Москву (8ч45) |
|---|---|---|---|
| 23 июн (вт) | 147 335 ₸ | 173 807 ₸ | — |
| 27 июн (сб) | 195 832 ₸ | 224 899 ₸ | 187 544 ₸ |
| 30 июн (вт) | 229 698 ₸ | — | 209 953 ₸ |
| 4 июл (сб) | 195 832 ₸ | — | 187 544 ₸ |
Прямой Red Wings летает по вторникам и субботам, 3 ч 40 мин, Sukhoi Superjet 100. Дешёвые «103 738» с лендингов — это рейс 19 часов через Екатеринбург, не прямой.
| Компонент | Стоимость |
|---|---|
| camoufox / patchright / Xvfb | бесплатно (open-source) |
| Официальный API Travelpayouts | бесплатно (нужен токен) |
| Резидентный прокси (слой 2) | ~$2–5/ГБ или ~$30–50/мес, по факту |
| 2captcha (слой 3) | ~$0.5–3 за 1000 решений, по факту |
Платные слои не тратят ничего, пока не заданы их env-ключи. Сейчас всё работает на бесплатном слое 1.