Парсинг / RPA-автоматизация

Birthday

Birthday это десктопная платформа, которая круглосуточно мониторит спортивные события, извлекает данные по предстоящим матчам и автоматически доставляет готовые аналитические карточки подписчикам в Telegram. Система ведет три вида спорта (футбол, хоккей, теннис) плюс отдельный женский теннисный поток, собирая по каждому матчу состав, коэффициенты букмекеров, время начала с поправкой на часовой пояс города проведения и даты рождения ключевых игроков. Собранные данные прогоняются через расчетную Excel-модель, результат рендерится в изображение и рассылается целевой аудитории полностью без участия оператора.
C# WPF

Задача

Исходный процесс целиком держался на ручном труде и не масштабировался. Ежедневно требовалось вручную обходить спортивный портал, находить матчи с уже подтвержденными составами, заходить на карточки игроков, выписывать даты рождения и коэффициенты, переносить все в расчетную таблицу, формировать итоговое изображение и вручную отправлять его аудитории. Цикл занимал несколько часов в день, плохо тиражировался на три вида спорта одновременно, а любая задержка приводила к тому, что событие успевало начаться раньше публикации. Нужна была система, которая выполняет весь цикл самостоятельно, работает без присмотра в режиме 24/7 и сохраняет работоспособность при постоянных изменениях верстки источника.

Решение

Создано автономное Windows-приложение, закрывающее полный цикл: обнаружение события, многошаговый сбор данных, расчет и доставка. Приложение работает как фоновый сервис с иконкой в системном трее, периодически опрашивает источник по таймеру, отбирает только матчи с подтвержденными составами и для каждого проходит цепочку страниц (лента событий, сводка матча, составы, персональные карточки игроков). Извлеченные данные нормализуются, передаются в Excel-модель с VBA-макросами, итоговый блок выгружается как изображение и рассылается по нужному каналу Telegram. Параллельно ведется накопление статистики в посуточных книгах Excel и журналирование всех операций с цветовой разметкой прямо в интерфейсе.

Архитектура и сложности

Основная инженерная ценность проекта в устойчивости к нестабильному внешнему источнику и в надежной круглосуточной эксплуатации.
Сбор данных с динамического источника и защита от редизайнов. Портал отдает контент через JavaScript и использует ротируемые, обфусцированные имена классов, а его верстка периодически меняется. Чтобы данные продолжали собираться, для каждого значимого поля (коэффициенты, дата и время, город проведения, возраст игрока) реализована цепочка из нескольких независимых стратегий поиска, покрывающих и старую, и новую верстку портала. Связка управляемого Chrome через Selenium и быстрого разбора DOM через HtmlAgilityPack дала скорость и точность одновременно. За счет многоуровневых селекторов система пережила несколько редизайнов источника без правок кода и простоя.
Идемпотентность и доставка ровно один раз. Каждое обработанное событие фиксируется в реестре обработанных идентификаторов с разбивкой по дате, виду спорта и потоку. Это гарантирует, что одно событие попадает в рассылку строго один раз, даже при перекрытии циклов опроса или перезапуске приложения.
Автоматизация Excel через COM Interop. Расчетная часть построена на готовой Excel-модели с VBA-макросами, которая вызывается из C# через COM. Реализованы управление жизненным циклом COM-объектов, корректное освобождение ресурсов и принудительная зачистка зависших процессов Excel, что критично для стабильной работы без утечек памяти в режиме 24/7. Готовый блок таблицы рендерится в растровое изображение через буфер обмена.
Многопоточное планирование без гонок. Параллельно работают три независимых конвейера: текущие события, отдельный женский теннисный поток и историческая дозагрузка за последние 7 дней. Каждый конвейер защищен неблокирующей синхронизацией (Monitor.TryEnter), что исключает наложение запусков по таймеру и повторную обработку.
Нормализация времени и Telegram-интеграция. Время начала матчей приводится к единому виду по справочнику городов с раздельными летними и зимними поправками, редактируемому прямо в интерфейсе. Доставка построена на нескольких ботах с маршрутизацией по виду спорта, самостоятельной регистрацией подписчиков через опрос обновлений с сохранением offset и загрузкой изображений.
Отказоустойчивость эксплуатации. Сбой на отдельном матче изолируется и не останавливает конвейер, состояние и настройки переживают перезапуск, развертывание оформлено инсталлятором NSIS с автозапуском.

Результат

  • Ежедневный многочасовой ручной процесс сведен к нулю участия оператора: весь цикл от обнаружения события до доставки выполняется автоматически.
  • Система обрабатывает сотни матчей в сутки по трем видам спорта и четырем каналам рассылки одновременно.
  • Круглосуточная автономная работа с самовосстановлением: ошибка на одном событии не влияет на остальной конвейер.
  • Доставка строго один раз на событие благодаря устойчивой дедупликации с сохранением состояния.
  • Многоуровневые селекторы обеспечили работу через несколько редизайнов источника без вмешательства в код.
  • Историческая дозагрузка за 7 дней закрывает пропуски и поддерживает полноту накапливаемой статистики.

Стек

C#, .NET Framework 4.8, WPF с кастомными XAML-стилями и интеграцией в системный трей, Selenium WebDriver, HtmlAgilityPack, Microsoft Excel Interop (COM) и VBA, Telegram Bot API, Newtonsoft.Json, AutoItX и InputSimulator, многопоточность на Timer и Monitor, NSIS для инсталлятора. 
Сюда Туда