Bcgame
Десктопное приложение на WPF и .NET для полностью автономного управления ставками на спортивной площадке bcgame.st. Система параллельно ведет несколько изолированных браузерных профилей, в реальном времени считывает состояние рынка прямо со страницы и без участия оператора исполняет четыре математически разные стратегии с единым контролем риска. К версии 10.0 проект вырос из разового скрипта в устойчивый многопрофильный движок, который работает сутками, сам восстанавливается после сбоев площадки и не теряет накопленное состояние.
Задача
Площадка отдает весь интерфейс ставок внутри изолированного Shadow DOM стороннего виджета и не предоставляет публичного API. Единственный доступный канал взаимодействия это эмуляция реальных действий пользователя в браузере, что сразу исключает простые HTTP-интеграции.
Ключевые требования к продукту:
- Вести множество аккаунтов одновременно так, чтобы поведение каждого было неотличимо от живого пользователя и не попадало под антифрод-системы площадки.
- Реализовать несколько независимых стратегий, включая арбитражную вилку с расчетом равной доходности по обоим исходам и мартингейл с автоматическим отслеживанием результатов прошлых ставок.
- Обеспечить гибкую настройку лимитов, сумм и таймингов по каждому профилю и общий потолок риска.
- Переживать разрывы соединений, зависания, всплывающие уведомления и изменения верстки площадки без потери состояния и без дублирования ставок.
Решение
Каждый профиль запускается в отдельном антидетект-браузере через локальный automation API. Приложение поднимает профиль, получает порт отладки и подключается к уже работающему браузеру по протоколу CDP через debuggerAddress. Такой подход дает реальные, прогретые отпечатки браузера и полную изоляцию аккаунтов друг от друга.
Для доступа к элементам ставок реализован движок проникновения в Shadow DOM: код достает shadow-root виджета и работает внутри него через XPath и прямое исполнение JavaScript для кликов, что обходит ограничения стандартного поиска Selenium по закрытой DOM-структуре.
Поверх этого построены четыре стратегии с общим жизненным циклом:
- Оригинал. Массовая раскрутка событий с рандомизированными интервалами и счетчиком до целевого количества ставок.
- Мартингейл. Удвоение ставки после проигрыша, при этом результаты читаются прямо из истории ставок на странице с распознаванием выигранных и проигранных позиций.
- Пенальти-фора. Поиск пары взаимодополняющих рынков (фора и победитель) и постановка встречных ставок для хеджирования, с дополнительными случайными ставками для маскировки активности.
- Surebet (FULL-LIMIT). Сканирование рынков тоталов, фор и чет-нечет, расчет ставок на оба исхода для равного выигрыша и постановка обеих ног вилки с настраиваемыми задержками и порогом минимальной доходности.
Состояние каждого профиля (поставленные ставки, обработанные события, суммы, баланс) сериализуется в JSON и переживает перезапуск. Дедупликация по ссылкам событий гарантирует идемпотентность: одно и то же событие не обрабатывается дважды даже после перезагрузки браузера или сбоя.
Архитектура и сложности
Оркестрация и многопоточность. Центральный таймер с интервалом в одну секунду запускает обработку всех активных профилей параллельно через пул задач, при этом два уровня защиты от повторного входа гарантируют, что новый тик не стартует, пока не завершился предыдущий. Это позволяет десяткам профилей работать одновременно, не мешая друг другу и не создавая гонок за общим состоянием.
Работа с закрытым Shadow DOM. Самая трудоемкая часть. Интерфейс площадки полностью инкапсулирован, элементы подгружаются асинхронно и часто перерисовываются. Решение сочетает проникновение в shadow-root, исполнение кликов через JavaScript и многократные ожидания с повторными попытками, что делает взаимодействие стабильным даже при медленной загрузке и динамической верстке.
Математика арбитража. Для surebet-стратегии реализован расчет распределения банка между двумя исходами так, чтобы выигрыш был одинаковым независимо от результата, с округлением ставок и вычислением процентной доходности. Из всех найденных пар рынков движок выбирает вариант с максимальной доходностью и отсекает заведомо убыточные.
Отказоустойчивость. Каждый сетевой и UI-вызов обернут в циклы повторов и обработку исключений, предусмотрена плановая перезагрузка браузеров по таймеру для борьбы с утечками памяти и зависаниями, реализован тестовый режим для проверки логики без реальных ставок. Сериализация состояния выполняется с защитой от конфликтов доступа к файлу.
Интерфейс. Полностью кастомная тема WPF: собственные стили для всех контролов, таблиц и панелей, динамическое переключение форм настроек под выбранную стратегию, живой цветной лог событий с автопрокруткой и ограничением размера.
Результат
- Полностью автономная работа без оператора: после настройки профилей система ведет ставки сутками напролет, доведя ручной труд до нуля.
- Параллельное ведение множества аккаунтов в одном приложении при полной изоляции отпечатков и состояния каждого профиля.
- Четыре готовые стратегии с индивидуальной настройкой, переключаемые на лету, включая автоматический переход с одной стратегии на другую по достижении заданного баланса.
- Высокая устойчивость к сбоям площадки: разрывы, зависания и изменения верстки обрабатываются автоматически, без потери данных и без дублирования ставок.
- Зрелость продукта подтверждается итеративным развитием до версии 10.0 с накопленной поддержкой тысяч обрабатываемых событий на профиль и стабильной многомесячной эксплуатацией.
Стек
C#, .NET Framework 4.8, WPF (XAML, кастомные стили и шаблоны контролов), Selenium WebDriver, Chrome DevTools Protocol через подключение по debuggerAddress, интеграция с антидетект-браузером по локальному automation API, HtmlAgilityPack для парсинга разметки, Newtonsoft.Json для персистентности состояния, асинхронная модель на Task и Timer с защитой от повторного входа.
