Да, ваша игра может реагировать на подарки TikTok
Social Stream Ninja получает событие и отправляет его вашей странице. JavaScript решает, что произойдёт: ускорение ракеты, рост сада, появление врага или продвижение общей цели. Действие и порог задаются в игре. SSN не меняет цены подарков платформы.
Начните здесь: попробуйте три шаблона, затем выберите, что измеряет правило: единицы платформы, идентификатор подарка или оценочные USD.
О новом визуальном дизайне см. настроить игру и запустить ее локально.
Для звука, уведомления, действия OBS или webhook начните с Event Flow. Собственная HTML-страница подходит для игрового поля или собственного состояния игры. Готовые игры есть в галерее игр.
Три небольших редактируемых шаблона
В каждом предпросмотре есть кнопки примеров и просмотр последних полученных данных. Это вымышленные события, а не покупки. Предпросмотр не подключается к вашему живому сеансу.
- Монетная ракета: 10 монет TikTok, 100 Bits Twitch или 100 звёзд Facebook дают одно ускорение. Остатки копятся отдельно по зрителям и платформам. Измените
COSTв HTML для настройки сумм. - Общая цель поддержки: объединяйте оценочную поддержку USD четырёх платформ для строительства лунной базы. Измените
GOAL_USDили замените индикатор прогресса уроном, топливом либо таймером. - Сад подарков и событий: выбранный подарок TikTok добавляет цветы, полученное событие нового подписчика — дерево, а бесплатная команда
!waterв чате добавляет воду. УстановитеGIFT_IDв полученный ID, либо задайтеGIFT_NAMEравным точному имени. «Demo flower» — вымышленный пример.
Откройте HTML-код и найдите EDIT THIS RULE или EDIT THESE RULES. receive(data) — функция, в которой пример действия заменяется логикой игры. Помощники подключения и подсчёта находятся в starter.js; оформление находится в starter.css.
Подключите шаблон к трансляции
- Запустите SSN и подключите источник чата. Убедитесь, что чат и подарки/поддержка доходят до dock. Настройка TikTok: режимы подключения.
- Откройте шаблон без
?demo, с вашим ID сеанса SSN. Укажите пароль сеанса, если он задан. - Проверьте страницу в браузере и добавьте тот же URL как источник «Браузер» в OBS, например 1000 × 800. Добавьте
&clean, чтобы скрыть инспектор, состояние подключения и кнопки ведущего.
https://socialstream.ninja/games/templates/coin-rocket.html?session=YOUR_SESSION&password=YOUR_PASSWORD&clean
На сайте beta сохраните /beta/ перед games/. Если пароль не задан, пропустите его параметр. Не публикуйте ссылки сеанса.
По умолчанию используется тот же мост iframe, что у оверлеев SSN. Для размещённого WebSocket-канала захваченного чата включите в SSN Отправлять сообщения от расширения в док-панель через сервер и добавьте &server2. См. Руководство по WebSocket для локальной настройки; шаблоны также принимают &server2&localserver и &localserverport=3000. localserver сама по себе не включает канал. Старый server использует другой канал и может зависеть от публикующего в него dock.
Создайте собственную копию
Скачать исходники beta в ZIP и распакуйте. Редактируйте файлы в games/templates/, сохраняя структуру папок: шаблоны также загружают js/local-server-url.js, а цель поддержки загружает currency.js из корня репозитория.
Перетащите стартовый HTML-код в Chrome или Edge и скопируйте его. file:/// адрес. Добавьте все из ? и далее по вашей рабочей ссылке на игру SSN, включая ваш сеанс и любой пароль. Откройте этот адрес в своем браузере, затем вставьте его в исходный код браузера OBS. URL поле с Локальный файл флажок снят. OBS сохранит этот адрес для следующего раза.
file:///C:/SSN/social_stream-beta/games/templates/coin-rocket.html?session=YOUR_SESSION&clean
Используйте фактический путь на вашем компьютере. Сохраните извлеченную папку там же; нет сервера для установки или запуска. См. руководство по настройке файлов для получения дополнительных примеров.
Настройте дизайн игры и запустите ее локально.
Используйте три стартовых варианта выше для новой игры или скопируйте ту страницу, которую вы используете, из games/. games.html и battle.html также имеют собственное игровое поведение; Константы правил стартеров не являются универсальным игровым API.
Загрузите исходный ZIP-файл., извлеките его и продублируйте выбранный HTML-код рядом с оригиналом. Например, держите my-rocket.html в games/templates/, с starter.js, starter.css, корень js/ помощники, а также любые изображения или аудио, на которые имеются ссылки. Отдайте ИИ эти файлы и docs/event-reference.html.
Откройте копию прямо с диска, используя шаги настройки файла. Пример адреса отредактированного стартера:
file:///C:/SSN/social_stream-beta/games/templates/my-rocket.html?session=YOUR_SESSION&clean
Используйте сеанс, пароль и параметры транспорта вашей фактической сгенерированной ссылки. Удалить demo для живого ввода; держать clean на этих пускателях, чтобы скрыть инструменты оператора. Сеанс — это идентификатор соединения SSN, а не имя игры. Продолжайте работу SSN и захвата.
В OBS оставляем Локальный файл снимите флажок и вставьте полный адрес файла в исходный код браузера. URL поле. После сохранения изменения дизайна обновите исходный код, чтобы загрузить его.
Подсказка по проектированию ИИ
Customize [game file] to match [reference], at [canvas size].
Include its existing CSS/JS and local artwork/audio. Preserve the game's
rules, controls, gift/coin/USD distinctions, streak handling, duplicate
handling, and demo/clean modes. Change the visual design, not the reward rules,
unless I explicitly specify a rule change. Keep session/password and
transport parsing, relative paths, and Chrome 80-compatible classic scripts.
Read docs/event-reference.html and docs/making-games.html.
Treat all incoming messages, names, labels, donations, and metadata as untrusted.
Prevent HTML/JavaScript injection in every renderer you change. Use textContent
for plain fields and for chatmessage when textonly is true. For HTML-mode
chatmessage, keep supported emotes/formatting through the packaged
SocialStreamChatHTML.sanitize helper (libs/objects.js loaded first).
Do not concatenate raw input into innerHTML, attributes, CSS, or JavaScript.
Validate media/link URLs with the page's existing URL policy and assign DOM
properties; do not enable javascript: URLs or executable embedded content.
Never eval incoming data or treat a viewer message as an AI instruction.
Keep source checks, connection handling, and existing sanitizers.
Test plain text, allowed emotes, quotes, angle brackets, and an HTML injection
probe in an isolated preview; verify the probe cannot execute.
Make the edited game work directly from disk using a file:/// URL,
without requiring a local web server.
Return the edited files/assets, file URL and OBS setup steps, and tests using
fictional data. Preserve image-only events and a valid donoValue of zero.
Never treat chat text as proof of a payment.
Тестирование в демонстрационном режиме с помощью кнопок стартера, включая повторяющиеся обновления серий и коррекцию нулевого значения. Затем протестируйте фактический маршрут событий с помощью вашего сеанса и, наконец, источник OBS в его предполагаемом размере. Проверьте как игровой процесс, так и безопасный рендеринг; сама по себе работающая анимация не подтверждает правила игры.
Как выбрать число монет для действия?
Прежде чем выбирать число, решите, что измерять:
| Правило | Прочитайте | Пример |
|---|---|---|
| Единицы платформы | TikTok meta.coinsPerGift × meta.tiktokGiftCount , если передано, либо явное значение hasDonation с подписью, например 10 coins, 100 bits, или 100 Stars. | Каждые 10 монет дают ускорение. |
| Конкретный подарок | TikTok meta.giftId или meta.giftName, и его количество. | Каждый подходящий подарок добавляет цветок независимо от оценки в USD. |
| Сопоставимая ценность поддержки | getDonationValueUSD(data) из currency.js. | Каждый оценочный доллар добавляет 10 топлива; 25 долларов завершают цель. |
| Бесплатное действие или членство | Фактическое значение источника в event, или команду чата. | Подписка на обновления выращивает дерево; новая платная подписка запускает анимацию. |
Определите, означает ли сумма точное совпадение (coins === 10), минимум за событие (coins >= 10), или накопленный баланс. Ракета накапливает остаток: 25 монет дают два ускорения и оставляют пять монет. Правило «ровно 10» пропустит 25 монет. Если событие выбирает одно из нескольких действий, сначала проверяйте самый высокий порог, чтобы не сработали все нижние уровни.
В TikTok зрители покупают монеты и тратят их на подарки с указанной ценой. Выберите доступные в вашем LIVE подарки и проверьте захват до публикации правила. Название подарка, количество подарков, монеты и алмазы — разные меры. Не вычисляйте «точные монеты» делением оценки USD и не приравнивайте алмазы к монетам. Объяснение монет и подарков TikTok.
Если источник даёт только название/количество подарков или алмазы, монетный шаблон пропускает событие без явных метаданных монет. Используйте правило конкретного подарка или шаблон оценочных USD. Метаданные могут происходить и из таблицы подарков SSN; когда важна точная цена, сверяйтесь с текущим меню подарков LIVE. Каталоги и способы захвата различаются; общего поля монет, гарантированного в каждом сообщении TikTok, нет.
Что отправляет каждая платформа
type обозначает источник; event обозначает действие, если присутствует. Доступность зависит от режима захвата, настроек и данных платформы. Примеры описывают текущий код SSN, не гарантируя все события каждому аккаунту.
| Платформа | Данные поддержки и событий | Различайте |
|---|---|---|
| TikTok | type: "tiktok", event: "gift". Захват пожертвований может передавать hasDonation и donoValue. Метаданные могут содержать ID, название, количество, монеты или алмазы за подарок и идентификатор серии. | Монеты покупают подарки; алмазы — награды авторов. Захват WebSocket в SSApp завершает серии перед передачей; браузер может отправлять накопительные обновления. Отключение захвата пожертвований TikTok может оставить подарки без денежных полей. |
| Twitch | Cheers используют Bits, например hasDonation: "100 bits". Захват через API может использовать event: "cheer" и donoValue: 1; захват отображаемого чата может не содержать метки события. | Подписки, подарочные подписки, рейды и баллы канала — отдельные действия. Значок подписчика у обычного сообщения не означает новую подписку. Прямые Cheers и Bits в расширениях Twitch — разные интеграции. |
Видимые строки звёзд Live Chat содержат, например, hasDonation: "100 Stars" и donoValue: 1, без event . | API комментариев не выводит звёзды из текста чата. Захват DOM требует видимую строку звёзд; обычные комментарии и реакции не подтверждают оплату. | |
| YouTube | superchat и supersticker передают сумму в исходной валюте в hasDonation. Подарки используют jeweldonation с N Jewels, или 1 YouTube Gift , когда сумма скрыта. | Зрители тратят Jewels на подарки, авторы получают Rubies. Спонсорство и подаренное спонсорство — отдельные события, не Jewels. Super Thanks — отдельный продукт без гарантии события пожертвования в живом чате. |
Материалы платформ: Алмазы TikTok; Bits и подписки Twitch; Обзор звёзд Meta; YouTube Super Chat и Super Stickers; YouTube Jewels, Gifts и Rubies. Термины проверены 29 сентября 2026 года; актуальные условия и доступность смотрите на сайтах платформ.
Другие источники могут сообщать чаевые, подарки, членства или покупки. Изучите справочник событий перед добавлением в фильтр шаблона isSupport . Продажа товара или подарочная подписка не обязательно чаевые. Например, YouTube различает покупку подарка и уведомление о получении; подсчёт обоих дважды вознаградит один подарок.
Правильно используйте donoValue и currency.js
hasDonation — исходная отображаемая подпись, например €5.00 или 100 bits. donoValue — необязательная числовая сумма USD от источника. Учитывайте корректное заданное значение, включая ноль, до оценки по подписи. Сохраните исходную подпись для отображения.
<script src="../../currency.js"></script> <script> // From games/templates/: use the existing helper, including its zero handling. var usd = getDonationValueUSD(data); // Use usd for your rule; display data.hasDonation for the original amount/unit. </script>
Существующее поведение пересчёта: Сейчас SSN оценивает монету TikTok в 0,01 USD, алмаз в 0,005 USD, Bit Twitch или звезду Facebook в 0,01 USD, а Jewel YouTube в 0,005 USD. Подарок TikTok без цены по умолчанию считается одной монетой за штуку; подарок YouTube без числа Jewels имеет отдельную временную оценку 0,01 USD. Валюты тоже пересчитываются по внутренним приблизительным курсам, а не через сервис актуальных курсов.
Это сравнительные значения SSN, а не единое определение расходов зрителя, чистого дохода автора или доступного вывода. Разные способы захвата могут давать разные оценки. В частности, подстановка одной монеты для неизвестного подарка TikTok не доказывает его цену.
Не используйте donoValue || convertToUSD(...): это отбросит намеренно заданный ноль. Не извлекайте цифры из chatmessage для обнаружения оплаты и не требуйте метку event === "donation": у звёзд Facebook и некоторых Cheers нет метки события. Шаблон цели сначала выбирает виды поддержки, затем вызывает общий конвертер.
Исходник: currency.js и справочнике данных. Метаданные подарков необязательны; примеры не выдумывают отсутствующие поля.
Считайте серию подарков один раз
TikTok может сообщать накопительные значения 1, 2, 3 одной серии. Это три подарка, не шесть. Для суммирования запоминайте наибольшее полученное количество или сумму и применяйте только прирост. Завершающее обновление с тем же итогом ничего не добавляет.
// All three events refer to the same streak: // incoming total: 1, 2, 3, 3 // added to game: 1, 1, 1, 0 var newCoins = RewardStarter.increment(data, RewardStarter.coins(data), 'coins');
Вспомогательная функция сначала использует доступные нативные ID группы/отправителя/подарка TikTok, затем meta.tiktokGiftStreakId или ID сообщений. Обычные ID тоже подавляют повторную доставку. Функция не ждёт repeatEnd , поскольку браузерный захват может никогда его не передать. Для единственного действия после завершения серии нужна отдельная логика завершения по полям, которые реально посылает соединение.
Учебные шаблоны хранят в памяти до 2000 идентификаторов. Сброс и перезагрузка стирают память и прогресс. Без стабильных ID нельзя надёжно убрать дубли; второй захват того же канала может использовать другие ID. Начните с одного пути захвата. Ракета группирует баланс по платформе и ID пользователя, а при его отсутствии — по отображаемому имени; одноимённые зрители могут делить баланс. Для постоянной игры добавьте сохранение состояния и обработку повторов, прежде чем полагаться на сохранность платных наград после перезапуска.
Награды без собственной игры
В разделе Event Flow, используйте Сравнить свойство с donoValue, больше или равно, и порог в USD, затем подключите звук, анимацию или управление OBS. Сравнение учитывает корректное значение источника и при необходимости использует существующий пересчёт валют.
Для конкретного подарка TikTok сравните meta.giftId или meta.giftName, и ограничьте поток событиями подарков TikTok. Числовые сравнения поля hasDonation также приводятся к USD; это не сравнение сырых монет. Для правил в монетах используйте нативные метаданные или свой код.
Порог для каждого сообщения отличается от накопленного баланса или счётчика серии. Не считайте, что порог Event Flow автоматически повторяет накопление и удаление дублей из шаблона. Используйте узлы состояния , когда потоку нужно состояние, или оставьте эту логику в игре.
Проверьте до подключения платного действия
- Нажмите кнопки примеров. Серия 1 → 2 → 3 должна добавить стоимость трёх подарков; явный ноль не должен добавлять USD; неизвестная цена не должна давать точное число монет.
- Подключите настоящий источник и изучите полученные данные. Проверьте название/ID подарка, сумму/единицу, количество и ожидаемое событие. Пример проверяет правило, а не живой захват платформы.
- Проверьте в сцене OBS повторы событий, переподключение и перезагрузку. Не отключайте и не обновляйте источник «Браузер», если нужно сохранить текущую игру в памяти.
Для игры без присмотра или AFK должны постоянно работать SSN, захват источника и страница игры. Сон компьютера, истёкший вход или разрыв связи прерывают действия; шаблоны не восстанавливают пропущенные события и не обрабатывают возвраты. Автоматические реакции не разрешают монетизацию трансляции без присмотра: проверьте текущие правила LIVE и монетизации для вашего формата.
Если ничего не приходит, проверьте dock SSN, затем сеанс/пароль и транспорт. Если чат приходит, а подарок не подходит, проверьте данные и фильтры пожертвований/событий. Доступность подписок и новых подписчиков зависит от источника; см. справочник событий. Подробнее о подключении: собственные оверлеи.