Создать игру для TikTok в Combos
Сделаем Gift Arena: стример сражается с боссом, а зрители помогают энергией, лечением и атаками. Вы получите полный проект, локальный симулятор подарков, шаги публикации в Combos и порядок регистрации для настоящих подарков TikTok. Используется Combos SDK 1.1.0.
Играть в демо · Скачать полный проект
Сейчас нет доступного процесса активации реального взаимодействия TikTok. Можно разрабатывать, симулировать подарки и публиковать игру в Combos; публикация поста не включает настоящие подарки. Материалы интеграции и проверка LIVE готовят будущую активацию платформой, а не заявку, которую можно завершить сейчас.
1. Объявить подарки как игровые эффекты
Сначала определите правила, затем пишите подключение. Игрок начинает с 70 здоровья и 40 энергии, босс — со 100 здоровья. Атака расходует 10 энергии и наносит 10 урона. Выживший босс отвечает уроном 8. Зрители помогают тремя эффектами:
| Подарок в игре | Постоянная instruction | count = "1" | count = "3" |
|---|---|---|---|
| Батарея | gift_battery | +20 энергии | +60 энергии |
| Лечение | gift_heal | +15 здоровья | +45 здоровья |
| Вспышка | gift_flash | −10 здоровья босса | −30 здоровья босса |
// rules.js — this game's contract
export const GIFT_CATALOG = Object.freeze({
gift_battery: { target: 'energy', perCount: 20, max: 100 },
gift_heal: { target: 'hp', perCount: 15, max: 100 },
gift_flash: { target: 'bossHp', perCount: -10, max: 100 },
});Это объявление находится в коде вашей игры. Оно не является вызовом регистрации SDK или каталогом TikTok. Батарея, Лечение и Вспышка — названия эффектов примера, а не настоящие имена или ID подарков TikTok. Не считайте, что Роза или определённая цена автоматически соответствуют эффекту.
Пример принимает целое количество от 1 до 1000, ограничивает здоровье и энергию значением 100, а здоровье босса снизу — нулём. Подарки не расходуют ход. Эффект на предельном значении считается успешным, даже если число больше не растёт. После победы или поражения новые команды возвращают false до следующего раунда. Это правила примера, не ограничения платформы. Продумайте накопление, перезарядку, переходы между раундами и дорогие эффекты и передайте те же правила настройщику соответствий.
2. Разделить обязанности игры и платформы
Зритель → настройка подарков TikTok → Combos → SDK onCommand → эффект в игре → логический результат → Combos → ACK TikTok.
| Ответственный | Задача |
|---|---|
| Игра | Объявить инструкции, выполнить и сохранить эффекты, исключить повторы, вернуть фактический результат |
| Хост Combos и SDK | Вход, привязка запуска, обновление сессии, передача, heartbeat, переподключение и отправка результатов |
| Представители Combos / TikTok | Зарегистрировать вход в игру и разрешённые аккаунты, настроить запуск и соответствие настоящих подарков инструкциям |
Настроенное взаимодействие может дать instruction: "gift_flash", count: "3"; игра наносит 30 урона. count — количество команд после преобразования, не цена в монетах и не обязательно число подарков. Уточните и преобразование комбо при регистрации. Игра не должна самостоятельно читать launchData, подписывать запросы TikTok, создавать отдельный WebSocket или реализовывать webhook.
3. Реализовать контракт команд
type TTLiveCommand = {
messageId: string;
instruction: string;
count: string;
timestamp: string;
};| Поле | Обработка |
|---|---|
messageId | Непрозрачный ключ дедупликации; одно сообщение не применяет эффект дважды |
instruction | Точное соответствие вашему каталогу; неизвестные инструкции отклонять |
count | Строка десятичного целого; проверить и ограничить безопасным диапазоном до преобразования в Number |
timestamp | Время исходной команды в строке; не удостоверение личности, не ключ дедупликации и не гарантия порядка |
В публичной команде нет ID или имени зрителя и ID настоящего подарка. Нельзя строить рейтинг зрителей на полях, которых API не предоставляет.
Возвращайте true после подтверждённого сохранения эффекта, false при определённом отказе, а при неизвестном результате выбрасывайте исключение, например при ошибке хранения. Неизвестный результат не подтверждается и может быть доставлен повторно. Нельзя превращать все ошибки в успех или неопределённое частичное выполнение в подтверждённый отказ.
SDK повторно отправляет ожидающие результаты внутри документа. Игра должна обрабатывать и перезагрузку страницы. Пример сохраняет состояние и результат сообщения одной транзакцией IndexedDB и возвращает значение только после её завершения. Дубликат получает сохранённый результат. Новый раунд сохраняет квитанции. LIVE-данные разделены по аккаунту/игре Combos и отделены от тренировки.
Читать состояние соединения
getTTLiveClient() возвращает один клиент на документ игры. getLiveStatus() проверяет состояние, а onStatusChange() сразу сообщает текущее, затем изменения. Состояние содержит state, reason, action, confirmedAtMs: время последнего подтверждённого старта/heartbeat в миллисекундах, 0 означает неизвестность.
connecting: начало соединения.connected: сессия взаимодействия подтверждена.recovering: дождаться переподключения SDK.unknown: нет текущего подтверждения; это не означает завершение трансляции.ended: сессия взаимодействия завершена. Следоватьaction:wait,none,relaunch_game. Для последнего заново открыть эту игру из LIVE Studio, а не перезапускать трансляцию из-за проблемы соединения.
4. Запустить полный проект
Подготовка и запуск
Скачайте и распакуйте ZIP. Нужны современный браузер и Python 3 для локального статического сервера; Node и npm не нужны. Сохраните структуру папки tiktok-arena:
cd tiktok-arena
python3 -m http.server 8080 --bind 127.0.0.1Откройте http://127.0.0.1:8080/ и нажмите Начать тренировку. Не открывайте index.html двойным щелчком: модулям JavaScript нужен HTTP. Онлайн-демо работает без установки. Игра поддерживает те же десять языков, что и сайт.
| Файл | Назначение |
|---|---|
rules.js | Каталог эффектов, бой, проверка количества и дедупликация |
storage.js | Атомарное сохранение состояния и квитанций |
connection.js | Возможности SDK, вход, соединение и отмена |
game.js | Общий обработчик LIVE/тренировки и интерфейс |
index.html, style.css, draw.js, i18n.js | Разметка, canvas и интерфейс на десяти языках |
Три воспроизводимых демо
Начинайте каждую из первых двух строк с нового раунда. Третья продолжает вторую без сброса. Начальные значения: здоровье 70, энергия 40, босс 100. Каждая кнопка подарка создаёт новое сообщение; Повторить последнее сообщение использует тот же ID.
| Демо | Действия | Ожидаемый результат |
|---|---|---|
| Отдельные подарки | Количество 1, затем Батарея, Лечение, Вспышка | Энергия 60, здоровье 85, босс 90; все результаты true |
| Комбо и повтор | Количество 3, Вспышка и Повторить | Босс остаётся на 70 после обеих доставок; вторая true, duplicate: true |
| Восстановление и отказ | Перезагрузить, начать тренировку, повторить; затем Неизвестная команда | Босс всё ещё 70; неизвестная команда false, состояние не меняется |
Проверьте 0, 1.5, 1001, 9007199254740993: без эффекта, с false. Победите в новом раунде Вспышкой ×10 и отправьте новый подарок — он будет отклонён до следующего раунда. Используйте Атаку и Заряд для обычного боя. Панель доставки показывает вход, результат и итоговые значения. Синтетические локальные команды не покупают подарки и не отправляют ACK TikTok.
5. Подключить ту же игру в Combos
Сохраните connection.js и game.js при публикации. Combos внедряет window.combos; дополнительный npm SDK или второй скрипт SDK не нужен. Кнопка Подключить Combos LIVE:
- Вызывает
init()и проверяет возможностьgetTTLiveSessionи getter клиента. Название возможности не является публичным методом для прямого вызова. - Выполняет
checkSession()и при необходимостиlogin()из нажатия. Отмена останавливает процесс, успех продолжает то же действие. - Использует
getUserInfo()для разделения локальных сохранений. ID не являются секретными учётными данными или доказательством серверных прав. - Подписывается на состояние и вызывает
getTTLiveClient().connect({ onCommand })с обработчиком тренировки. - Оставляет Отключить / отменить доступной при повторах подключения. При отмене и выходе отписывается и вызывает
disconnect().
Этот основной код уже есть в архиве; полная версия также обновляет интерфейс. store.update() — транзакция из storage.js, не API SDK:
import { executeCommand } from './rules.js';
// `store` is the account/game-scoped store opened by prepareStore().
function commandHandler(store) {
return async (command) => {
const { result } = await store.update((saved) =>
executeCommand(saved, command),
);
return result; // State + receipt committed; no catch-and-return-false.
};
}connect() может долго оставаться в ожидании при повторах. Разрешённый Promise ещё не доказывает, что настоящий подарок сработал. LIVE скрывает кнопки симуляции. Проверяйте видимый эффект и результат в зарегистрированной сессии.
6. Опубликовать в Combos
Установите официальный Combos CLI . Нажмите Сохранить обложку PNG, поместите cover.png рядом с папкой tiktok-arena. Из родительской папки выполните:
combos --version
combos account login
combos post create --dir ./tiktok-arena --title 'Gift Arena' --cover ./cover.png --platform pc --screen-orientation landscape --allow-recommend=false
combos post getВойдите в браузере под аккаунтом публикации. Откройте возвращённую ссылку и проверьте игру в плеере Combos. Сохраните созданный файл привязки combos.json. Из того же каталога обновляйте тот же пост:
combos post update --dir ./tiktok-arena --platform pcЭто статическая игра для PC в альбомной ориентации. В корне загружаемой папки должны находиться index.html и все относительные ресурсы. Публикация не включает TT. Обычная ссылка позволяет тренироваться, но без зарегистрированного контекста запуска LIVE Studio не создаёт реальную сессию. Подробнее — в руководстве H5.
7. Подготовить материалы для будущей интеграции
Доступного входа для активации и подтверждённого процесса реального подключения пока нет. Регистрация игры/аккаунтов и сопоставление подарков должны дождаться инструкций платформы; SDK и CLI не предоставляют публичный API самостоятельной регистрации. Подготовь следующие материалы для будущего процесса. Это подготовительный список, а не открытый приём заявок:
| Данные | Подробности |
|---|---|
| Игра | Опубликованная ссылка, связанный ID Post/проекта, название, PC и альбомная ориентация |
| Тестовый доступ | Тестовый аккаунт/аккаунт стримера по согласованному каналу; без паролей и токенов сессии |
| Эффекты | Три инструкции, эффект на единицу, диапазон 1–1000, ограничения и поведение после раунда |
| Соответствия | Разрешённый реальный подарок для каждой инструкции, правило количества/комбо, ожидаемый эффект |
| Приёмка | Отдельный подарок, комбо, повтор/восстановление, завершение сессии |
До теста подтвердите точный зарегистрированный вход в игру, разрешения игры/аккаунтов и активное соответствие подарков. Реальные ID, названия и цены берутся из настроенного каталога. При согласованной Вспышке ×3 игра должна получить:
{
"instruction": "gift_flash",
"count": "3"
}Не помещайте в игру секреты TikTok, CAS-токены или вручную собранный launchData: ими занимается платформа. Без регистрации у вас есть опубликованная игра Combos и рабочий симулятор; реальная приёмка TikTok ещё не пройдена.
8. Проверить реальный LIVE после появления активации
Эти шаги станут выполнимы только после предоставления активации и подтверждения платформой входа в игру, подходящего аккаунта и сопоставления подарков. Пока выполни локальную симуляцию и проверки публикации выше; они не заменяют реальную проверку LIVE.
- Разрешённым аккаунтом откройте зарегистрированный вход из TikTok LIVE Studio, подключите игру и убедитесь в
connected. - С согласия участника запустите настроенное тестовое взаимодействие. Запишите
messageId, инструкцию/количество, значения до/после и результат. Попросите контакт подтвердить получение соответствующего ACK. Не записывайте секреты или персональные данные зрителей. - Проверьте согласованное комбо: количество × эффект, границы, отсутствие повторного эффекта при повторной доставке. Сравните с локальными демо.
- Кратко отключите и восстановите сеть: известная команда не должна применяться снова. Перезагрузите страницу в поддерживаемом хостом сценарии, проверьте состояние/квитанции и следуйте указанию перезапустить игру, если оно появится.
- Завершите взаимодействие, проверьте
ended/relaunch_game, отмену при подключении и выход из игры. Старые команды не должны давать дополнительные эффекты.
Хранилище защищает только тот же браузер/origin/аккаунт/игру. Оно не обеспечивает восстановление между устройствами или доверенную игровую экономику. Не очищайте его во время LIVE. После 10 000 квитанций пример останавливает новые команды вместо удаления старых результатов. Для постоянных наград или промышленной нагрузки сохраняйте эффект и квитанцию вместе в собственном авторитетном backend и определяйте срок хранения по подтверждённым результатам.
Устранение проблем
| Симптом | Следующий шаг |
|---|---|
unsupported_host | Проверить поддерживаемый плеер Combos, возможности init() и наличие SDK |
login_cancelled / missing_profile | Войти правильным аккаунтом и повторить |
tt_not_launched, ended, relaunch_game | Проверить регистрацию/допуск и заново открыть зарегистрированную игру из LIVE Studio |
| Подключено, но эффекта нет | Проверить соответствие подарка, точные инструкцию/количество и состояние раунда; запросить трассировку по ID сообщения |
false | Неизвестная инструкция, неверное количество или завершённый раунд: определённый отказ |
invalid_save, receipt_capacity, storage_blocked, operation_failed | Остановить LIVE-тест, проверить хранилище и консоль локально, сохранить квитанции и устранить причину до перезапуска. Не превращать неизвестность в ACK успеха |