Задание для ИИ-агента: подключить Live 3D Tracker
Назначение документа
Этот файл содержит задание для ИИ-агента, который должен подключить Live 3D Tracker к существующему сайту или веб-приложению клиента.
Выполни интеграцию в соответствии с архитектурой и стилем проекта. Не изменяй существующие функции, дизайн и структуру проекта без необходимости.
Что нужно получить перед началом
Изучи проект и найди или запроси у пользователя:
- Страницу или компонент, где должен отображаться трекер.
- Ключ доступа вида
pk_live_..., выданный менеджером SportAPI. - Рабочий или тестовый домен, активированный для этого ключа.
- Источник данных спортивной линии SportAPI.
- Поле
zpв данных выбранного матча. - ID вида спорта из таблицы ниже.
- Нужный язык интерфейса.
- Требования к высоте и мобильному отображению.
Если ключ или другие обязательные данные отсутствуют, не придумывай их. Подготовь интеграцию с понятными переменными-заполнителями и сообщи пользователю, какие данные ещё нужно получить.
Для получения ключа и активации домена пользователь должен обратиться к
менеджеру SportAPI в Telegram. Для локальной
разработки менеджеру нужно отдельно сообщить, что ключ должен работать на
localhost.
Основные правила
- Трекер работает только для матчей в статусе live.
- Трекер не предоставляет спортивную линию и список матчей.
- Для получения данных матчей и поля
zpнужна подписка на спортивную линию SportAPI. - Значение параметра
gameidвсегда берётся из поляzp:gameid = zp. - Если
zpотсутствует или равноnull, трекер для матча недоступен. Не создавай пустой виджет. - Передавай правильный ID вида спорта в параметре
sport. - Доступные виды спорта и языки могут быть ограничены тарифом ключа.
- Ключ можно использовать в клиентском коде: он защищён привязкой к разрешённым доменам.
- Не добавляй нестандартные параметры оформления и не изменяй дизайн трекера. Индивидуальные визуальные доработки выполняет SportAPI по отдельному заказу.
Демонстрация
Внешний вид трекера можно посмотреть на демонстрационной странице.
Демонстрация не использует реальные live-данные и не заменяет проверку
интеграции на live-матче, у которого zp не равно null.
Коды видов спорта
| ID | Вид спорта |
|---|---|
| 1 | Футбол |
| 2 | Хоккей |
| 3 | Баскетбол |
| 4 | Теннис |
| 5 | Бейсбол |
| 6 | Волейбол |
| 7 | Регби |
| 8 | Гандбол |
| 10 | Настольный теннис |
| 13 | Американский футбол |
| 17 | Водное поло |
| 21 | Дартс |
| 26 | Формула-1 |
| 28 | Австралийский футбол |
| 44 | Скачки |
| 66 | Крикет |
| 86 | CS:GO / киберспорт |
Не предполагай, что внутренний ID спорта в проекте клиента совпадает с ID в этой таблице. Если проект использует свои идентификаторы, создай явное соответствие.
Выбор способа подключения
Используй прямой iframe, если требуется простое отображение одного матча и
проекту не нужно сложное управление виджетом.
Используй embed.js, если пользователь переключает матчи на одной странице или
проекту нужно управлять стандартными параметрами через JavaScript.
Способ 1. Прямой iframe
Базовый пример:
<iframe
id="live-tracker"
src="https://bet-embed-sport-tracker.vercel.app/?key=pk_live_yourkey&gameid=745829876&sport=1&lang=ru"
style="width: 100%; height: 360px; border: none; display: block;"
allowfullscreen
title="Live tracker"
></iframe>
Стандартные параметры адреса:
key— ключ клиента;gameid— значение поляzp;sport— ID вида спорта;lang— язык интерфейса;mobile=1— мобильное отображение;view=2dилиview=3d— доступный режим отображения.
Самый простой способ сменить матч — изменить gameid и sport в src
элемента iframe.
Матч также можно сменить без перезагрузки iframe через postMessage. Отправляй
сообщение только после загрузки iframe или по действию пользователя:
const trackerFrame = document.querySelector('#live-tracker');
let trackerLoaded = false;
trackerFrame.addEventListener('load', () => {
trackerLoaded = true;
});
function switchMatch(gameid, sport) {
if (!trackerLoaded) return;
trackerFrame.contentWindow.postMessage(
{
type: 'CONFIG',
payload: { gameid, sport }
},
'https://bet-embed-sport-tracker.vercel.app'
);
}
Не используй '*' в качестве targetOrigin.
Способ 2. Подключение через embed.js
Загрузчик:
https://bet-embed-sport-tracker.vercel.app/embed.js
Базовый пример:
<div id="zone"></div>
<script src="https://bet-embed-sport-tracker.vercel.app/embed.js"></script>
<script>
let trackerReady = false;
window.addEventListener('message', (event) => {
if (event.origin !== 'https://bet-embed-sport-tracker.vercel.app') return;
if (event.data?.type === 'READY') {
trackerReady = true;
}
});
const zone = BetZoneEmbed.init({
container: '#zone',
key: 'pk_live_yourkey',
gameid: 745829876,
sport: 1,
lang: 'ru',
height: 360
});
function switchMatch(gameid, sport) {
if (!trackerReady) return;
zone.update({ gameid, sport });
}
function switchLanguage(lang) {
if (!trackerReady) return;
zone.update({ lang });
}
</script>
Не вызывай zone.update() сразу после init(). В этот момент iframe ещё может
загружаться, поэтому сообщение будет потеряно. Вызывай update() после получения
READY или позже по действию пользователя.
Стандартные параметры init():
| Параметр | Обязательный | Тип | По умолчанию | Назначение |
|---|---|---|---|---|
container | да | string или Element | — | контейнер для виджета |
key | да | string | — | ключ доступа |
gameid | да | number | — | значение поля zp |
sport | да | number | — | ID вида спорта |
lang | нет | string | ru | язык интерфейса |
height | нет | number | 360 | высота в пикселях |
mobile | нет | boolean | false | мобильная раскладка |
Метод update() позволяет изменить gameid, sport, lang, mobile и
view без пересоздания виджета.
Когда компонент или блок трекера удаляется со страницы, вызови:
zone.destroy();
React, Vue, Svelte и другие SPA
При интеграции в SPA:
- Загружай внешний скрипт после монтирования компонента или штатным механизмом фреймворка.
- Не добавляй один и тот же
<script>при каждом рендере. - Не обращайся к
windowи DOM во время серверного рендеринга. - Вызывай
init()только после появления контейнера в DOM и загрузкиembed.js. - Сохраняй объект, возвращённый
init(). - При изменении матча вызывай
update()только после готовности виджета. - При размонтировании вызывай
destroy()и удаляй созданные обработчики событий.
Используй принятые в проекте способы загрузки скриптов, хранения настроек, обработки состояний и адаптивной вёрстки.
Состояния и ошибки
Предусмотри следующие ситуации:
| Ситуация | Действие |
|---|---|
| ключ отсутствует | не запускать виджет; сообщить, какой ключ нужен |
| текущий домен не разрешён или ключ отключён | показать ошибку доступа; сообщить о необходимости обратиться в SportAPI |
ответ 403 | проверить ключ и привязку домена |
| матч не находится в статусе live | не показывать трекер |
zp отсутствует или равно null | не создавать виджет; показать fallback или скрыть блок |
| спорт или язык не входит в тариф | не считать это ошибкой интеграции; сообщить об ограничении ключа |
| пользователь выбрал другой матч | вызвать update() после готовности виджета |
| компонент удалён | вызвать destroy() и удалить обработчики |
Не оставляй бесконечную загрузку. Используй существующие компоненты проекта для загрузки, пустого состояния и ошибок.
Адаптивность
- Ширина трекера должна занимать
100%контейнера. - Рекомендуемая высота — 360–420 px на компьютере.
- Рекомендуемая высота — 220–280 px на мобильном устройстве.
- Для мобильного режима используй
mobile: trueилиmobile=1. - Не фиксируй ширину в пикселях.
Используй breakpoints и дизайн-систему существующего проекта.
Проверка результата
После реализации проверь:
- Виджет загружается на разрешённом домене с действующим ключом.
- При
zp: nullвиджет не создаётся. - Не-live матч не показывает трекер.
- В
gameidпередаётся значение поляzp. - Код спорта соответствует таблице или явному отображению ID проекта.
update()не вызывается доREADY.- Матч и язык меняются без полной перезагрузки страницы.
- Прямой iframe принимает
CONFIGтолько после загрузки. - На мобильном и компьютере используются подходящие размеры.
- При повторном монтировании не появляются дубликаты скриптов, iframe или обработчиков.
- При удалении компонента вызывается
destroy(). - Доступные тесты, линтер, проверка типов и сборка проекта проходят успешно.
Если нельзя проверить интеграцию из-за отсутствия ключа, разрешённого домена или
live-матча с zp, выполни все доступные проверки и перечисли, что пользователь
должен проверить после получения доступа.
Формат отчёта пользователю
После завершения сообщи:
- какие файлы были изменены;
- какой способ подключения выбран и почему;
- откуда берутся
gameidиsport; - какие состояния ошибок реализованы;
- какие проверки выполнены;
- какие данные или внешние проверки ещё нужны.
Поддержка SportAPI: @suport_sportapi.