![](https://habrastorage.org/getpro/habr/upload_files/3c6/c47/708/3c6c47708ba457917a6aa5e5a2b85c83.jpg)
Я некоторое время разрабатывал спортсбуки (техническая часть), а также их врагов (парсеры, сканеры, боты для ставок) и решил поделиться опытом.
Данная статья не затрагивает нравственные аспекты данного вида бизнеса, а выполняет исключительно информационную роль.
Спортсбуки должны использоваться только легально.
Английские заимствования будут использованы в данной статье, потому что есть термины, точных и кратких переводов которые на русский язык не существует.
Краткий глоссарий
Спортсбук (sportsbook) - обычно сайт (хотя есть и сервисы, предоставляющие данные услуги по API), позволяющий делать ставки на спортивные события
Market (market line) - определенный тип ставок. Например, ставки на то, кто выиграет в матче. Или больше или меньше 3 голов в сумме будет забито.
Outcome - конкретный исход. То, на что принимаются ставки. Например - победит вторая команда.
Settlement - фиксация результата для конкретного исхода. Может быть проигрыш / выигрыш / возврат денег (если матч, например, перенесен). Очень редко бывает еще полупроигрыш и полувыигрыш на определенных маркетах.
Юридическая сторона
Открывать спортсбук в России очень дорого и даже опасно для жизни, если только у тебя нету своего губернатора с карманным СОБРом. Работать в других странах намного проще. Для этого нужно приобрести игровую лицензию. Самые недорогие лицензии предоставляет государство Кюрасао, они позволяет работать во многих странах мира. Каким образом лицензия, выданная на Кюрасао, позволяет принимать ставки от игроков, скажем, в Португалии вопрос лично для меня непонятный, но тем не менее это так. Лицензии на Мальте или Сейшелах стоят значительно дороже. В то же время, получение лицензии это даже не половина, а меньшая часть правовой работы. Приобрести лицензию за 20-30 тысяч долларов предлагают многие фирмы. Но большой вопрос, сможете ли вы после этого открыть банковский счёт. Я знал один спортсбук, который получил лицензию Кюрасао и потом целый год не мог открыть счёт ни в одном банке. Говорят, что это зависит от того, кто именно тебе выписал данную лицензию.
Без банковского счёта ты не сможешь принимать нормально депозиты от игроков. Единственный вариант - работать с криптовалютой.
Если есть лицензия, то можно открыть фирму и счет на Кипре. На эту фирму можно открыть бизнес-аккаунт (merchant account) PayPal и принимать депозиты через PayPal по всему миру. Об этом "сером" лайфхаке мало кто знает, но он реально работает.
Для чего нужна лицензия? Она как бы подтверждает, что ты работаешь законно. Она позволяет игрокам жаловаться на тебя твоему лецензиару, если ты что-то неправильное с ними сделал. И тот, кто выдал тебе лицензию, как бы должен разбираться в каждой такой жалобе. На самом деле лицензия нужна только для подключения сервис провайдеров, например, PayPal или Betradar. Они её требуют. В остальном технически работа с лицензией и без оной не различаются. Юридически, за то, что ты принимаешь ставки от игроков из США, ты можешь попасть под большой штраф, который, скорей всего, станет для тебя фатальным.
Принимать ставки можно только от тех лиц, которые находятся на территории, на которой спортсбуку разрешено вести деятельность его лицензией. Каждая лицензия определяет географическое положение игроков, от которых ты можешь принимать ставки. В США это дополнительно делится по штатам, каждый штат отдельно лицензирует игровую деятельность. Ответственность за соблюдение данных ограничений лежит на владельце спортсбука.
Бизнес-план
В среднем порядочные спортсбуки имеют от 1% до 5% маржи с оборота. То есть, если за месяц у них было ставок на миллион долларов, то у них от 10 до 50 тысяч дохода. Минимум половина его идёт на маркетинг (аффилиатам), остальное распределяется на другие расходы и зарплату. Каких-то космических заработков там нет. Опять-таки, если спортсбук порядочный, и в пределах указанного выше оборота.
Более того, если бизнес собственник "правильный", с белым воротничком, набравший инвестиции и следующий своему бизнес-плану, то каждый месяц нужно еще докладывать из своих минимум тысяч 10-20.
Для того, чтобы при таком обороте спортсбук сам себя окупал, необходима более эффективная маркетинговая политика, более грамотный менеджмент, необходимо снижать расходы по поставщикам услуг (это тоже возможно вполне). Тогда при таком объёме вполне возможно честно выйти из минуса.
Оборот миллион в месяц для игроков из "богатых" стран - это порядка 20-70 активно играющих пользователей.
Маркетинг в этой сфере довольно жёсткий. Нам предлагали трафик с Фейсбука по цене 1000 рублей за клик. Только за клик. Это на рынках типа США или Великобритания. Надежней работать с аффилиатами по схеме revenue share, либо каким-то другим способом.
Бывают случаи когда какие-то игроки выигрывают много денег и хотят их вывести. Тут либо компания платит и банкротится, либо не платят, либо что-то еще. Таких игроков не более 2% от общего числа, поэтому если им не заплатить, то, в принципе, репутация компании не сильно пострадает. Если так не делать, то необходим достаточно большой запас денег первоначальных инвестиций.
Причины не заплатить обычно находятся. Это может быть bonus abuse (злоупотребление бонусами - мудрёные правила использования бесплатного сыра), это могут быть подозрения в бонусхантинге, это может быть multi-accounting (регистрация нескольких аккаунтов) - всё это обычно прописывается далеко не мелким шрифтом в "Terms and Conditions" спортсбука. Ну и классические: "Ты виноват лишь в том, что хочется мне кушать", тоже никто не отменял. Опять же, зависит от того как игрок себя ведет. Хотя не могу сказать, что был свидетелем хоть одного такого явно наглого кидания.
Нужно сказать, что выбор игроком спортсбука для того, чтобы на нём играть, несмотря на большое их количество на рынке, довольно сложный. Даже если ты не униженный и оскорблённый житель Российской Федерации, а вполне уважаемый американец с документами, резиденством в разрешенном для гемблинга штате и деньгами, который хочет просто ставить ставки по нескольку сотен или тысяч долларов и выигрывать или проигрывать, - найти удобный спортсбук, чтобы заниматься этим любимым тебе делом, весьма проблематично.
Поэтому когда появляется какой-нибудь спортсбук, пусть даже он небольшой и малоизвестный, но на нем удобно играть, люди будут на нем играть несмотря на то что есть монстры типа DraftKings или Fanduel, которые 100% платят, не кидают и всё такое, но есть определённые неудобства по которым игроки выбирают другой спортсбук. Причём величина коэффициентов ставок здесь находится далеко-далеко не на первом месте. За коэффициентами бегают только "вилочники", ну и, в принципе, люди которые пытаются сделать на коэффициентах копейки. Обычные азартные игроки выбирают спортсбук по другим принципам.
Сервис провайдеры
При работе спортсбука необходимы сервисы нескольких типов от различных сторонних поставщиков. Во-первых, это коэффициенты для ставок. Самый крупный в мире поставщик данных для ставок это сербский Betradar (торговая марка Sportradar). У него за прематч и лайв небольшой спортсбук будет отдавать поначалу 10-15 тысяч долларов в месяц, что может оказаться довольно неподъемными деньгами. Второй вариант это израильский LSports. Там цены примерно в 2-3 раза ниже, но и качество, мягко говоря, не очень. Betradar начинал со скрэпинга (парсинга страниц) коэффициентов с больших спортсбуков для создания своей базы, но сейчас, скорее всего, он уже использует взаимовыгодные прямые обмены данными со спортсбуками и является официальным партнером различных американских ассоциаций, проводящих спортивные турниры.
LSport скрэпит другие спортсбуки для получения данных, в результате чего случаются ошибки. Несмотря на то, как сильно они рекламируют себя и свое качество, ошибки случаются довольно часто и, причём, иногда очень неприятные. Например, они могут поменять местами фаворита и аутсайдера в гандикапе, что как бы даёт игрокам почти стопроцентный выигрыш на этой ставке. Часто подобные ошибки проходят довольно незаметно, но иногда на такие исходы можно получить несколько десятков тысяч долларов ставок и дальше начинается кошмар. Их можно все отменить с ссылкой на явную техническую ошибку, но тогда ты теряешь на своей репутации. Большие спортсбуки иногда платят за свои, естественно, очень редкие технические ошибки и делают на этом хороший пиар.
Кроме того, технически модель данных Betradar намного более грамотней и профессиональней чем у LSports, который как будто бы разрабатывал код на коленке сперва, а потом всё разрослось до большой какой-то системы, которая, такое ощущение, и дальше продолжает развиваться на коленке, вернее, уже на нескольких.
Интеграцию с Betradar можно запустить и забыть о ней на несколько месяцев. С LSports надо постоянно проверять валидность данных. Качество сервиса Betradar на порядок, если не больше, выше. Не реклама.
Есть ещё несколько компаний которые предлагают коэффициенты для ставок, но у них охват и качество услуг еще ниже. Скорей всего, они точно также скрэпят сайты спортсбуков. Самое главное в этих данных не столько коэффициенты, которые ты сам можешь спарсить с какого-то одного большого спортсбука, который считается надёжным, а результаты исходов событий. По всем исходам, на которые ты получаешь коэффициенты для ставок, ты затем получаешь результат его, исход этого события, settlement. Который нужен, чтобы определить выигрышность или проигрышность сделанных на этот исход ставок. То есть, для маркета 1x2 (победа-ничья-проигрыш) ты получаешь результат какой исход случился = какая команда выиграла, или случилась ли ничья. Так вот у LSports, например, например результаты бокса и MMA ставятся вручную, - то есть там есть специальные люди которые смотрят в интернете результаты и устанавливают исходы в системе руками после завершения спортивного события. А у одного события может быть сотни различных маркетов - к примеру, сколько очков заработал такой-то боец в таком-то раунде. Естественное, это добавляет еще один уровень возможных сбоев.
В принципе, можно большинство маркетов автоматически сетлить самому, если у тебя есть выход на достоверный источник с результатами матчей, со счетами после периодов.
На период интеграции с сервисом тебе могут предоставить некоторое время работы бесплатно либо за небольшие деньги. Но после этого нужно быть готовым ежемесячно платить LSports 5-7 тысяч долларов, и от 10 тысяч у Betradar. Последний сразу требует игровую лицензию для работы, LSports - нет.
Следующая необходимая интеграция - платёжной системы. Интеграция с крипто провайдером, - например, Coinbase - достаточно проста. То же самое можно сказать о PayPal - это дает, в принципе, довольно большой охват для приёма денег. Если есть желание принимать ещё больше вариантов оплаты, например, банковские переводы, кредитные карты, какие-то локальные для конкретной страны денежные системы, электронные кошельки, - то их можно интегрировать либо самостоятельно по одному, либо есть сервисы типа MoneyMatrix (очень плохой опыт), которые предоставляют тебе на сайт свой платежный виджет лил возможность интеграции по API, и которые могут обрабатывать огромное количество способов оплаты, но за это ты должен будешь отчислять им от 5 до 15% с каждой транзакции плюс ещё что-то помесячно.
Другие интеграции с сервисами типа Mailchimp для маркетинга или геолокации для KYC уже опциональны и зависят от выбранной бизнес-модели.
Техническая сторона
Google Play не позволяет разместить приложение для ставок на спорт в своём магазине. Разместить в AppStore подобное приложение невероятно трудно и дорого даже при наличии всех лицензий. Поэтому разумность разработки мобильных приложений для спортсбука под большим вопросом. Если у тебя уже есть бизнес с оборотом каждый месяц в несколько десятков миллионов долларов, тогда ты можешь потратиться на мобильное приложение, которое будут загружать с какого-то отдельного места твои пользователи, и оно будет просто удостоверять, что у тебя денег куры не клюют. В обычном случае достаточно вебсайта в виде PWA, который прекрасно ставится на Android или iOS, работает и выглядит как приложение, и обладает всеми полезными фишками progressive web application. Не говоря уже о том, что это сильно снижает затраты на разработку и сопровождение. Да, у мобильных приложений есть свои плюсы, но цена за них оказывается космической. Это мое субъективное мнение.
Данные Betradar'а идеально ложатся на реляционную модель данных, но нужна оптимизация, чтобы справиться c нагрузкой, потому как поток данных идет бесперебойно. Оба поставщика используют RabbitMQ как канал для передачи данных.
Технический стек спортсбука каждый выбирает под себя. Обычно это SPA, хотя я видел сайты, написанные на jQuery и шаблонах Laravel. Для себя я выбрал Vue.js и CodeIgniter для backend API. С RabbitMQ работает Java.
Заголовок статьи подразумевает описание непосредственно ПО, но особой специфики для спортсбука как программного обеспечения нет - функционал системы должен отражать бизнес требования. Показ данных по событиям, прием ставок. Отдельное внимание надежности и безопасности.
Многие интерпренеры, сами игроки, желающие заиметь свой собственный спортсбук, сразу бегут к вебдизайнерам, чтобы он сделал тот идеальный лук, который привлечет сразу толпу игроков. В итоге получается, обычно, ужасно. Спустив почти половину бюджета на дизайн, они после этого идут к программерам и просят "оживить" статичный фигмовый холст.
Забавный факт - самый крупный спортсбук в США Fanduel до недавнего времени был написан на Vue.js и работал не сказать чтобы быстро, но работал. Летом прошлого года у него с помпой провели глобальную рефакторизацию на фронтенде, поменяли структуру, немножко дизайн, но, главное, переписали всё на Реакте. После этого сайт стал тормозить просто безбожно, что все заметили. Конечно, надо смотреть откуда у разработчиков руки растут, но как-бы факт такой есть.
Безопасность
Как-то в один прекрасный день я заметил какие-то непонятные изменения в базе данных в таблицах пользователей и финансовых транзакций. Понадобилось ещё достаточно времени перед тем как созрела уверенность, что нас взломали. Начались поиски бэкдоров. Были пролопачены логи Apache и базы данных. Выяснилось, что нас сканировали и попытались проломить через веб-сервер в течение нескольких недель. В конце концов, скорее всего вход был найден на одном из эндпоинтов бэкенда, который должен был использоваться только для Бэкофиса. Это была загрузка картинок администраторами. Хакер загрузил PHP shell и получил полный доступ к серверу и базе данных. Хотя это не точно.
Вместо того, чтобы закрыть всё сразу, было решено дать возможность хакеру действовать дальше, чтобы выяснить наши слабые места и впоследствии их залатать. Примерно неделю-две после этого хакер работал, а я за ним следил. Он знал, что я нахожусь в европейской зоне и работал по ночам, поэтому приходилось вставать в 3 утра и в режиме реального времени следить за его действиями. Сперва казалось, что он просто увеличивает баланс каким-то пользователям, которых он зарегистрировал, и пытается вывести через них криптовалюту. Но оказалось, что это было просто прикрытие. На самом деле он заменил в коде наш Coinbase ID, таким образом что при депозите у пользователя открывалась не Coinbase страница нашего аккаунта, а его, которая полностью повторяла нашу с нашим логотипом, нашим именем. И пользователь депозитил деньги на его криптовалютный кошелёк. Одновременно с этим он присылал нам через вебхук либо напрямую редактированием базы данных устанавливал информацию об успешно проведённой транзакции депозита. Таким образом он получил несколько тысяч долларов депозитов наших клиентов. Которые, естественно, стали нашими потерями.
Я полагаю это одна из самых распространенных схем для кражи денег с сайтов, которые принимают криптовалюту. Coinbase ID он менял в коде сайта на сервере, причем делал это автоматически каждые 30 минут (чтобы схема работала и после апдейта сайта). Я пытался использовать auditd чтобы найти источник этих изменений, но при изменении файла стирались и логи auditd.
Хакер был очень толковый, но, как мне кажется, молодой. Действуя грамотней он мог бы нанести нам намного больше монетизируемого вреда. По моим оценкам, он был из Ливии. Ликвидация взлома заняла почти месяц, и ее описание достойно отдельной статьи. К примеру, можно рассказать, что у нас был закрытый телеграм-канал специально для технических сообщений с сервера - уведомления и алёрты. Он нашел в коде бэкенда ключи к телеграм-боту канала, подключился к нему и читал все относящиеся к его действиям алёрты.
Это был очень интересный и полезный опыт. Намного более ценный, чем та сумма, что он украл. После были предприняты дополнительные меры безопасности. Например, после апдейта сайта его код копируется в скрытое место, и каждую минуту происходит пофайловое сравнение текущего вебсайта с сохраненным. Ну и в потерях как бы человеческий фактор присутствовал - вина человека, ответственного за финансовые операции, который довольно долгое время не смотрел аккаунт Coinbase, на который перестали поступать депозиты.
После того, как я выяснил где и как примерно он пробирался на сайт, что именно он менял в коде (хотя и не до конца), я перекрыл ему все найденные лазейки.
Ещё несколько дней он неудачно пытался пролезть, а затем написал мне в телеграм:
![](https://habrastorage.org/getpro/habr/upload_files/67d/16b/619/67d16b619deb370524db0d0b4eceaf40.png)
Еще скриншоты
![](https://habrastorage.org/getpro/habr/upload_files/358/531/72b/35853172b082b3a0fa817f8cb719fdb7.png)
![](https://habrastorage.org/getpro/habr/upload_files/558/0ba/440/5580ba4405cd872f9b367188d08b63ca.png)
![](https://habrastorage.org/getpro/habr/upload_files/bee/36d/4a4/bee36d4a45ad0a080c0997c78b13668c.png)
![](https://habrastorage.org/getpro/habr/upload_files/1e0/b57/92c/1e0b5792c539a8ffe1349b45ee32627c.png)
Интересно, что поиск по mox5500 (у нас его не было) выдаёт на Гитхабе аккаунт с кучей репозиториев с "хакерским" софтом
Мы предложили ему работу, связанную с безопасностью, но он отказался. Хакер - птица свободного полета, поэтому он улетел. Но обещал вернуться.