Expired Hunter

Командный сервис мониторинга дроп-доменов с real-time коллаборацией как в Google Docs — парсит выдачу, ведёт pipeline покупки и не палится на анти-бот защите.

Проблема

Команда из 5–10 линкбилдеров вручную мониторит expireddomains.net по немецким зонам (.de/.at/.ch). Нет координации — двое параллельно изучают один домен. Pipeline ведётся в Google Sheets ручным копированием. Конкуренты с автоматизацией забирают лучшие дропы за минуты. Аккаунт регулярно банят за скрейпинг.

Решение

Self-hosted веб-приложение: автопарсер с человекоподобной анти-бот стратегией, командный pipeline в реальном времени через SSE, интеграция с Telegram и Google Sheets. Один сервер на Hetzner, два поддомена с HTTPS.

5–10
юзеров работают синхронно, без рассинхрона
~1000
активных доменов в БД
24
скана в сутки в рабочем окне
1 сервер
0 микросервисов, 0 Redis, 0 Kafka

Стек технологий

Node.js (ESM)ExpressReact 18ViteTanStack Table v8SQLite (better-sqlite3)Server-Sent EventsTelegram Bot APIGoogle Sheets APIcheerioaxiosPM2nginx

Автоматический сбор доменов

Программа сама заходит на expireddomains.net 24 раза в сутки в рабочее окно (10:00–20:00 по Берлину), с разными интервалами — чтобы выглядеть как живой человек. Работает через один жилой прокси, сохраняет сессию между заходами и подделывает отпечаток браузера.

Этапы работы над доменом

Каждый домен проходит путь: в работе → на проверке → к покупке → куплен. На любом шаге можно отклонить мусор. Линкбилдеры берут домены в работу и покупают, сеошники проверяют и одобряют — у каждого своя роль.

Совместная работа в реальном времени

Все видят действия друг друга мгновенно. В шапке — аватарки тех, кто сейчас онлайн, как в Google Документах. Как только кто-то открыл домен, для остальных он закрывается — двое не возьмут один и тот же. Один поменял сортировку — таблица перестроилась у всех.

Telegram и Google Таблицы

В Telegram-группе висит закреплённое сообщение со статусом сервиса, приходят уведомления о ходе сбора, туда же бот принимает коды для входа. Как только домен помечен купленным — он сам дописывается в Google Таблицу, подсвечивается зелёным и проверяется на дубли.

нажмите, чтобы увеличить

Обновления в реальном времени. Сервер держит одно постоянное соединение и сам шлёт всем подключённым клиентам новые события. Двусторонняя связь тут не нужна — команды от пользователя идут обычными запросами, а такой канал проще и стабильнее.

Мгновенный отклик интерфейса. Клик сразу меняет картинку на экране, а настоящий запрос на сервер уходит чуть позже. Если человек быстро тыкает по нескольким доменам — отправляется только последнее действие, лишнее отменяется. Это убрало «ложные блокировки», когда устаревшее событие перетирало свежее.

Один домен — один человек. Когда кто-то берёт домен, система сначала снимает все его прошлые «брони», потом ставит новую — одной неделимой операцией. Так никто не запутается, где работает, и не возникает конфликтов при одновременных действиях.

Не теряет прогресс при перезапуске. Ход сбора пишется в базу на каждом шаге. Если сервер перезагрузили — сбор продолжается с того же места, без повторных уведомлений в Telegram.

Точный онлайн-статус. У каждого пользователя три отметки времени: активен во вкладке, просто на связи, вышел. Это решает проблему, что браузер «усыпляет» фоновые вкладки — статус не дёргается между «онлайн» и «офлайн».

Защита от блокировки. Реалистичные заголовки браузера, паузы между запросами как у человека (в среднем 22 секунды, иногда до трёх минут), «разогрев» перед нужной страницей, случайный порядок листания и редкие заходы на посторонние страницы, сохранённая сессия и жилой прокси немецкого региона.

«Совместная работа в реальном времени, как в Google Документах, собрана из самых простых кирпичиков. Никакой сложной математики синхронизации — она тут просто не нужна: люди не правят один и тот же объект вместе, а кликают по разным доменам. Поэтому ощущение живого взаимодействия получилось дать малой кровью — на одном маленьком сервере, на команду из десяти человек и тысячу доменов.»
из заметок по проектуEduRocket

Обсудим ваш проект?

Нужен внутренний инструмент для команды? Свяжитесь с нами!