Справочник событий трансляции

Эта страница описывает канонические данные событий, которые Social Stream Ninja отправляет для основных платформ. Используйте её как общий источник истины при подключении новых источников, поиске проблем интеграций или согласовании подписей интерфейса. Более короткую таблицу для пользователей см. в Совместимость событий и уведомлений.

Важно: Доступность событий зависит от источника, разрешений и настроек захвата. Чтобы скрыть строки с маркером события в док-панели или оверлее выделенных сообщений, добавьте &hideevents или &hideallevents. Чтобы скрыть выбранные события, используйте &filterevents=subscription_gift,new_follower,gifted. Эти фильтры также могут скрывать платные строки, содержащие event; обычные строки пожертвований без маркера события не совпадают с фильтрами событий. Остальные фильтры сообщений продолжают действовать.
Выберите способ захвата: Для YouTube, Twitch и Kick Режим WebSocket обычно обеспечивает более широкий охват событий. Стандартный захват DOM читает строки и карточки, которые действительно отображены на странице. YouTube Super Chat, Super Sticker и подарки Jewel захватываются в обоих режимах; другие подарки, чаевые и подписки зависят от источника. Поддерживаемые пути и необходимые настройки приведены в таблицах платформ.
Создаёте автоматизацию? Посмотрите Руководство по Event Flow чтобы узнать, как использовать эти данные событий в собственных триггерах, уведомлениях и процессах. Руководство включает Справочник переменных шаблонов для форматирования текста.
Структура данных: Строки чата с пожертвованиями должны использовать hasDonation и необязательный donoValue. Не задавайте event: "donation" лишь потому, что обычная строка чата или чаевых содержит сумму; используйте конкретные имена событий только для настоящих действий платформы или типов платных элементов, например superchat, supersticker, gift, или jeweldonation. Используйте meta только для дополнительных структурированных данных, которые действительно нужны получателям и ещё не представлены существующими полями.

Краткая таблица доступности функций

В этой таблице показано, какие типы уведомлений сейчас передаёт каждый способ захвата. Подробные примечания к данным приведены ниже.

Отдельный Multi-Stream Alert Box группирует события эфира в шесть основных категорий уведомлений: Follow, Subscription/Member, Donation, Bits/Cheers, Raid/Host, и Purchase, а также две включаемые по желанию категории (Auction и Hype Train) включаются через параметры URL. Эти категории определяются из существующего event, membership, subtitle, hasDonation, и meta поля, описанные здесь; отдельный формат данных не требуется.

Источник Новые подписчики / участники канала Новые фолловеры Пожертвования Счётчики и дополнения
YouTube (мост Data API) Новые подписки, продления и подарки Отдельные уведомления о подписчиках* + общие количества Super Chat и Super Sticker Общее количество зрителей, подписчиков и просмотров (опрос)
Twitch — захват DOM Строки наборов подарков и уведомления о получателях - Биты помечены через hasDonation Количество зрителей, карточки наград и выделения сообщества
Twitch — EventSub / WebSocket Мгновенные подписки, продления и подарки Мгновенные уведомления о фолловерах + общее количество Cheers, Power-up и активации наград за баллы канала Общее количество зрителей, подписчиков и фолловеров, состояние эфира, уведомления о рекламе
TikTok Live - Карточки фолловеров (когда TikTok их показывает) Подарки, пересчитанные в общее количество монет Количество зрителей, уведомления о присоединении и серии лайков
YouNow - Активность поклонников и зрителей - Количество зрителей из панели аудитории эфира
Favorited Studio - - - Количество зрителей из вкладки зрителей эфира
Whatnot - - - Количество зрителей, уведомления о присоединении, метаданные живого аукциона, товары и снимки розыгрышей
eBay Live - - - Количество зрителей, число фолловеров, снимки карточек событий эфира, метаданные нижней панели аукциона при наличии, реакции-сердечки и метаданные предстоящих событий
Окно уведомлений Streamlabs Подписки, подарки, спонсорство, фолловеры Cheer/биты, пожертвования (с валютой) Cheer/биты, пожертвования (hasDonation) Пока окно уведомлений открыто; также доступно через sources/websocket/streamlabs.html токен сокета
OBS Flow Actions - - - События вывода OBS, сцен, буфера повтора и завершения медиа для Event Flow, когда actions.html подключён к OBS WebSocket
Kick — DOM - - - Количество зрителей и базовые системные уведомления о наградах и подарках; для расширенных уведомлений используйте мост Kick
Kick — WebSocket / мост Новые подписки, продления и подарки Уведомления о фолловерах + общее количество фолловеров События поддержки / чаевых (сумма + валюта) Состояние трансляции, активации наград и метаданные профиля
Facebook Live - - Stars, когда видны в DOM Строки чата, Stars и опрос количества зрителей
Rumble — захват DOM - - Видимые цены Rant Чат, входящие рейды и опрос количества зрителей
Rumble — WebSocket / URL API Новые и подаренные подписки Уведомления о фолловерах + общее количество фолловеров Rants / чаевые (сумма + валюта) Общее количество зрителей и подписчиков, состояние эфира и поток чата
Streamplace - - - Количество зрителей, имена чата, цвета, значки, ответы и ссылки
WorldsWave - - Подписи пожертвований при наличии Отрисованный чат трансляции и включаемые по желанию обновления количества зрителей
CHZZK - - Видимые строки пожертвований cheese Строки чата, изображения значков, эмоуты и опрос количества зрителей
BEAM - - - Строки чата и опрос количества зрителей, если страница только с чатом предоставляет счётчик
Seal Team Sloth - - - Отрисованные строки чата отдельного окна и viewer_update опрашивает при включённом количестве зрителей
Castyr - - - Отрисованные строки чата отдельного окна и включаемые по желанию обновления количества зрителей
RPLAY - - - С выполненным входом /live/chat/box/ отдельное окно: type: "rplay" чат, аватары, изображения значков уровней и эмоуты. Чаевые в монетах сохраняют сумму и единицу в hasDonation для общего пересчёта в доллары США без события пожертвования. Включаемый по желанию viewer_update опросы используют целое meta из публичного адреса трансляции RPLAY. Пересланные строки Twitch исключаются.
FLEX TV - - - Отрисованные строки чата с именами, цветами авторов, изображениями значков и метаданными подписок

*Уведомления о подписчиках YouTube получаются опросом и могут приходить с задержкой или быть неполными. Справочник API не гарантирует фиксированное четырёхчасовое окно доставки. См. официальные ограничения API подписок.

Обзор полей

data здесь означает объект сообщения, а не дополнительную оболочку, которую нужно добавить. Строки чата и события только с метаданными имеют разные структуры: счётчики и снимки состояния могут не содержать chatname/chatmessage. В таблицах платформ сообщение описывает обычную строку чата, а не буквальное event: "message".

Поле Структура Использование
data.type строка Идентификатор источника, используемый оверлеями, фильтрами и Event Flow. Instagram сохраняет чат трансляции как instagramlive а комментарии вне эфира — как instagram. См. Руководство по типам источников для вариантов, общих источников и исходящей маршрутизации.
data.chatname строка Отображаемое имя, переданное источником и используемое обработкой сообщений и выводами вне оверлеев. Настроенный псевдоним отображаемого имени может заменять его только в копиях данных для передачи док-панелям и оверлеям.
data.username строка Имя пользователя источника, если доступно. Данные док-панели или оверлея с псевдонимом могут добавлять это поле для сохранения исходного chatname для действий с пользователем; каноническое сообщение не меняется.
data.userid строка Идентификатор пользователя на платформе. Действия с пользователем предпочитают это значение вместо username и chatname.
data.platformстрока (необязательно)Некоторые интеграции включают это вместе с type. Многие адаптеры источников его не передают; используйте type для маршрутизации источников.
data.idстрока | число (необязательно)Идентификатор сообщения или события. Его смысл зависит от источника и способа передачи; не считайте, что это всегда собственный идентификатор модерации платформы. Используйте meta.messageId когда адаптер предоставляет его для синхронизации удаления.
data.donoValueчисло (необязательно)Числовой эквивалент в долларах США, переданный источником, включая оценки. Допустимое значение, в том числе ноль, имеет приоритет перед пересчётом currency.js. Без него получатели оценивают сумму в долларах по hasDonation и контексту источника. Исходные суммы и единицы остаются в hasDonation и существующих метаданных провайдера.
data.chatbadgesмассив | строка (необязательно)URL изображений значков или объекты значков (type: "img" с src, type: "svg" с html, или type: "text" с text). Ретранслятор сохраняет буквальную подпись текстового значка в необязательном rawText и создаёт экранированный text для старых оверлеев. При последующих этапах пересылки пересоздавайте text из rawText; не экранируйте text снова. Текущие средства отображения показывают rawText буквально, если присутствует, и сохраняйте прежнюю обработку закодированного текста в остальных случаях. Это поле представления, а не разрешение показывать HTML. Старые источники могут передавать одну HTML-строку вместо массива. Оверлеи значков принимают оба формата и локально очищают HTML и URL значков, в том числе от старого расширения. Недопустимые значки не должны мешать отображению сообщения чата или подписки.
data.event строка | логическое значение Идентификатор системной активности (например viewer_update, subscription_gift, giftpurchase). Для обычного чата оставляйте пустым или false, чтобы оверлеи отличали системные уведомления от разговорного текста.
data.chatmessage строка Тело сообщения. Оно может содержать очищенный и пригодный для отображения HTML только при data.textonly равно false.
data.textonly логическое значение Применяется только к data.chatmessage. true означает отображать chatmessage как обычный текст, сохраняя буквальные теги и текст, похожий на HTML-сущности; не декодируйте, не очищайте как HTML и не добавляйте теги форматирования в это тело. Применяйте оформление события к отображаемому элементу. false означает chatmessage может содержать очищенный и пригодный для отображения HTML; старые сообщения без этого признака сохраняют такое HTML-поведение. Остальные обычные поля — простой текст, за исключением медиа-полей, например chatimg и contentimg. Показывайте обычные поля с помощью textContent, либо экранируйте один раз при создании HTML-шаблона; не удаляйте и не декодируйте повторно их содержимое.
data.contentimg строка (необязательно) URL изображения контента или поддерживаемого медиафайла. В расширении и настольном приложении включаемая по желанию функция allowExternalGifs настройка заполняет пустое поле из первой прямой HTTP(S)-ссылки на GIF в тексте сообщения или HTML-ссылке. Путь URL должен оканчиваться на .gif (без учёта регистра); параметры запроса и фрагменты сохраняются. API-ключ не нужен; сохраняется chatmessage и существующие вложения, а также учитывает removeContentImage. Необязательный hideExternalGifUrl настройка добавляет meta.hideExternalGifUrl: true; док-панель и оверлей выделенных сообщений скрывают соответствующую GIF-ссылку только после загрузки изображения, сохраняя окружающий текст и исходные данные. При ошибке или тайм-ауте контейнер вложения сворачивается, а ссылка остаётся видимой. Оверлей только для GIF пробует прямой показ изображения, если загрузка байтов не удалась, и использует заданное время показа, когда длительность анимации недоступна; при ошибке или зависании загрузки очередь продолжается. Это не добавляет event или измените источник type. Внешние изображения не проходят фильтрацию содержимого и могут не загрузиться, если хост запрещает встраивание.
data.membership строка Читаемое состояние подписки, например MEMBERSHIP, new_sponsor, gift_recipient. Поверхности используют его для значков, фильтров и объявлений.
data.subtitle строка Дополнительное описание (срок подписки, повышение уровня, кем подарено…). Делайте его коротким и текстовым, чтобы оверлеи могли разместить его под отображаемым именем.
data.hasDonation строка Денежная сумма или количество виртуального подарка ($5.00, 500 bits, 300 coins). Заполняйте даже если data.event пустой, чтобы оверлеи пожертвований могли его распознать.
data.meta число | объект | строка (устаревший вариант) Для одиночных счётчиков зрителей, фолловеров и подписчиков используйте целые числа, а для более подробного контекста — объекты. Некоторые старые события, например Twitch DOM community_highlight, содержат строку. Перед чтением свойств объекта проверяйте структуру конкретного события; новые структурированные сведения должны находиться в объекте.
data.firsttime логическое значение Установить в true когда включены определение новых участников и локальная база данных и это первое сохранённое сообщение этого пользователя и источника. Док-панель использует признак для выделения новых участников и фильтров первого звукового сигнала; необязательная настройка значка нового участника добавляет листок в начало chatbadges.
data.lastactivity число Метка времени Unix в секундах для предыдущей сохранённой активности чата этого пользователя, когда включены определение новых участников и локальная база данных. Для совершенно новых пользователей не передаётся.

Передача управления оверлеями отделена от захваченного чата и событий. Обновлённые получатели используют ssnControl оболочку с идентификатором доставки id, функцию target, необязательный канал ответа и идентификатор клиента снимка. Существующие тела данных функций сохраняются. Публичное управление функциями использует канал 7; Actions сохраняет канал 6. Состояние Poll и Map включает значение ведущего epoch, revision и reset маркер; Timer, Ticker и Spotify используют ssnState с эпохой и ревизией. Эти маркеры описывают состояние ведущего, а не восстановленную историю голосов или чата. Источники не должны добавлять поля управляющей оболочки в захваченные сообщения. Подтверждение получения не доказывает завершение действия или видимость в OBS. См. состояние миграции для поддерживаемых функций, согласования ответов и ограничений переподключения.

Phrase Guess использует собственный {response: text} запрос для ответов чата server2 и {action: "phraseGuessResponse", value: {type: "bot", chatname: name, chatmessage: text}} для объявлений только в док-панели. Ведущий должен включить входящие сообщения server3; отключение управления ведущим по-прежнему блокирует эти запросы. Объявления док-панели пересылаются как обычные строки чата бота с textonly: true, не отправляя их в поля чата источников захвата. Устаревший режим API сохраняет существующий формат команд.

Правила метаданных

Чтобы панели и автоматизация оставались согласованными, следуйте этим правилам при расширении data.meta:

  • viewer_update, follower_update, subscriber_update, и likes_update используют обычное целое число meta значение. likes_update — достоверный итог платформы: получатели должны устанавливать показанное значение, а не прибавлять его. Фоновый скрипт объединяет количество зрителей в viewer_updates с объектом, ключи которого определяются по data.type.
  • giveaway_state — созданный ведущим снимок только с метаданными для управляемых представлений. meta.giveaway версия 2 включает giveawayId, постоянный roundId/epoch, увеличивая generation между новыми раундами, revision в пределах раунда, status, open, draw, keyword, count, ticketCount, замороженный config, до 120 предварительных entrants, и последние 20 winners. Записи предоставляют id, name, platform и tickets; победители добавляют drawnAt и начисленные points. Coin Flip Pot добавляет outcome; Number Hunt добавляет number с публичным low, high и недавний guesses, но никогда не секрет. Получатели фильтруют по идентификатору розыгрыша и отбрасывают старые поколения и ревизии. Это образцы для отображения, а не полный реестр билетов или инструкция на выплату. Ключи кошельков, балансы и бронирования не попадают в снимки для зрителей. Ведущий публикует в giveaway метку P2P и включённые потоки WebSocket оверлеев; это не означает видимость в OBS. Руководство.
  • meta.giveawayControlResult содержит результат действия розыгрыша Event Flow (ok, необязательный error, giveaway или simulated). meta.giveawayHandled перечисляет идентификаторы розыгрышей, уже обработанные действием участия или покупки, чтобы автоматическая команда чата не списала оплату повторно. Редактор добавляет meta.economyTest для имитированных действий розыгрыша; это не событие исходной платформы и не ключ авторизации.
  • video_stats использует структурированный meta объект для состояния внешнего кодировщика или сервера, включая provider, label, online, bitrateKbps, rttMs, bufferMs, счётчики потерь и отброшенных пакетов и необязательные сведения о кодеке.
  • События в стиле пожертвования могут включать объект с описанием, например { amount, currency, supporter } для Kick, { bits } для Cheers Twitch. У событий подписок свои метаданные, зависящие от источника; они не становятся денежными пожертвованиями автоматически.
  • Нормализованные сообщения вебхуков Stripe, Ko-fi, Buy Me a Coffee и Fourthwall включают идентификатор в пространстве провайдера meta.webhookId, скопированный из стабильного идентификатора события провайдера, чтобы принимающие страницы могли подавлять повторы при повторной доставке и смешанных способах передачи.
  • Рейды Twitch передают { fromId, fromLogin, viewers }. Другие источники отличаются: Whatnot использует meta.numRaiders, тогда как SharePlay использует необязательный meta.fromLogin/meta.viewers. Перед чтением метаданных рейда проверьте строку конкретного источника.
  • Активации наград Twitch EventSub предоставляют meta.rewardId, cost, rewardTitle, redemptionId, и устаревшее alias вместе с подготовленным сообщением. Карточки наград DOM и другие источники могут передавать меньше полей или другой их набор.
  • user_banned содержит только метаданные для виджетов модерации. Намеренно исключает chatname и chatmessage; используйте meta.username, meta.displayName, meta.avatarUrl, и meta.profileUrl.
  • Способы передачи чата, поддерживающие синхронизацию удаления через управление источником, должны предоставлять собственный идентификатор чата платформы в meta.messageId вместо опоры на внутренний идентификатор док-панели data-mid значение.
  • Удаления из источника используют {delete: {type, id}} для известного идентификатора сообщения док-панели либо {delete: {type, meta: {messageId}}} для собственного идентификатора сообщения платформы. Известный идентификатор удаляет только совпадающие сообщения. Если известен только целевой пользователь, отправьте {delete: {type, userid}} или {delete: {type, chatname}} чтобы удалить сообщения этого пользователя с этой платформы. Никогда не подставляйте личность модератора вместо целевого пользователя. Входящие удаления не требуют необязательной настройки синхронизации модерации из док-панели на платформу.
  • Метаданные идентификации источника SSApp могут добавлять meta.ssnAccountRole, meta.ssnSourceId, и meta.ssnSession когда источнику назначена нестандартная роль учётной записи.
  • Event Flow может запросить выделение, задав meta.featured = true в данных чата, что автоматически выделяет сообщение в док-панели и оверлее выделенных сообщений.
  • AI Event Overlay: действие showAiEventOverlay отправляет копию вызвавшего его сообщения получателю с меткой aievent-CONFIGURATION_ID, добавляя meta.aiEventOverlay: {profile: "CONFIGURATION_ID"}. Существующие поля сообщения и метаданные в виде объекта сохраняются; скалярные метаданные сохраняются в meta.value. Это адресная доставка, а не новое событие платформы. Исходное сообщение не изменяется. См. руководство по настройке.
  • Необязательно meta.aiEventOverlay.variation выбирает точную фразу, одобренную в сохранённых настройках оверлея. Текст зрителя и метаданные заполняют поля шаблона после его генерации.
  • Запросы на отображение AI Event Overlay требуют профиль и его приватный токен отображения. Настройки и ключи API управляются только через локальное всплывающее окно SSN. Ответы используют {aiEventResponse: {target, value}} или {aiEventResponse: {target, error}}. Результаты генерации содержат template, duration, warnings, а также необязательные URL данных мультимедиа в image/audio.
  • Награды в виде ИИ-оверлеев, оплаченные баллами, используют aiEventPresentation (id, profile, expiresAt, result, message) и подтверждают получение через aiEventDelivered (идентификатор доставки). Записи о списаниях и суммы возврата остаются на стороне хоста.
  • Event Flow может запросить закрепление в док-панели, задав meta.pinned = true; необязательный meta.pinnedTarget ограничивает закрепление док-панелью с соответствующим label.
  • Термопечать Event Flow записывает результат в meta.thermalPrintResult (success и необязательный code/error), сохраняя событие чата и остальные метаданные. Для событий с числовыми или другими необъектными метаданными диагностика остаётся в результате действия, а само событие не меняется.
  • Включаемые по желанию награды-стикеры SSN: event: "sticker" отправляется только в stickers метку оверлея после списания баллов лояльности. Устанавливает platform и type в поле исходного сообщения type, и сохраняет chatname, с пустым chatmessage, textonly: true, и contentimg содержащий относительный путь к изображению из пакета или одобренный ведущим HTTPS-адрес медиафайла. meta.sticker содержит id, pack, name, cost, duration (секунды), motion, redemptionId, и expiresAt (миллисекунды Unix). Это награда SSN, а не пожертвование платформы или её собственное событие баллов канала. См. галерея и руководство по настройке.
  • Проигрыватель стикеров возвращает пакет управления {action: "stickerReceipt", meta: {sticker: {redemptionId, success}}} своему отправителю при загрузке изображения или ошибке. Только подтверждения от подключённого stickers участнику соединения завершить ожидающую активацию награды. Неудачная или неподтверждённая доставка запускает возврат; этот пакет управления не является событием чата. Рекомендуется один активный экран стикеров на сеанс.
  • Команды сценического оверлея ИИ используют { action: "aiOverlay", target, meta } либо воспроизведение соведущего под управлением док-панели использует { action: "cohostOverlay", target, meta }; сохраняйте все сведения команды, например command, text, emotion, avatar, и tts внутри meta.
  • Если платформа одновременно предоставляет несколько счётчиков, предпочтителен структурированный объект с явными ключами (meta.viewer_count, meta.follower_count) вместо перегрузки строк разными значениями.
  • Торговые оверлеи должны использовать объекты снимков в meta (например auction_update и commerce_update) и избегайте произвольных полей верхнего уровня.

Поддержка платформ

YouTube — стандартный захват DOM

Реализация: sources/youtube.js

  • Держите вкладку чата трансляции открытой. Захват читает карточки подписок и подарков, отображаемые в этом сеансе; зрителю не обязательно быть владельцем канала или модератором. Доступ учётной записи и выбранный вид чата могут влиять на видимые строки.
  • При открытии оверлея количества зрителей и активности чата с отображением зрителей их количество запрашивается автоматически. Настройки Показывать количество зрителей и Отслеживать активных участников чата также включают сбор данных.
  • Для уведомлений о фолловерах и дополнительных событий, включите режим WebSocket в настройках расширения.
Событие Когда срабатывает Примечания к данным
sponsorship Приветственный заголовок подписки без явного текста чата (новые участники, поступившие наборы подарков), включая структурированные приветственные карточки или локализованный текст «Добро пожаловать в …». membership заполняется переведённым «MEMBERSHIP»; subtitle содержит серию и уровень, если определены; nameColor использует зелёный цвет подписки, когда разрешено.
giftpurchase Баннер покупки набора подарков (ytd-sponsorships-live-chat-gift-purchase). membership становится gift_giver; subtitle содержит количество подарков, если известно; без hasDonation или donoValue.
giftredemption Объявление об активации подарка для получателей. membership становится «MEMBERSHIP»; subtitle включает «Gifted by …».
resub Баннеры повышения уровня с текстом «upgraded to …». subtitle захватывает подпись нового уровня; membership остаётся «MEMBERSHIP».
superchat, supersticker, jeweldonation Super Chat, Super Sticker, карточки объявлений о пожертвованиях и YouTube Gifts на основе Jewels (yt-gift-message-view-model). hasDonation содержит значение; event обозначает тип платного элемента YouTube. YouTube Gifts используют N Jewels при наличии либо 1 YouTube Gift когда YouTube скрывает количество. Изображения подарков используют contentimg, подписи подарков используют subtitle, а минимальные сведения о подарке дублируются в meta.youtubeGift.
jeweldonation эффект подарка YouTube показывает анимированный подарок Jewel поверх чата трансляции (ytls-gift-overlay-item-view-model). Отправляется напрямую в отдельное направление GIF / медиа, чтобы анимация воспроизводилась без дублирования обычной строки подарка. contentimg содержит анимированный ресурс и meta.youtubeGift.animationUrl/animationDescription сохраняют сведения об эффекте.
reaction В фонтане эмодзи прямого эфира YouTube появляется реакция зрителя. Отправляется напрямую в отдельное направление реакций. Анонимный эмодзи и URL изображения сохраняются в chatmessage/contentimg и в meta.reactionType/reactionImage. Известные варианты в эфире включают ❤, 😄, 🎉, 😳 и 💯.
thankyou Резервное сообщение, когда сумма пожертвования есть, а текст чата не передан. Сохраняет hasDonation и автоматически добавляет для оверлеев «Thank you for your donation!».
redirect В чате трансляции появляется баннер перенаправления YouTube — ближайший аналог уведомления о рейде. Захват только DOM из yt-live-chat-banner-redirect-renderer. Задаёт event на redirect и использует membership как подпись, чтобы оверлеи показывали его подобно другим системным уведомлениям.
viewer_update Опрос адреса количества зрителей Social Stream каждые 30 секунд (при ошибках квоты — сбор со страницы). meta — целое количество зрителей эфира; участвует в агрегированном viewer_updates в фоновом скрипте.

Блоки подписок также задают membership для чата модератора или участника, тогда как subtitle содержит либо количество месяцев, либо названия уровней. sourceName/sourceImg заполняются, как только getChannelInfo успешно. Стандартный чат DOM теперь включает meta.messageId когда YouTube предоставляет собственный идентификатор сообщения чата трансляции, используемый док-панелью для синхронизации удаления.

YouTube — захват WebSocket / Data API

Реализация: sources/websocket/youtube.html, общие вспомогательные модули в shared/

  • По умолчанию используются разрешения OAuth youtube.readonly и youtube.channel-memberships.creator. Необязательное право записи добавляет youtube.force-ssl для отправки чата, модерации, блокировок и изменения сведений о трансляции; Google может показывать это как широкое разрешение управления YouTube, поскольку отдельного разрешения записи только для чата YouTube не предоставляет.
  • Статистика канала учитывает отдельные переключатели настроек (showsubscount, showviewercount).
  • API не может передавать изображения собственных значков; резервные значки используют указанные ниже эмодзи.
  • Когда API явно сообщает authorDetails.isChatModerator: true, данные чата, Super Chat, Super Sticker, YouTube Gift и подарочных подписок включают mod: true. Статус модератора не определяется предположительно и не кэшируется между событиями.
  • Уведомления о новых подписчиках используют myRecentSubscribers API (опрос каждые 5 минут). Примечание: результаты могут задерживаться или быть неполными; определить можно только публично видимые подписки.
  • Data API не предоставляет баннеры перенаправления YouTube, поэтому redirect остаётся доступным только из стандартного захвата DOM.
Событие Когда срабатывает Примечания к данным
superchat Записи Super Chat из истории Data API или опроса трансляции. hasDonation сохраняет сумму сайта (валюту и значение); event имеет значение superchat. В старых сборках WebSocket использовался event: "donation" для этой строки, поэтому получатели могут продолжать принимать его как устаревшее альтернативное имя.
supersticker Super Sticker (только резервный текст сообщения, без изображения из API). hasDonation хранит сумму; chatmessage содержит декодированный текст описания.
jeweldonation YouTube giftEvent сообщения, когда зрители обменивают Jewels на подарки. hasDonation хранит N Jewels, или 1 YouTube Gift когда YouTube скрывает количество; contentimg использует URL ресурса подарка, если предоставлен; subtitle содержит подпись подарка; meta.youtubeGift содержит дополнительные сведения о подарке.
sponsorship Новый участник присоединяется через newSponsorEvent. membership становится new_sponsor или new_member; meta включает originalEventType, длительности и сведения об уровне.
resub Продления платных подписок или повышение уровня. membership становится renewed_member (продления) или upgraded_member (повышения уровня); subtitle показывает уровень.
giftpurchase Наборы подарков, купленные через API. membership со значением gift_giver; subtitle перечисляет количество и уровень; без hasDonation или donoValue.
giftredemption Уведомления об активации подарка. membership gift_recipient; значки по умолчанию — 🎁; subtitle указывает подаренный уровень.
membermilestone Сообщения о достижениях (memberMonth или displayMessage присутствует). membership member_milestone; subtitle обобщает месяцы и уровень; meta захватывает исходное сопоставление достижения.
viewer_update Статистика трансляции (одновременные зрители), когда включена передача количества зрителей. meta — целое количество; повторяет поведение DOM-скрипта, чтобы получатели могли объединять оба потока. Док-панель с &showviewercount запрашивает сбор количества зрителей на 70 минут и продлевает запрос каждый час, не меняя общую настройку постоянно.
likes_update Опрос официальной статистики видео, когда Отправлять общее количество лайков платформы включено. meta — текущее целое число лайков видео. Оно отправляется при изменении и периодически без изменений, чтобы у получателей оставались свежие данные. Общая настройка captureliketotals настройка включает это; устаревший captureyoutubelikes остаётся совместимым альтернативным именем. Включение настройки отдельной док-панели во всплывающем окне &showlikecount также постоянно включает эти общие настройки захвата, тогда как ручное добавление параметра URL управляет только отображением. Отключение параметра отображения не отключает общий сбор.
subscriber_update Опрос статистики канала (подписчики), когда showsubscount явно не отключено. meta — общее количество подписчиков; интерфейс обновляет счётчики панели.
view_update Опрос статистики канала (просмотры за всё время), когда showviewercount или режим ажиотажа активен. meta — целое количество просмотров.
live_chat_ended Чат становится недоступен для привязанной трансляции. meta.streamTitle заполняется, когда метаданные трансляции были закэшированы.
user_banned userBannedEvent из API чата трансляции или потока gRPC. Событие только с метаданными для виджетов модерации. meta включает имя пользователя и отображаемое имя, идентификатор канала, URL аватара или профиля, модератора, длительность блокировки или тайм-аута и признак постоянной блокировки.
new_follower Новый подписчик определяется через myRecentSubscribers API (опрос каждые 5 минут). chatname — название канала подписчика; chatmessage пустой, если на странице источника YouTube не включены сообщения уведомлений о подписчиках. meta включает channelId, title, subscribedAt, а сгруппированные серии добавляют grouped, count, others, и subscribers. Примечание: результаты могут задерживаться или быть неполными; можно определить только публично видимые подписки.

Пересылки чата из API используют meta.plainText для сообщения обычным текстом рядом с расширенным chatmessage содержимое. Это текст, а не HTML; в нём могут быть эмодзи Unicode. Для значков подписок резервным вариантом служат эмодзи (⭐, 💝, 🏅и т. д.) для согласованности с захватом DOM. Обычные данные чата также включают meta.messageId чтобы действия удаления в док-панели могли отправляться обратно в API модерации YouTube.

Уведомления о подписчиках YouTube (new_follower)

Social Stream теперь может определять новых подписчиков YouTube с помощью myRecentSubscribers адрес API. Это работает аналогично уведомлениям о подписчиках Streamlabs.

Как это работает:

  • Опрашивает API YouTube каждые 5 минут для получения новых подписчиков
  • Отслеживает увиденных подписчиков в localStorage для определения новых
  • Отправляет new_follower события с именем подписчика, аватаром и идентификатором канала
  • По умолчанию сообщения уведомлений о подписчиках отключены; при включении используется текущая строка перевода для alert-just-subscribed
  • По умолчанию объединяет серии из более чем трёх новых подписчиков, чтобы переподключения не переполняли оверлеи или Event Flow
  • Требуется включить режим WebSocket в настройках расширения

Ограничения (это ограничения API YouTube, а не Social Stream):

  • Нет гарантированного срока доставки — SSN опрашивает каждые пять минут, но API может возвращать задержанные или неполные результаты. Не рассчитывайте на фиксированное четырёхчасовое окно.
  • Только публичные подписки — Подписчики с приватным списком подписок не вызывают уведомлений. На YouTube подписки по умолчанию приватны.
  • Только владелец канала — Уведомления о подписчиках доступны только для каналов, которыми вы владеете и под которыми прошли аутентификацию.
  • Использование квоты API — Каждый опрос стоит 1 единицу API. При интервале 5 минут это примерно 288 единиц в день из стандартной суточной квоты 10 000.

Триггер редактора Event Flow: Используйте data.event === "new_follower" и data.type === "youtube"

YouTube WebSocket: краткий справочник событий и подписок

data.event data.membership Сценарий
sponsorshipnew_sponsorНовый участник через newSponsorEvent
sponsorshipnew_memberНовый участник через processMembership
resubrenewed_memberПродление подписки
resubupgraded_memberПовышение уровня
giftpurchasegift_giverПодаренные подписки на канал
giftredemptiongift_recipientПолучена подарочная подписка
membermilestonemember_milestoneСообщение о годовщине подписки
superchat-Super Chat
supersticker-Super Sticker
user_banned-Событие блокировки или тайм-аута только с метаданными
new_follower-Новый подписчик (опрос; возможна задержка)

Twitch — стандартный захват DOM

Реализация: sources/twitch.js

  • Держите чат Twitch открытым. Уведомления о подписках и пользователях захватываются, когда Twitch их отображает; доступ не ограничен учётными записями ведущего или модератора. Для функций конкретной учётной записи может потребоваться аутентификация.
  • Запросы количества зрителей обращаются к https://api.socialstream.ninja/twitch/viewers каждые 30 секунд.
  • Для уведомлений о фолловерах, рейдов и полной поддержки событий, включите режим WebSocket в настройках расширения.
  • Уведомления Watch Streak, которыми делятся зрители, по умолчанию отключены и требуют Показывать серии просмотра Twitch Watch Streaks настройка.
  • Включаемый по желанию PluralMind настройка может заменять chatname, nameColor, и часть, обёрнутую прокси, из chatmessage, также может добавляться текстовый значок с местоимениями. username остаётся логином Twitch; связанные удаления содержат delete.meta.pluralmind чтобы док-панель использовала этот стабильный логин.
Событие Когда срабатывает Примечания к данным
reward Карточки активации наград за баллы канала (включая контейнер наград 7TV). chatmessage содержит текст активации награды; membership без изменений.
giftpurchase Системные строки, например «Пользователь дарит X подписок каналу». chatmessage — системная строка, позволяющая оверлеям выделять кампании дарителей.
subscription_gift Уведомления о подаренных подписках («Пользователь подарил подписку …»). Помечает событие для фильтров выделения; membership остаётся подписью значка получателя.
viewer_update Запрос к прокси зрителей Social Stream каждые 30 секунд (при ошибке — 0). meta целое количество зрителей.
hype_train Закреплённое выделение сообщества Twitch показывает активный Hype Train в отдельном окне чата. Резервный вариант DOM только с метаданными и meta.sourceMode со значением dom. Использует видимый уровень, таймер и meta.progressPercent когда Twitch не предоставляет итоги баллов EventSub.
community_highlight Элементы внутри виджета Twitch «Community Highlight». meta — извлечённый текст выделения для автоматизации.
knock Приглашения к совместному эфиру Stream Together, показанные над чатом. chatmessage содержит текст приглашения; chatname берётся из пользователя уведомления, если доступен.
watch_streak Уведомление Watch Streak, которым зритель по желанию делится в чате Twitch. meta.streakCount содержит видимое количество, если определено; meta.milestoneId использует идентификатор уведомления DOM при наличии.

Bits/Cheers заполняют hasDonation (например, «500 bits»), хотя data.event остаётся пустым; ориентируйтесь на это поле при отображении виджетов пожертвований. Сведения о непрерывной подписке появляются в subtitle когда значки предоставляют месяцы.

Twitch — EventSub / WebSocket

Реализация: sources/websocket/twitch.js с общим ядром providers/twitch/chatClient.js

  • Разрешения OAuth: chat:read, chat:edit, user:write:chat, bits:read, moderator:read:followers, moderator:read:chatters, channel:read:subscriptions, channel:read:hype_train, channel:moderate, moderator:manage:banned_users, moderator:manage:chat_messages, channel:manage:broadcast, channel:read:redemptions, channel:read:ads, channel:manage:ads. Токены ведущего открывают доступ к числу подписчиков и фолловеров.
  • События EventSub и опрос Helix для общего количества зрителей, фолловеров и подписчиков.
  • Режим WebSocket предоставляет в реальном времени уведомления о фолловерах, подписки, рейды, Cheers, Power-up, активации наград за баллы канала и метаданные поезда ажиотажа.
  • Строки Shared Chat используют Twitch IRC source-room-id для заполнения sourceName/sourceImg с исходным каналом, когда он отличается от подключённого.
  • Уведомления Watch Streak, которыми делятся зрители, по умолчанию отключены и требуют Показывать серии просмотра Twitch Watch Streaks настройка.
  • Включаемый по желанию PluralMind настройка может заменять chatname, nameColor, и часть, обёрнутую прокси, из chatmessage, также может добавляться текстовый значок с местоимениями. username и userid сохраняют идентификацию Twitch; связанные удаления содержат delete.meta.pluralmind чтобы док-панель использовала эти стабильные поля.
Событие Когда срабатывает Примечания к данным
cheer Уведомления Cheer из EventSub channel.bits.use. hasDonation «N bits»; meta.bits числовой; chatmessage сохраняет исходное сообщение; у распознанных отправителей Cheers есть chatimg.
powerup Уведомления EventSub о встроенных или пользовательских Power-up channel.bits.use. Данные только события с пустым chatmessage и без hasDonation, поэтому обычная строка чата не создаётся. meta.bits имеет числовое значение, а meta.powerUp сохраняет подтип Twitch, название или идентификатор награды, сведения об эффекте и переданный текст сообщения при наличии.
new_subscriber channel.subscribe или USERNOTICE с msg-id=sub. meta включает { userId, tier, isGift }; кэшированное число подписчиков увеличивается, если доступно; количество зрителей опрашивается отдельно.
resub channel.subscription.message или USERNOTICE msg-id=resub. meta содержит непрерывный срок и общее количество месяцев; chatmessage включает текст повторной подписки.
subscription_gift channel.subscription.gift или USERNOTICE msg-id=subgift. meta предоставляет общее число подаренных подписок и уровень; chatmessage обобщает действие.
reward channel.channel_points_custom_reward_redemption.add. meta включает идентификатор награды, название, стоимость, подсказку, ввод пользователя, идентификатор и статус активации, а также устаревшее имя. Без поля верхнего уровня reward объект отправляется этим обработчиком EventSub. Старые получатели всё ещё могут показывать channel_points как устаревшее альтернативное имя.
raid EventSub channel.raid или USERNOTICE msg-id=raid. meta = { fromId, fromLogin, viewers }.
watch_streak Включаемое по желанию Twitch IRC USERNOTICE с msg-id=viewermilestone и msg-param-category=watch-streak. Включает зрителя в chatname, текст уведомления Twitch в chatmessage, и meta.streakCount/meta.milestoneId. Остальные общие типы USERNOTICE по-прежнему игнорируются.
new_follower channel.follow Уведомления EventSub. Автоматически увеличивает follower_update; meta записывает { userId, followedAt }.
viewer_update Helix streams опрос каждые 30 секунд. meta целое количество зрителей; подавляется, если статистика зрителей не включена в настройках.
follower_update Общее количество фолловеров Helix, запрашиваемое после события фолловера или периодическим опросом. meta целое количество фолловеров.
subscriber_update Общее количество подписчиков Helix (требуется токен ведущего с разрешением на подписки). meta целое количество подписчиков.
stream_online / stream_offline EventSub stream.online/stream.offline. meta.startedAt присутствует для событий онлайн; офлайн использует пустой объект.
ad_break / ad_request / ad_schedule Ответы API менеджера рекламы (channel.ad_break.begin, ручной POST channels/ads, GET channels/ads). meta описывает длительность, инициатора и данные расписания для панелей.
hype_train EventSub channel.hype_train.begin, channel.hype_train.progress, и channel.hype_train.end уведомления v2. Событие только с метаданными: без chatname или chatmessage. meta.phase имеет значение begin, progress, или end; meta включает идентификатор поезда, уровень, прогресс, цель, итог, участников поддержки, временные поля, признак общего поезда и trainType. Поезда сокровищ передаются через meta.trainType когда Twitch их помечает.
user_banned EventSub channel.ban, или IRC CLEARCHAT резервный вариант при недоступности событий блокировки EventSub. Событие только с метаданными для виджетов модерации. meta включает имя пользователя и отображаемое имя, идентификатор пользователя, URL аватара или профиля, модератора, причину, длительность блокировки или тайм-аута и признак постоянной блокировки.

Данные чата используют общий провайдер, поэтому data.event заполняется для `/me` (action) и устаревшее bits теги даже вне потоков EventSub. GIF-сообщения Twitch помещают ресурс Giphy в contentimg, оставьте chatmessage пустым, а резервную подпись Twitch сохраняйте в meta.gifLabel. Устранение дубликатов и удаление используют идентификаторы сообщений; сообщения, отправленные через SSN, используют собственный message_id из IRC-эха Twitch в data.id.

Метаданные Twitch Hype Train

hype_train содержит только метаданные и не включает chatname или chatmessage. Панели должны обновлять существующее представление поезда по meta.id вместо добавления каждого обновления прогресса как сообщения чата. Панель метаданных (meta.html) отображает эти события в виде верхней полосы прогресса.

Поле Введите Примечания
typeстрокаВсегда twitch.
eventстрокаВсегда hype_train.
meta.phaseстрокаbegin, progress, или end.
meta.idстрокаСтабильный идентификатор поезда. Используйте для создания или обновления одного видимого виджета поезда.
meta.broadcasterUserIdстрокаИдентификатор пользователя ведущего Twitch.
meta.broadcasterUserLoginстрокаЛогин ведущего Twitch.
meta.broadcasterUserNameстрокаОтображаемое имя ведущего Twitch.
meta.totalчисло | nullОбщая сумма поддержки поезда, сообщённая Twitch.
meta.progressчисло | nullТекущий прогресс к цели уровня.
meta.goalчисло | nullЦель текущего уровня.
meta.progressPercentчисло | nullРезервный процент из DOM, когда Twitch предоставляет только видимую полосу прогресса отдельного окна.
meta.levelчисло | nullТекущий или завершающий уровень поезда.
meta.topContributionsмассивГлавные участники поддержки. Каждая запись включает userId, userLogin, userName, type, и числовой total.
meta.lastContributionобъект | nullПоследний взнос с той же структурой, что у topContributions.
meta.sharedTrainParticipantsмассивНеобработанные данные участников общего поезда от Twitch, если переданы.
meta.startedAtстрокаМетка времени ISO начала поезда.
meta.expiresAtстрокаМетка времени ISO истечения текущего поезда.
meta.endedAtстрокаМетка времени ISO окончания поезда или пустая строка до завершения.
meta.cooldownEndsAtстрокаМетка времени ISO окончания интервала ожидания или пустая строка до завершения.
meta.isSharedTrainлогическое значениеTrue, если Twitch помечает поезд как общий.
meta.trainTypeстрокаОбычно regular; поезда сокровищ передаются здесь, когда Twitch их так помечает.
meta.allTimeHighLevelчисло | nullМаксимальный уровень поезда за всё время, если Twitch его передаёт.
meta.allTimeHighTotalчисло | nullМаксимальный итог поезда за всё время, если Twitch его передаёт.
meta.sourceModeстрокаНеобязательный маркер источника, например dom.
meta.eventSubTypeстрокаИсходный тип EventSub: channel.hype_train.begin, channel.hype_train.progress, channel.hype_train.end, или dom.community_highlight.

Twitch EventSub: краткий справочник событий

data.event Сценарий
new_followerПользователь подписался на канал
new_subscriberНовая подписка
resubПовторная подписка с сообщением
subscription_giftПодаренные подписки на канал
cheerПоддержка битами
powerupИспользован встроенный или пользовательский Power-up
rewardАктивация награды за баллы канала
raidВходящий рейд
viewer_updateЧисло одновременных зрителей
follower_updateОбщее количество фолловеров
subscriber_updateОбщее количество подписчиков
stream_onlineТрансляция началась
stream_offlineТрансляция завершена
ad_breakНачался рекламный перерыв
hype_trainМетаданные состояния Hype Train / Treasure Train
user_bannedПользователь заблокирован или получил тайм-аут

OBS Flow Actions

Реализация: actions.html через события OBS WebSocket v5, с dock.html События источника «Браузер» OBS как резервный вариант

  • Держите оверлей Flow Actions открытым с тем же сеансом Social Stream, что у редактора и фонового процесса Event Flow, либо держите док-панель загруженной внутри OBS.
  • Настройте OBS WebSocket v5 в OBS 28 или новее; стандартный URL: ws://127.0.0.1:4455.
  • Это системные события Event Flow. Они не включают chatname или chatmessage, а дополнительные сведения OBS остаются внутри meta.
Событие Когда срабатывает Примечания к данным
stream_started OBS сообщает, что выход трансляции перешёл в состояние started. type имеет значение obs; event имеет значение stream_started; meta.source имеет значение obs-websocket или obs-browser-source; meta.outputState может содержать исходное состояние вывода OBS.
stream_stopped OBS сообщает, что выход трансляции перешёл в состояние stopped. type имеет значение obs; event имеет значение stream_stopped; meta.outputActive может быть false.
recording_started OBS сообщает о начале записи. type имеет значение obs; meta.obsEvent обозначает источник события OBS.
recording_stopped OBS сообщает об остановке записи. type имеет значение obs; meta.outputState может содержать исходное состояние WebSocket.
scene_changed OBS меняет активную сцену программы. type имеет значение obs; meta.sceneName содержит имя сцены, когда OBS его предоставляет.
media_ended Медиаисточник OBS завершает воспроизведение. type имеет значение obs; meta.inputName и meta.inputUuid обозначают медиаисточник.
replay_buffer_saved OBS сохраняет буфер повтора. type имеет значение obs; meta.savedReplayPath может содержать путь сохранённого повтора.

Окно уведомлений Streamlabs

Реализация: sources/streamlabs.js (DOM окна уведомлений); необязательный сокет-мост в sources/websocket/streamlabs.html

  • Держите окно уведомлений Streamlabs открытым во вкладке или источнике «Браузер», чтобы уведомления отрисовывались; скрипт содержимого читает сообщение, изображение и токены из DOM уведомления.
  • Уведомления в стиле пожертвования задают hasDonation (например, «$10 USD» или «100 bits») и необязательный donoValue в долларах США.
  • Определяемые типы событий: follow, subscription, gift, cheer, donation, superchat, raid, redeem, merch, sponsor.
  • Для сокет-моста вставьте токен Streamlabs Socket API и подключитесь; уведомления передаются без страницы окна уведомлений.
Событие Когда срабатывает Примечания к данным
donation Чаевые, благотворительность, JustGiving или общие уведомления «donated». hasDonation сохраняет текст валюты (например, «$36» или «$10 CAD»); donoValue передаётся только при доступном значении в долларах США; другие подписанные суммы используют общий пересчёт валют.
cheer Уведомления о битах / Cheer Twitch. hasDonation становится «100 bits», а donoValue захватывает сумму в долларах США.
subscription Уведомления о подписках. Стандартные поля заданы; chatmessage — строка уведомления; meta.tokens содержит значения токенов (name, amount, levelName и т. д.).
gift Подаренные платные подписки. meta.tokens.amount может показывать количество подарков; meta.tokens.levelName может хранить уровень.
follow Уведомления о фолловерах. Без полей пожертвований; chatname отражает токен имени уведомления.
raid Уведомления о рейдах. meta.tokens.count хранит количество участников рейда, если есть.
redeem Уведомления об активации наград Cloudbot. meta.tokens.product захватывает предмет награды.
merch Уведомления о покупке мерча. meta.tokens.product содержит название купленного товара.
superchat Уведомления типа Super Chat от YouTube или поддерживаемых интеграций уведомлений. hasDonation содержит сумму; получатели могут продолжать принимать устаревший donation альтернативные имена.
sponsor Уведомления в стиле спонсорства или подписки, предоставляемые Streamlabs. Стандартные поля; без пожертвования, если текст не содержит сумму.

TikTok Live — захват DOM и поток TikFinity

Реализация: sources/tiktok.js для собственных страниц TikTok и sources/tikfinity.js для виджета или iframe ленты активности TikFinity. У SSApp по-прежнему есть собственная интеграция TikTok с самым широким охватом событий (см. документацию SSApp).

  • Работает на странице эфира ведущего. Баннеры подарков, лайков и фолловеров заполняются только в аутентифицированном сеансе.
  • TikTok предоставляет много событий через обнаружение в DOM без требования режима WebSocket — подарки, фолловеры, лайки и отдельно включаемые присоединения захватываются из отрисованных строк.
  • Страницы виджетов TikFinity по адресу tikfinity.zerody.one/widget/activity-feed* тоже работают. Встроенный iframe ленты активности отправляет те же канонические поля TikTok для чата, фолловеров, распространений, подарков, подписок, отдельно включаемых присоединений и сундуков сокровищ.
  • Дополнительная аутентификация API не требуется.
  • Нативный режим SSApp по-прежнему добавляет события сверх захвата страницы или виджета: question_new, emote, viewer_update, и включаемый по желанию агрегированный likes_update.
Событие Когда срабатывает Примечания к данным
gift Строки баннеров подарков или DivGiftMessage записи. hasDonation преобразует в «N coins» с резервным поиском подарка; membership использует текст значка при наличии.
joined Уведомления о присоединении, когда общая настройка Захватывать события присоединения к трансляции настройка включена. Пропускает уведомления о распространении; chatname может быть пустым для некоторых системных строк.
followed Сообщения о новых фолловерах, разобранные из социальных карточек. Обеспечивает chatname существует перед отправкой.
shared Строки распространения TikFinity. chatmessage — отображённый текст распространения.
subscribe Строки подписок TikFinity. membership устанавливается в SUBSCRIBER.
envelope Строки сундуков сокровищ TikFinity. meta.coins и meta.canOpen содержат сведения о сундуке.
liked Сводки массовых лайков, запускаемые социальными карточками TikTok. chatname включается, когда TikTok его предоставляет; анонимные или системные карточки лайков всё равно могут отправляться. TikTok передаёт это обычным путём через фоновый процесс. Он направляет одну копию в оверлей реакций, затем продолжает основной конвейер чата и событий только когда capturelikeevent включено.
likes_update SSApp получает достоверный накопительный итог TikTok LIVE, пока captureliketotals включено. meta — текущее общее целое значение. SSApp отправляет первое значение сразу, объединяет серии максимум в одно обновление за пять секунд, повторяет последнее значение примерно каждые 90 секунд и отправляет ноль по окончании трансляции. Это отдельно от относящихся к конкретному зрителю liked события.
true (логическое значение) Общие социальные или системные передачи, для которых TikTok не указывает подтип. Используйте chatmessage содержимое для выбора отображения; логическое true означает «системное событие — тип неизвестен».

membership повторяет подсказки значков (уровни подписчиков). Кэширование аватаров сохраняет chatimg действительным между событиями; если DOM скрывает цвет для модераторов, скрипт очищает nameColor. Строки подарков TikFinity также задают contentimg на иконку подарка, если доступна. Обновления серий подарков собственного DOM и TikFinity включают meta.tiktokGiftStreakId, meta.tiktokGiftCount, и meta.tiktokGiftQuietMs чтобы оверлеи могли объединять повторные обновления; устаревшие идентификаторы серий уникальны для экземпляра страницы. Метаданные подарка также могут включать tiktokGiftMessageId (исходный идентификатор сообщения TikTok), tiktokGiftSenderId, groupId, giftId, giftName, streakable, и repeatEnd. Собственные идентификаторы обозначают один подарок в разных окнах захвата; ненулевой идентификатор группы вместе с идентификаторами отправителя и подарка обозначает накопительные обновления серии. Захват SSApp через WebSocket передаёт те же поля после завершения серии, с count сохраняется для совместимости. Его переключатель пожертвований проверяется при пересылке каждого подарка: отключение пожертвований TikTok удаляет hasDonation и donoValue с сохранением события и метаданных подарка. Озвучивание использует эти идентификаторы для объединения обновлений и подавления завершённых дубликатов до десяти минут в ограниченном кэше и читает подарки TikTok как отправителя, количество и название подарка. Старые данные используют прежние идентификаторы серий и текст сообщений; идентификация не выводится только из текста подарка. Озвучивание подарков TikTok использует выбранный язык голоса независимо от языка интерфейса. Глаголы объявлений переведены на английский, испанский, португальский, французский, немецкий, итальянский и нидерландский; остальные языки используют отправителя, количество и название подарка без английского глагола. Упрощённое озвучивание сохраняет этот нейтральный формат. Названия подарков остаются такими, как передала платформа; каталоги подарков и сообщения чата автоматически не переводятся, язык трансляции не определяется.

В этих обновлениях серии количество и подпись пожертвования накопительные: 1, 2, 3 означают три подарка, а не шесть. При подсчёте итогов нужно добавлять только прирост сверх наибольшего уже учтённого значения для идентификатора серии. Стандартный захват поддерживает устаревшие классы подарков и текущие строки с изображением и количеством; оба сохраняют event: "gift" и hasDonation. При неизвестной цене сохраняются количество и названия подарков для отображения, а оценка в долларах США использует одну монету за подарок. Переданный источником donoValue имеет приоритет; метаданные отрисованного подарка могут предоставлять coinsPerGift или diamondsPerGift до необходимости обращаться к таблице подарков или значению по умолчанию. Оценки монет Standard/TikFinity и нативных алмазов SSApp используют свои существующие разные пересчёты; ни один не означает гарантированную денежную выплату.

Whatnot

Реализация: sources/whatnot.js

  • Откройте страницу живого шоу Whatnot с видимым чатом; существующий захват WebSocket передаёт чат, уведомления аукциона и продаж, ошибки оплаты, рейды, пожертвования и быстрые обновления зрителей. Снимки товаров и розыгрышей по-прежнему зависят от разделов DOM, отрисованных в представлении шоу.
  • Capture Stream Events («Захватывать события трансляции») управляет системными событиями Whatnot и обновлениями метаданных аукциона и каталога; строки присоединения также требуют Захватывать события присоединения к трансляции; количество зрителей по-прежнему подчиняется переключателям зрителей и ажиотажа.
Событие Когда срабатывает Примечания к данным
viewer_update Изменения количества зрителей из обновлений эфира WebSocket с резервным опросом DOM. meta — целое количество зрителей.
donation События чаевых Whatnot WebSocket и взносов в усиление сообщества. hasDonation содержит отформатированную сумму; контекст WebSocket остаётся в meta.
raid События рейдов Whatnot WebSocket, включая ответы истории активности. meta.numRaiders включается, когда Whatnot его предоставляет.
joined Строки чата, нормализованный текст которых начинается с joined, когда Захватывать события присоединения к трансляции включено. Использует строковые метки событий для уведомлений о присоединении, а не логическое true).
auction_update Когда меняется состояние аукциона в нижней панели эфира (текст победителя или лидера, название, ставки, цена, таймер, состояние продажи); пакеты WebSocket жизненного цикла аукциона часто ускоряют обновление. Событие только с метаданными. Без chatname/chatmessage; данные находятся в meta (например meta.title, meta.bids, meta.price, meta.timer, meta.status).
commerce_update Когда меняются разделы каталога (товары, Surprise Sets, предстоящие розыгрыши); пакеты WebSocket жизненного цикла товаров и розыгрышей часто ускоряют обновление. Снимок только с метаданными, количествами по разделам и массивами элементов в meta.products, meta.surpriseSets, и meta.upcomingGiveaways.
auction_started, new_bid, auction_ended, product_sold Приходит соответствующее уведомление WebSocket в реальном времени. Это отдельные события, независимые от существующих снимков отображения. platform/type: "whatnot", обычный текст chatname, userid если передан, название товара в subtitle, и обычный текст chatmessage с textonly: true. Доступные идентификаторы и сведения об аукционе находятся в meta: productId, auctionId, orderId, transactionId, livestreamId, bidId, bids, auctionEndTime, и status. Необязательный price указывается в основных единицах валюты, с priceText и currency если передан.
payment_failed Приходит уведомление WebSocket о неудачной оплате в реальном времени. Те же доступные поля покупателя, товара и идентификаторов, с meta.paymentStatus: "failed". Когда только product.purchaserUserId обозначает покупателя, заполняет userid в событиях продажи или оплаты, а имя покупателя остаётся пустым. Покупатель не определяется по другому или предыдущему аукциону.
payment_succeeded Приходит уведомление WebSocket об успешной оплате в реальном времени. meta.paymentStatus: "succeeded", с покупателем, товаром, идентификатором заказа и другими разрешёнными полями из этого уведомления. Это остаётся отдельным платёжным событием и не создаёт ещё одно purchase или пожертвование. Отсутствующие поля остаются пустыми или не передаются, даже если предыдущая продажа их содержала.

Обновления отображения аукциона и торговли остаются снимками на основе DOM. Для сопоставления отдельного события WebSocket в Event Flow используйте Тип события (расширенный), выберите Собственное событие, затем введите точное имя. Подписи могут использовать **{username}**\n{subtitle} с выбранной насыщенностью текста; условия могут сравнивать meta.paymentStatus с failed. Событие импортируемый пример подписи Whatnot доступен. Существующие настройки захвата событий трансляции продолжают действовать.

Дополнительные необязательные поля: meta.catalogProductId (поле пакета product.productId), meta.parentProductId (product.parentId), meta.transactionType (тип продажи Whatnot без изменений) и meta.placeOrderErrorReason (код ошибки заказа или оплаты, переданный Whatnot). Эти ссылки на товары описывают каталог или родительское объявление; они не заменяют идентификатор заказа. Остаток товара не считается приобретённым количеством.

Для автоматизации успешных платежей задайте Тип события (расширенный) триггер в Собственное событие: payment_succeeded, а источник отфильтруйте до Whatnot. Существующие условия и шаблоны могут использовать поля этого события userid, chatname, subtitle и meta.orderId напрямую. Ранее сохранённая покупка не нужна, если уведомление содержит необходимые сведения.

Завершение аукциона или пометка товара как проданного не подтверждает успешную оплату: эти уведомления не отправляются как оплаченные purchase события и не задают суммы пожертвований. Событие успеха отправляется только для полученного payment_succeeded уведомление; захват не опрашивает завершение оплаты и не выводит его из продажи. Другие paymentStatus значения передаются только если явно присутствуют в захваченном пакете. Отсутствующие идентификаторы не передаются; один идентификатор товара может относиться к нескольким продажам, поэтому для сопоставления уведомлений используйте переданный идентификатор заказа или аукциона. Захват не запоминает покупки и не сопоставляет обновления платежей; такой процесс нужно явно настроить в Event Flow. Кратковременные дубликаты пакетов от двух существующих мостов захвата подавляются. Исходные объекты заказов и платежей не передаются.

eBay Live

Подключение продавца eBay в Monetization требует настроенного сервиса SSN eBay и согласия продавца через OAuth; описанный ниже захват eBay Live независим. Режим песочницы использует URL тестовых объявлений, обозначает покупателя как «eBay Sandbox buyer» и добавляет к сообщению префикс «Sandbox test purchase:». Покупки песочницы сохраняют тот же контракт покупки и могут запускать включённые уведомления и действия чата при тестировании. Реализованный платёжный контракт отправляет event: "purchase", с type и platform со значением ebay. Требуется оплаченный заказ, соответствующий выбранному товару. id — стабильный непрозрачный идентификатор позиции заказа; chatname равно «eBay buyer», chatmessage является обычным текстом (textonly: true), subtitle — название товара и необязательный contentimg — его изображение. meta.ebayPurchase содержит itemId, itemName, quantity, и публичный url. Никаких данных покупателя, доставки, hasDonation или donoValue включается. Это отличается от собранных обновлений аукциона или остатков, которые не доказывают оплату.

Реализация: sources/ebay.js

  • Откройте либо /ebaylive/events/<id>/chat или /ebaylive/events/<id>/stream. Оба получают один поток аукциона в реальном времени.
  • Публичный поток WebSocket передаёт аукционы, ставки, победителей, продления времени и изменения остатков; запрос GraphQL только для чтения получает сведения об объявлениях. Захват DOM остаётся резервным вариантом, когда сетевые данные недоступны.
  • Capture Stream Events («Захватывать события трансляции») управляет снимками метаданных (auction_update, commerce_update); счётчики зрителей по-прежнему учитывают переключатели зрителей и ажиотажа.
Событие Когда срабатывает Примечания к данным
viewer_update Когда меняется количество зрителей активного события — счётчик заголовка или резервный значок события эфира. meta — целое количество зрителей.
follower_update Когда адрес статистики продавца возвращает число его фолловеров. meta — целое количество фолловеров. Источник опрашивает адрес продавца каждые 60 секунд; адрес всё равно может возвращать кэшированное значение до 5 минут.
auction_update Когда меняются метаданные активного аукциона. Событие только с метаданными. Сетевой захват задаёт meta.sourceMode на network и предоставляет title, price, bidder, winner, bids, timer и endingAt. meta.ebay содержит eventId, listingId, запись объявления GraphQL (listing), текущее публичное объявление из сокета (eventListing) и последнее обновление аукциона (update). Они сохраняют категорию, изображения, валюты, количества, сведения о брейке коробки, результаты аукциона и временные поля, не теряя деталей платформы при упрощении. Запись GraphQL — полученный снимок; объявление и обновление из сокета содержат более свежее состояние эфира. История при первоначальном подключении и переподключении включается в текущий снимок, а не отправляется как старые победы. Удаление всех отображаемых объявлений отправляет status: "idle" с cardCount: 0 для очистки аукциона. Резервный захват DOM сохраняет поля карточки плеера или предпросмотра события.
commerce_update Когда меняются разделы снимков каталога или событий эфира. Снимок только с метаданными в meta. Сетевой режим включает eventId, navigation.viewerCount и playerCards для текущих отображаемых объявлений, каждое с тем же подробным ebay объект как снимок аукциона. Пустой список карточек очищает удалённые объявления. Резервный захват DOM также может включать liveEvents, livePreview, currentEvent и upcomingEvents.
reaction Когда eBay Live отображает анимацию сердечка или реакции. Отправляется напрямую в отдельное направление реакций. meta.reactionType имеет значение heart; eBay не передаёт имена отдельных пользователей для этих DOM-анимаций.

События метаданных eBay намеренно не включают chatname/chatmessage; принимающие оверлеи должны отображать из data.event + data.meta только.

Kick — стандартный захват DOM

Реализация: sources/kick.js

  • Для получения изображений профилей и значков подписчиков требуется аутентифицированный сеанс.
  • Ограниченное определение событий по тексту чата и значкам; количество зрителей по-прежнему работает при включённом переключателе.
Событие Когда срабатывает Примечания к данным
gift Подарки KICKs определяются по изображению стикера и видимой сумме валюты Kick. hasDonation содержит N KICKs (1 KICK для одного), когда видимая сумма доступна; contentimg содержит изображение подарка. Существующий текст сообщения сохраняется.
reward Активации наград («has redeemed …»). chatmessage содержит текст активации награды.
true (логическое значение) Общие системные уведомления, не соответствующие шаблонам подарков или наград. Используйте chatmessage содержимое для выбора отображения; логическое true означает «системное событие — тип неизвестен».
viewer_update Опрашивает API канала Kick каждые 30 секунд (только при включённой статистике зрителей). meta целое количество зрителей; для подписок, фолловеров или чаевых используйте мост Kick ниже.

Kick — WebSocket / мост

Реализация: sources/websocket/kick.js с общими вспомогательными модулями в providers/kick/core.js

  • OAuth через мост Social Stream Kick. Текущие разрешения: user:read, channel:read, channel:write, channel:rewards:read, chat:write, events:subscribe, moderation:ban, moderation:chat_message:manage, и kicks:read. Токены обновляются автоматически.
  • Создание вебхуков Kick может занять несколько минут; интерфейс показывает активные подписки для каждого канала.
Событие Когда срабатывает Примечания к данным
message Данные чата моста. meta.plainText содержит сообщение обычным текстом, в котором могут оставаться эмодзи; значки объединяются из платформы и кэша профиля. Ответы в ветках заполняют initial, reply, и meta.reply когда доступны сведения об ответе или кэшированное родительское сообщение.
reward channel.reward.redemption.updated, а также данные чата и системных сообщений моста, похожие на активации наград. meta включает идентификатор награды или активации, название, стоимость, статус, ввод пользователя и получателя награды.
new_subscriber channel.subscription.new. membership назначается роли подписчика; meta включает { subscriber, plan }.
resub channel.subscription.renewal. meta.duration (месяцы) и meta.plan доступен; subtitle обобщает серию.
subscription_gift channel.subscription.gifts. meta.totalGifted, meta.gifter; резервный значок — 💝.
donation События поддержки или чаевых, определяемые эвристиками типа события; подарки KICKs используют gift ниже. hasDonation содержит отформатированную сумму; meta содержит { amount, currency, supporter, message, giftName }.
gift kicks.gifted (подарки KICKs), как и при сборе из DOM. hasDonation содержит N KICKs (1 KICK для одного); contentimg содержит изображение подарка, если доступно. Структурированные сведения о подарке остаются в meta.
raid Обработка совместимости для устаревших данных сокета формата host, например App\Events\StreamHostEvent. В текущем официальном каталоге событий Kick нет подписки на raid/host. Если приходят совместимые устаревшие данные, они сопоставляются с каноническим raid; не полагайтесь на это в текущем сценарии Kick.
new_follower channel.followed. Иконки фолловеров берутся из кэша профилей; follower_update срабатывает, когда Kick передаёт текущие итоги.
follower_update Мост передаёт количество фолловеров в данных вебхука. meta целое общее количество; панели используют его для целей по фолловерам.
stream_online / stream_offline livestream.status.updated. meta содержит исходное тело состояния Kick (is_live, title и т. д.).
viewer_update livestream.status.updated когда Kick включает количество одновременных зрителей. meta целое количество зрителей; отправляет 0 при состоянии офлайн, чтобы очистить устаревшие счётчики.
user_banned moderation.banned из моста, вебхука или событий блокировки сокета чата Kick. Событие только с метаданными для виджетов модерации. meta включает имя пользователя и отображаемое имя, идентификатор пользователя, URL аватара или профиля, модератора, причину, длительность блокировки или тайм-аута и признак постоянной блокировки.

Поиск профилей использует profileCache; mapBadges объединяет ресурсы значков Kick с кэшированным SVG при наличии. Когда Kick сообщает пожертвования в KICKs, мост преобразует их в hasDonation а также meta.amount с currency используют резервное «KICKs». Данные чата включают meta.messageId когда мост предоставляет собственный идентификатор сообщения Kick, чтобы синхронизация удаления затрагивала правильное сообщение. Данные ответов включают meta.reply с родительским messageId, author, и text если известно. Переданные сведения об ответе остаются доступны, даже если исходное сообщение не закэшировано; у ответа только с идентификатором без кэшированного контекста всё ещё может не быть видимой цитаты.

Kick WebSocket: краткий справочник событий

data.event Сценарий
new_followerПользователь подписался на канал
new_subscriberНовая подписка
resubПродление подписки
subscription_giftПодаренные подписки
rewardАктивация награды канала или сообщение чата / системы в стиле награды
donationСобытие чаевых / поддержки
giftСобытие подарка KICKs
raidУстаревший ввод host/raid только для совместимости; не текущая официальная подписка Kick
follower_updateОбщее количество фолловеров
stream_onlineТрансляция началась
stream_offlineТрансляция завершена
user_bannedПользователь заблокирован или получил тайм-аут

VPZone — WebSocket

Реализация: sources/websocket/vpzone.js

  • Подключается к wss://chat.vpzone.tv/ws?channel=USERNAME; OAuth запрашивает profile:read, chat:read, chat:write, channel:read, channel:write, и chat:moderate. Токен bearer также можно указать вручную.
  • Плоские кадры VPZone, например type: "msg" нормализуются в стандартные данные чата.
  • На стороне платформы delete_message / clear_chat кадры удаляют соответствующие строки из док-панели; необязательные переключатели синхронизируют удаления и блокировки док-панели обратно в VPZone только для владельца канала.
  • Владельцам канала доступна локальная панель Stream Info для изменения названия и категории эфира, как на странице источника Twitch.
Событие Когда срабатывает Примечания к данным
message VPZone msg, message, new_message, или chat_message кадр WebSocket. chatname поступает из username; chatmessage поступает из body; признаки подписчика, владельца, модератора и VIP копируются в chatbadges, признаки ролей верхнего уровня и meta. Собственные идентификаторы заполняют data.id и meta.messageId.
viewer_update VPZone presence кадр с count или эквивалентное поле зрителей. meta — целое количество зрителей эфира; участвует в агрегированном viewer_updates.
new_subscriber VPZone subscribe / subscription кадр. membership устанавливается в Subscriber при наличии признаков подписки.
subscription_gift VPZone gift / gift_subscription кадр. Использует то же имя события подаренной подписки, что Twitch, Kick, Rumble и Velora. subtitle содержит количество подарков (x5) или получателя.
message + hasDonation VPZone system кадр с metadata.kind: "pixels_cheer" (чаевые Pixels). Строка чата с пожертвованием; hasDonation — подпись суммы (например 100 Pixels), meta.pixels целое число. event остаётся пустым; определяйте эти чаевые по hasDonation. События поддержки моста Kick вместо этого используют event: "donation".
message ответы VPZone msg кадр, содержащий metadata.reply_to (идентификатор сообщения, автор, отрывок — денормализованы на сервере). Отображаются как ответы Kick: initial хранит подпись «автор: отрывок», reply исходный текст ответа, meta.reply структурированную цель. Учитывает исключают «replying to» настройка.
raid VPZone raid кадр с metadata.kind: "incoming". Кадры исходящего рейда пропускаются; meta.viewers содержит размер рейда, если передан.
shoutout VPZone shoutout кадр (!so команда). meta.targetUser содержит название упомянутого канала.
reward VPZone system кадр с metadata.kind: "channel_points_redeem". Активация награды за баллы канала с тем же именем события, что у наград Twitch.
stream_online / stream_offline VPZone system кадры с metadata.kind: "stream_started" / "stream_ended". Приписывается имени канала (кадры не содержат автора действия).
new_follower VPZone follow кадр. Преобразуется в стандартную структуру события фолловера.
joined События WebSocket VPZone о присоединении или присутствии, когда Захватывать события присоединения к трансляции включено. Преобразуется в системное событие в формате чата с метаданными автора действия VPZone в meta.

Joystick

Реализации: sources/joystick.js, sources/inject/joystick-ws.js, и sources/websocket/joystick.js

  • Обычный источник сайта Joystick 2.0 работает с выполненным входом на /u/<channel>/chat странице. Читает поле страницы ChatChannel, WhisperChatChannel, EventLogChannel, и SystemEventChannel Кадры Action Cable с резервным чтением отрисованных строк для Electron и переподключений.
  • Сообщения чата сайта используют те же основные поля, что YouTube, Twitch и Kick: собственный id, chatname, chatmessage, chatimg, chatbadges, nameColor, membership, mod, private, username/userid, и timestamp когда Joystick их предоставляет. Если сокет не передаёт цвет имени пользователя, отрисованная строка предоставляет тот же nameColor поле, используемое док-панелями с поддержкой цветов.
  • Изменения сообщений на сайте заменяют соответствующую строку док-панели; удаления, заглушения и блокировки убирают соответствующие строки по собственному идентификатору или имени пользователя.
  • Отдельный источник WebSocket использует учётные данные бота Joystick (client_id + client_secret); источник сайта использует сеанс страницы с выполненным входом.
  • Авторизуется на https://joystick.tv/api/oauth/authorize, затем обменивает или обновляет токены по адресу https://api.joystick.tv/api/oauth/token.
  • Подключается к wss://api.joystick.tv/cable и подписывается на GatewayChannel.
  • Необязательный обмен токенов OAuth используется для вспомогательных адресов, например https://api.joystick.tv/api/users/stream-settings.
  • Отдельный источник с учётными данными бота не отправляет viewer_update. Источник сайта с выполненным входом отправляет количество зрителей, когда сокет страницы передаёт его, как описано ниже.
Событие Когда срабатывает Примечания к данным
message Joystick ChatMessage, BotMessage, new_message, bot_message, event_bot_message, pvp_message, а также личные сообщения. У обычного чата нет event. Собственный идентификатор помещается в поле верхнего уровня id и meta.messageId; роли и приватное состояние используют установленные поля верхнего уровня и значков.
new_follower Joystick StreamEvent с типом Followed. Использует стандартную структуру фолловера и устраняет дубликаты относительно соответствующей строки бота Joystick. Необязательный meta.userId/meta.followedAt включаются только когда Joystick их предоставляет.
new_subscriber / subscription_gift Типы событий Joystick NewSubscription / GiftedSubscription. Использует совместимые с Kick ключи метаданных подписки: eventType, subscriber, gifter, totalGifted, duration, и plan.
donation Joystick StreamEvent типы Tipped / TipMenu. hasDonation содержит количество и единицу токенов для общего пересчёта в доллары США, если доступны; соответствующая строка бота Joystick устраняется как дубликат. meta использует установленные ключи событий поддержки Kick: eventType, supporter, amount, currency, message, giftName, giftType, и tier.
stream_online / stream_offline Joystick StreamEvent типы, например Started, StreamResuming, Ended, StreamEnding. Используется для автоматизации переходов в эфир и офлайн с учётом способа передачи.
user_enter / user_leave Joystick UserPresence типы enter_stream / leave_stream. Уведомления о присутствии отправляются как сообщения событий и могут скрываться настройками hide-events. Эти настройки также скрывают события трансляции без пожертвований.
viewer_update Источник сайта с выполненным входом получает ViewerCountUpdated через EventLogChannel. Использует обычное целое число meta, как у YouTube, Twitch и Kick. Отправляется только при включённом режиме количества зрителей или ажиотажа. Отдельный источник с учётными данными бота по-прежнему не получает количество зрителей.
follower_update / subscriber_update События Joystick с обновлением количества фолловеров и подписчиков. Использует обычное целое число meta, в соответствии с контрактом счётчика Twitch.
Игнорируемые внутренние уведомления ChatMessageReceived, состояние устройства и несопоставленные обновления виджетов, например состояние целей чаевых, PvP или сабатона. Это уведомления передачи или состояния страницы, а не события Social Stream. Они не преобразуются в выдуманные snake_case имена событий; реальное ChatChannel/new_message строка остаётся единственными данными чата.

XP Sync

Реализация: sources/xpsync.js

  • Строки чата используют канонические поля данных с type: "xpsync", включая автора, сообщение, аватар, значки-изображения и встроенные SVG-значки, цвет имени, подписку, признаки модератора, участника и бота, а также собственный UUID сообщения в id при наличии.
  • Ответы следуют соглашению DOM-источников YouTube, Twitch и Kick: если префиксы ответов не отключены, initial содержит пользователя, которому отвечают, reply сохраняет сообщение без префикса, а chatmessage получает видимый префикс ответа.
  • Строки, выделенные Sparks, захватываются, хотя XPSync отображает их без обычного класса строки чата и идентификатора сообщения; видимая сумма доступна через hasDonation как N Sparks.
  • При включённом захвате событий строки с «just followed» или «followed the channel» отправляют event: "new_follower".
  • При включённом количестве зрителей постоянная док-панель чата отправляет event: "viewer_update" из количества зрителей видео, уже загруженного страницей XPSync, и обновляет его по обновлениям страницы эфира XPSync. Отдельные учётные данные SSN не требуются.

Instagram — захват эфира через REST и входящие новости

Реализация: sources/instagram.js и sources/instagramlive.js (одинаковые копии)

  • На страницах эфира (/<user>/live/?broadcast_id=...), чат трансляции поступает из собственного веб-API Instagram, который опрашивается с того же источника с cookie сеанса: GET /api/v1/live/{broadcast_id}/get_comment/?last_comment_ts={ts} примерно каждые 2 секунды, и POST /api/v1/live/{broadcast_id}/heartbeat_and_get_viewer_count/ примерно каждые 5 секунд при включённом количестве зрителей. После трёх последовательных ошибок или при отсутствии broadcast_id можно определить), источник переключается на разбор отрисованного DOM чата.
  • Личная лента активности учётной записи опрашивается через POST /api/v1/news/inbox/ примерно каждые 45 секунд на любой странице Instagram. Первый опрос только заполняет набор устранения дубликатов, поэтому история никогда не воспроизводится повторно; записи устраняются как дубликаты по tuuid.
  • Обязательные заголовки API (все статические или вычисляемые): X-IG-App-ID: 936619743392459, X-CSRFToken (из cookie), X-ASBD-ID: 359341, X-Requested-With: XMLHttpRequest, Content-Type: application/x-www-form-urlencoded.
  • Все события ленты активности используют type: "instagram"; чат трансляции остаётся type: "instagramlive". События лайков идут обычным путём через фоновый процесс: он отправляет одну копию в отдельный оверлей реакций, затем включает их в основной поток чата и событий только при capturelikeevent включено, как у TikTok и MeetMe. hideevents и собственный фильтр событий блокируют их везде. Поскольку события входящих принадлежат учётной записи с выполненным входом, они подавляются при просмотре чужого эфира (оба /<user>/live/ страницах и эфирах в просмотрщике историй; принадлежность определяется для каждого профиля и повторно проверяется после ошибок поиска) и отправляются в вашем эфире и на всех страницах вне эфира. Одновременно входящие опрашивает одна активная вкладка Instagram, и только при выполненном входе.
Событие Когда срабатывает Примечания к данным
message (в прямом эфире) Новые записи в get_comment ответ (comments[]/system_comments[]) либо новые строки чата DOM, когда REST недоступен. Стандартные данные чата, type: "instagramlive". REST предоставляет точный user.username, user.profile_pic_url, и уникальный pk используется для устранения дубликатов.
viewer_update heartbeat_and_get_viewer_count сообщает об изменённом viewer_count, когда включён захват количества зрителей или режим ажиотажа. meta целое количество зрителей. Опрос прекращается, когда broadcast_status больше не является "live".
stream_online / stream_offline stream_online срабатывает один раз при начале сеанса трансляции REST; stream_offline срабатывает, когда проверка соединения сообщает неэфирное broadcast_status (требуется захват количества зрителей или режим ажиотажа). События только с метаданными, соответствующие общему словарю состояний трансляции Twitch и Joystick.
new_follower Запись во входящих новостях с типом подписки notif_name (или story_type 12) появляется. chatname — новый фолловер, chatimg изображение их профиля, chatmessage текст входящих (например, «x начал следить за вами»).
follow_request Один private_user_follow_request запись появляется (приватные учётные записи получают запросы вместо прямых подписок). Та же структура, что у new_follower, которые остаются раздельными, чтобы автоматизация могла одобрять запросы или приветствовать по-разному.
liked Запись во входящих новостях с типом лайка notif_name (включая comment_like) появляется. Общий словарь лайков с TikTok / MeetMe. chatname — автор действия, chatmessage текст входящих (например, «x понравилось ваше фото»).
message (комментарий к собственному посту) Запись во входящих новостях с типом комментария notif_name появляется. Обычная строка чата (event: false), type: "instagram"; chatmessage содержит текст входящих, включая отрывок комментария.
notification Любой другой тип записи во входящих новостях (упоминания, отметки, покупки и т. д.). Общий универсальный вариант; meta.notifName и meta.storyType сохраняют исходную классификацию записи.

Facebook Live

Реализация: sources/facebook.js (сбор из DOM) и необязательный мост Graph API в sources/websocket/facebook.html

  • Захват DOM читает отрисованные комментарии Facebook; мост Graph API управляемой страницы читает комментарии видео. Оба используют type: "facebook", стандартные поля чата и отсутствие event для обычных комментариев. Мост API также включает необязательный platform: "facebook".
  • Мост API использует userid для идентификатора автора, если доступен, timestamp для допустимого времени создания в миллисекундах Unix и contentimg для изображения-вложения HTTP(S), переданного API. У комментариев только с изображением может быть пустое chatmessage. textonly применяется только к телу сообщения: исходный текст при true, экранированный HTML при false.
  • Контекст комментария API использует meta.messageId (собственный идентификатор комментария), meta.permalink, meta.videoId, и meta.pageId. В более ранних сборках API использовался meta.commentId, дублируемые поля автора и времени в meta, а также передавали туда необработанные вложения. Новые сборки вместо этого используют стандартные поля автора, времени и медиа; синхронизация удаления от этого не появляется.
  • Количество зрителей обновляется только при включении. Мост API читает одновременные live_views; суммарные просмотры видео не подставляются, а для недоступного количества не выдумывается ноль. Захват через API не выводит Stars, подписки, выделения или ответы из обычного текста комментария.
  • Stars захватываются из отрисованного DOM чата трансляции, когда Facebook показывает видимый N sent маркер; они заполняют hasDonation и donoValue по курсу 100 Stars = 1 доллар США без задания data.event.
  • Для проверки добавьте ssnreplay=1 к URL Facebook Live для обработки строк чата, уже видимых после обновления.
Событие Когда срабатывает Примечания к данным
viewer_update DOM опрашивает значок зрителей эфира; мост API опрашивает одновременные просмотры эфира, если это включено. meta целое количество зрителей, как у других источников. Отсутствующие или неразбираемые значения пропускаются; настоящий ноль допустим.
hasDonation Facebook Stars, отображаемые в DOM чата трансляции. Стандартные данные чата; hasDonation содержит видимое количество Stars, например 100 Stars, и donoValue содержит сумму в долларах США. Stars не задают data.event.
highlightColor Facebook отображает видимый HIGHLIGHTED подпись. Использует обычные поля чата и highlightColor; без data.event задано. Stars по-прежнему используют hasDonation.

Online Church

Реализация: sources/onlinechurch.js

  • Использует сбор из DOM публичного чата и заголовка медиа.
  • Количество зрителей обновляется только когда Показывать количество зрителей или режим ажиотажа включён.
Событие Когда срабатывает Примечания к данным
message Новые записи появляются в #publicchat. Стандартные данные чата с именем отправителя, аватаром, значками и необязательной подписью членства при наличии в DOM.
viewer_update Опрашивает значок текущих зрителей в заголовке медиа каждые 10 секунд. meta целое количество зрителей; отправляет 0 когда значок отсутствует или нечитаем, чтобы очистить устаревшие счётчики.

SharePlay.tv

Реализация: sources/shareplay.js

  • Использует сбор из DOM выдвижной панели чата трансляции на страницах каналов SharePlay.
  • После подключения сборщика отправляются только вновь вставленные строки и карточки чата; существующая история намеренно игнорируется.
Событие Когда срабатывает Примечания к данным
message В основной ленте чата появляются новые строки. Стандартные данные чата с автором, аватаром, изображениями значков и эмоутами с сохранённой HTML-разметкой. Ответы в ветках также заполняют initial, reply, и meta.reply когда родительская строка ещё присутствует.
raid SharePlay вставляет карточку Blitz в ленту чата трансляции. Преобразуется в каноническое событие рейда. meta.cardType имеет значение "blitz", с необязательным meta.fromLogin и meta.viewers когда текст карточки их предоставляет.
shoutout SharePlay вставляет карточку упоминания канала или подписки в ленту чата. Отправляется как data.event = "shoutout". Баннер карточки передаётся через contentimg, тогда как meta.cardType и meta.action сохраняют подпись карточки или текст кнопки.
viewer_update Опрашивает видимый значок зрителей в заголовке каждые 10 секунд. meta целое количество зрителей; отправляется только когда Показывать количество зрителей или режим ажиотажа включён, и отправляет 0 если значок становится нечитаемым, чтобы очистить устаревшие счётчики.

Streamplace

Реализация: sources/streamplace.js

  • Читает страницу эфира Streamplace, отрисованную React, и при подключении пропускает видимую историю чата.
  • Сообщения в стиле пересылки, например Name (Discord): message нормализуются до имени пересылаемого отправителя.
Событие Когда срабатывает Примечания к данным
message После подключения появляются новые строки чата Streamplace. Стандартные данные чата с nameColor, chatbadges, ссылки с сохранённой HTML-разметкой и поля ответа initial, reply, и meta.reply когда виден.
viewer_update Значок зрителей в заголовке меняется, когда включён захват количества зрителей или режим ажиотажа. meta целое количество зрителей.

WorldsWave

Реализация: sources/worldswave.js

  • Поддерживает страницы эфиров WorldsWave и URL только чата, например https://worldswave.com/kn_livecmd.php?cmd=viewStream&streamId=STREAM_ID&chatonly=1.
  • Использует стабильный data-ww-*/ww-chat-* разметку при наличии, сохраняя устаревшие селекторы kontackt для страниц только с чатом и старых макетов.
  • При подключении захвата существующая история чата пропускается; проверяйте новым сообщением.
  • Для количества зрителей требуется Показывать количество зрителей или режим ажиотажа. Отдельные события подарков и чаевых и обратная отправка не реализованы. Отрисованная строка всё ещё может предоставлять подпись пожертвования через data-ww-donation.
Событие Когда срабатывает Примечания к данным
message Появляется новая отрисованная строка чата WorldsWave. Стандартные данные чата с type: "worldswave", имя отправителя, аватар, необязательный идентификатор пользователя, цвет имени, значки, статус модератора, подписку, сумму пожертвования, вложение и идентификацию канала. Стабильные идентификаторы сообщений WorldsWave доступны как meta.messageId с устранением дубликатов между одновременно открытыми панелями предпросмотра и полного чата. Встроенные изображения сообщений продолжают очищаться, когда текстовый режим отключён.
viewer_update Видимое общее количество зрителей эфира меняется, когда включён захват количества зрителей или режим ажиотажа. meta — целое количество зрителей. Стабильный data-ww-viewer-count значение имеет приоритет; сокращённые устаревшие значения, например 1.2K нормализуются как резервный вариант.

FLEX TV

Реализация: sources/flextv.js

  • Читает отрисованную панель чата на https://www.flextv.co.kr/channels/*/live страницах.
  • Панель чата должна быть видна. При подключении источника существующая история пропускается, поэтому проверяйте новой строкой чата.
  • Для этого источника пока не задокументированы количество зрителей, пожертвования или путь обратной отправки.
Событие Когда срабатывает Примечания к данным
message Новый видимый элемент FLEX TV .chat-item строки появляются в ленте чата трансляции. Стандартные данные чата с type: "flextv", chatname, chatmessage, nameColor, изображения значков в chatbadges, а сведения об участниках FLEX — в meta когда предоставлено через data-member.

Seal Team Sloth

Реализация: sources/sealteamsloth.js

  • Читает отрисованный чат отдельного окна на https://sealteamsloth.com/popout-chat/* страницах.
  • Для количества зрителей требуется Показывать количество зрителей или режим ажиотажа.
Событие Когда срабатывает Примечания к данным
message Появляется новая отрисованная строка чата Seal Team Sloth. Стандартные данные чата с type: "sealteamsloth", имя отправителя, аватар и содержимое сообщения.
viewer_update Видимое общее количество зрителей эфира меняется, когда включён захват количества зрителей или режим ажиотажа. meta — целое количество зрителей; сокращённые значения, например 1.2K нормализуются.

MeetMe — захват DOM и WebSocket

Реализация: sources/meetme.js

  • Читает отрисованный DOM чата трансляции MeetMe на app.meetme.com/live/view/... страницах и внутри api.gateway.meetme-live.com/web-live/... iframe.
  • Когда WebSocket iframe доступен, wss://video-live.meetme.com/ кадры разбираются перед резервным чтением DOM для захвата более подробных событий эфира.
  • hideevents подавляет события без пожертвований; подарки MeetMe и пожертвования алмазами по-прежнему заполняют поля пожертвований. capturejoinedevent включает уведомления о присоединении и возвращении. Для конкретного автора действия liked события используют общую маршрутизацию фонового процесса, управляемую через capturelikeevent; агрегированный reaction эффекты остаются явно направленными в оверлей реакций.
  • Количество зрителей берётся прежде всего из видимого заголовка MeetMe; итог WebSocket используется только при недоступности счётчика DOM. Значение отправляется при изменении и повторяется примерно каждые 30 секунд, пока showviewercount/hypemode включено; общее количество фолловеров передаётся только при изменении и не чаще примерно раза в 60 секунд.
Событие Когда срабатывает Примечания к данным
message Новый SNSChatMessage приходят кадры WebSocket либо новые ChatMessage_* Строки DOM появляются в ChatHistoryContainer_*. Стандартные данные чата с именем отправителя, аватаром, HTML или текстом сообщения и изображениями или текстом значков. Сведения строки DOM — плоские meta ключи, включая messageId, roomId, level, levelColor, badgeLabels, badgeSrcs, badgeClasses, isBouncer, isTopStreamer, isBestOfTheWeek, rank, и rowClassName. Данные WebSocket задают meta.source = "websocket".
joined / rejoined / left SNSChatParticipant приходят кадры WebSocket создания, обновления или удаления либо MeetMe отображает в DOM join-cell строка. Уведомления о присоединении и возвращении требуют Захватывать события присоединения к трансляции. Отправляет системные уведомления в формате чата с именем и аватаром автора действия, когда MeetMe их предоставляет. meta.isNewViewer, meta.viewerLevelId, meta.isBouncer, и meta.isSubscriber сохраняют состояние участников.
new_follower MeetMe отображает в DOM строку добавления в избранное или подписки, например Favorited. Использует общий словарь событий фолловеров. chatname — автор действия, chatimg — найденное фото профиля, если доступно, а плоский meta.favoriteText/meta.targetName сохраняют исходные сведения строки.
gift SNSGiftMessage приходят кадры WebSocket либо MeetMe отображает изображение подарка в строке чата. hasDonation содержит видимую подпись подарка или значение алмазов, contentimg содержит изображение подарка, если предоставлено, а плоские ключи, например meta.giftName, meta.giftCount, meta.amount, и meta.currency сохраняют структурированные сведения. Поле gift событие зарезервировано для настоящих кадров или строк подарков; отображение пожертвований по-прежнему должно определяться по hasDonation.
donation SNSDiamond кадры WebSocket предоставляют активность алмазов. Отдельные кадры алмазов считаются событиями пожертвования. hasDonation форматируется как алмазы для общего пересчёта в доллары США, а meta.amount/meta.currency остаются плоскими для автоматизации.
liked / reaction SNSLike приходят кадры WebSocket. Лайки с указанием автора используют тот же liked словарь и централизованную маршрутизацию фонового процесса, как TikTok. Агрегированные и анонимные итоги лайков отправляются только в направление реакций как reaction, с плоским meta.reactionType, meta.totalLikes, и meta.subscriberLikes. Различие определяется смыслом события, а не анонимностью: capturelikeevent управляет только отдельными liked/like события.
follower_update SNSVideo метаданные WebSocket предоставляют общее количество фолловеров. meta — целое число фолловеров, согласно общему соглашению о событиях счётчиков.
guest_update SNSVideoGuestBroadcast приходят кадры создания или обновления. Событие только с метаданными о состоянии гостя или соведущего эфира. Плоский meta ключи включают status, position, totalGuests, isMuted, guestBroadcastId, videoViewerId, и broadcastId.
viewer_update Видимый значок зрителей в заголовке меняется или SNSVideo метаданные WebSocket предоставляют общее количество зрителей при недоступности значка; при включении неизменившиеся итоги повторяются примерно каждые 30 секунд. meta целое количество зрителей; отправляется только при включённом захвате количества зрителей или режиме ажиотажа.

Velora

Реализация: sources/velora.js и sources/websocket/velora.js

  • Стандартный режим читает видимый DOM чата; режим WebSocket использует Velora Events API с OAuth.
  • Поддерживаемые URL стандартного режима включают https://velora.tv/*, https://velora.tv/dashboard/stream/popout?panels=chat%2Cactivity&channel=CHANNEL&layout=vertical, и https://velora.tv/dashboard/stream/popout/CHANNEL/obs-chat.
  • Карточки Volts и баллов канала отправляются как данные событий, когда доступны через DOM или Events API.
Событие Когда срабатывает Примечания к данным
message Появляются новые строки чата Velora или приходят сообщения чата Events API. Стандартные данные чата со значками, цветом автора, ссылками и эмоутами, сохраняемыми вне текстового режима.
volts Карточки Velora Volts или channel.volts Приходят данные Events API. hasDonation содержит показанное количество Volts; захваты DOM включают meta.source = "dom".
channel_points Карточки баллов канала / активации наград Velora или channel.channel_points_redemption Приходят данные Events API. chatmessage содержит сообщение активации награды или её название; meta.rewardTitle обозначает награду, если доступно.
subscription Видимая строка активности Velora сообщает, что пользователь стал участником или подписчиком канала. membership содержит видимую подпись подписки.
viewer_update Видимое количество зрителей меняется, когда включён захват количества зрителей или режим ажиотажа. meta целое количество зрителей.

Parti — захват чата профиля / отдельного окна

Реализация: sources/parti.js

  • Поддерживает URL профилей, например https://parti.com/USERNAME и URL отдельных окон, например https://parti.com/popout-chat?id=USER_ID.
  • Количество зрителей получает адрес проверки эфира Parti, когда включён захват количества зрителей или режим ажиотажа.
Событие Когда срабатывает Примечания к данным
message Видимые строки чата Parti появляются в потоке чата профиля или отдельного окна. Стандартные данные чата; nameColor сохраняет отрисованный цвет автора Parti и chatmessage сохраняет встроенное содержимое, если текстовый режим не включён.
donation Видимые строки чаевых Parti сообщают, что пользователь отправил определённую сумму. hasDonation содержит отображаемую сумму, meta.amount/meta.currency заполняются, когда возможен разбор, meta.amountText сохраняет исходный текст суммы, а donoValue задаётся для чаевых в долларах США.
viewer_update Проверка соединения Parti возвращает количество зрителей эфира. meta — целое количество зрителей; страница повторно использует один токен проверки соединения на окно источника, чтобы не завышать счётчики.

CHZZK — захват отдельного окна чата

Реализация: sources/chzzk.js

  • Поддерживает https://chzzk.naver.com/live/*/chat и https://chzzk.naver.com/iframe/live/*/chat.
  • Количество зрителей получает адрес опроса состояния эфира CHZZK, когда включён захват количества зрителей или режим ажиотажа.
Событие Когда срабатывает Примечания к данным
message Видимые строки чата CHZZK появляются в потоке отдельного окна чата. Стандартные данные чата с type: "chzzk", nameColor, URL изображений значков в chatbadges, и отрисованные эмоуты в chatmessage если текстовый режим не включён.
чат с hasDonation В чате появляются видимые строки пожертвований cheese CHZZK. hasDonation содержит показанное количество cheese. Эти строки не задают data.event.
viewer_update Опрос состояния эфира возвращает количество зрителей. meta — целое количество зрителей.

Rumble — стандартный захват DOM

Реализация: sources/rumble.js

  • Требуются cookie аутентифицированного сеанса, чтобы service.php API зрителей отвечает.
  • Отрисованные строки Rant предоставляют hasDonation; карточки входящего рейда предоставляют event: "raid". Этот источник DOM не отправляет поток событий подписчиков и фолловеров моста API.
Событие Когда срабатывает Примечания к данным
message Видимые строки чата Rumble появляются на странице или в отдельном окне чата. Стандартные данные чата; chatmessage сохраняет HTML изображений эмоутов Rumble после отрисовки страницы, если текстовый режим не включён.
viewer_update Вызывает у Rumble video.watching-now сервис каждые 30 секунд. meta целое количество зрителей; использует credentials: 'include' для повторного использования cookie сеанса.
чат с hasDonationВидимая строка Rant содержит цену.hasDonation сохраняет отрисованную цену; маркер события пожертвования не добавляется.
raidВ чате появляется карточка входящего рейда.Использует видимое сообщение рейда и необязательное изображение карточки в contentimg.

Rumble — WebSocket / URL API

Реализация: sources/websocket/rumble.js

  • Требуется URL Live Stream API, принадлежащий автору, из https://rumble.com/account/livestream-api. Согласно документации Rumble, этот URL содержит ключ трансляции, не требует отдельной аутентификации и должен передаваться только доверенным сторонним сервисам.
  • Передача только для чтения. Публичная документация Rumble Live Stream API не описывает официальный адрес отправки чата, поэтому источник передаёт сообщения и события в Social Stream, но не отправляет чат обратно в Rumble.
  • livestreams[].chat заполняется только пока выбранная трансляция в эфире. Используйте ?streamId=... для выбора конкретной трансляции, когда API предоставляет несколько; недопустимые идентификаторы теперь вызывают ошибку вместо скрытого перехода к другой трансляции.
  • Страница также определяет https://rumble.com/chat/popup/<livestreams[].id> чтобы вы могли сразу открыть обычное отдельное окно чата с внедрённым скриптом, не загружая сначала страницу ведущего /live странице.
Событие Когда срабатывает Примечания к данным
message Новые записи приходят из SSE-потока чата Rumble после того, как официальный API определит livestreams[].id; иначе используется livestreams[].chat.recent_messages. Стандартные данные чата. meta.source имеет значение rumble_sse когда SSE-поток чата доступен и включает URL аватаров из users[].image.1; иначе используется резервный live_stream_api без аватаров. Когда каталог эмоутов отдельного окна доступен, chatmessage отображает короткие коды эмоутов Rumble как HTML изображений, а meta.plainText сохраняет исходный текст короткого кода.
donation Новые записи Rant появляются в livestreams[].chat.recent_rants. hasDonation содержит сумму, отформатированную в долларах США; meta включает amount_cents, amount_dollars, и expiresOn.
new_follower Новые записи появляются в followers.recent_followers. Системное событие с chatname задаётся как имя нового фолловера и метка времени в meta.followedOn.
new_subscriber Новые записи появляются в subscribers.recent_subscribers. membership устанавливается в SUBSCRIBER; subtitle повторяет задокументированную сумму в долларах США, когда Rumble её передаёт.
subscription_gift Новые записи появляются в gifted_subs.recent_gifted_subs. chatname — даритель, hasDonation становится N Gifted, и meta включает totalGifted, remainingGifts, giftType, и videoId.
follower_update При каждом изменении выбранного счётчика фолловеров. meta целое количество фолловеров. По умолчанию followers.num_followers; с ?followerMode=total, использует followers.num_followers_total когда Rumble его предоставляет.
subscriber_update Всякий раз, когда subscribers.num_subscribers меняется. meta целое количество подписчиков.
stream_online / stream_offline Когда выбранная трансляция переключается между эфиром и офлайн. meta включает очищенное подмножество полей трансляции (id, title, createdOn, метки категорий, отметки «нравится» и «не нравится», количество зрителей). Конфиденциальные значения, такие как stream_key намеренно не передаются.
viewer_update Всякий раз, когда livestreams[].watching_now меняется для выбранной трансляции. meta целое количество одновременных зрителей; отправляет 0 когда выбранная трансляция уходит в офлайн, чтобы очистить устаревшие счётчики.

Этот способ передачи предназначен для каналов, которыми вы владеете или управляете. Поскольку URL API содержит ключ трансляции, не показывайте его в оверлеях, журналах, скриншотах и общих профилях браузера. Аватары чата поступают из SSE-потока Rumble после определения идентификатора трансляции официальным API; этот способ не собирает аватары со страниц Rumble.

YouNow — захват DOM

Реализация: sources/younow.js

  • Читает отрисованный DOM чата трансляции и отправляет стандартные данные чата с type: "younow".
  • Строки активности зрителей, например is watching, I became a fan!, и invited N fans to this broadcast. помечаются с помощью event: true чтобы фильтры событий могли их направлять.
Событие Когда срабатывает Примечания к данным
message В чате зрителей трансляции появляются новые строки. Стандартные данные чата; строки активности поклонников и зрителей задают event: true.
viewer_update Видимое количество в панели зрителей меняется, пока showviewercount/hypemode включено. meta целое количество зрителей; отправляет 0 когда счётчик исчезает.

Favorited Studio — захват DOM

Реализация: sources/favorited.js

  • Читает отрисованный DOM чата трансляции и отправляет стандартные данные чата с type: "favorited".
Событие Когда срабатывает Примечания к данным
message Появляются новые строки чата. Стандартные данные чата.
viewer_update Счётчик вкладки зрителей эфира меняется, пока showviewercount/hypemode включено. meta целое количество зрителей, прочитанное из content-live-viewers вкладке.

BEAM — захват DOM

Реализация: sources/beamstream.js

  • Читает отрисованный DOM чата трансляции и отправляет стандартные данные чата с type: "beamstream".
Событие Когда срабатывает Примечания к данным
message Появляются новые строки чата. Стандартные данные чата с обычным текстом chatname, URL аватара в chatimg, а URL изображений или объекты SVG-значков — в chatbadges. Поля, скрытые на странице захвата Beam, остаются пустыми. Собственные ссылки профилей Beam не считаются внешними источниками пересылки. contentimg может содержать встроенные вложения video/webm, если доступны.
viewer_update Элемент счётчика зрителей меняется, пока showviewercount/hypemode включено. meta целое количество зрителей; отправляется только если страница чата предоставляет счётчик зрителей.

Castyr — захват DOM

Реализация: sources/castyr.js

  • Читает новые отрисованные строки чата из https://castyr.live/homebeta/popout-chat/* и отправляет стандартные данные чата с type: "castyr".
  • При подключении источника существующая история чата пропускается.
Событие Когда срабатывает Примечания к данным
message Новый .chat-message строка появляется. Стандартные данные чата с именем отправителя, отрисованным содержимым сообщения и цветом имени, если он доступен.
viewer_update Видимый счётчик активного чата меняется, пока showviewercount/hypemode включено. meta — целое число, прочитанное из элемента активного чата Castyr с атрибутом title.

SOOP — захват DOM плеера

Реализация: sources/sooplive.js. Поддерживает единый play.sooplive.com плеер и устаревший play.sooplive.co.kr URL. Прежний общий макет чата по-прежнему распознаётся, если сайт его использует.

Публичный чат отправляет type/platform: "sooplive", обычный текст chatname/userid, nameColor, и очищенный chatmessage. Существующие строки, повторные идентификаторы сообщений, переведённые копии и личные сообщения исключаются. Эмоуты превращаются в безопасные изображения или альтернативный текст в текстовом режиме.

С showviewercount или hypemode включено, viewer_update содержит целое число meta из поля плеера #nAllViewer. Отдельные окна только с чатом могут не показывать этот счётчик. При открытии отдельного окна SSApp использует полный плеер, поскольку текущие всплывающие окна SOOP зависят от родительского окна.

Gosh — захват чата канала

Реализация: sources/gosh.js. Откройте https://gosh.com/USERNAME с видимым чатом либо вставьте этот URL в Add other source SSApp. Отдельное окно чата не требуется.

Новые строки чата отправляют type/platform: "gosh", обычный текст chatname, nameColor, и очищенный chatmessage. Встроенные изображения и GIF сохраняют безопасные HTTP(S)-адреса. При textonlymode, изображения превращаются в альтернативный текст или [image] если альтернативного текста нет. Аватары, значки, пожертвования и подписки остаются пустыми, если отсутствуют в захваченной строке.

Держите виртуализированный чат прокрученным к новым сообщениям. Существующая история, повторно отрисованные строки и системные уведомления без автора исключаются. Индексы отрисовки остаются внутренними и не отправляются как собственные идентификаторы сообщений. События фолловеров, пожертвований, количества зрителей или модерации не выводятся предположительно.

Livacha — захват комнаты чата

Реализация: sources/livacha.js. Откройте https://livacha.com/chat/ROOM с видимым чатом либо вставьте URL комнаты в Add other source SSApp.

Новые строки чата отправляют type/platform: "livacha", обычный текст chatname, chatimg, nameColor, и очищенный chatmessage. Относительные URL аватаров и встроенных изображений превращаются в абсолютные HTTP(S)-адреса. Абзацы, переносы строк и списки объединяются в одно сообщение чата. При textonlymode, изображения превращаются в альтернативный текст или [image].

Идентификаторы сообщений используются внутри, чтобы не захватывать повторно изменения и заново добавленные строки. Начальная история и старые сообщения, добавленные сверху, пропускаются; метки времени и меню реакций находятся вне захватываемого текста. События пожертвований, подписок, модерации или количества зрителей не выводятся предположительно.

Stream.space — экспериментальный захват DOM

Реализация: sources/streamspace.js. Совпадает только с https://beta.stream.space/chat-popup.php?channel=USERNAME и эквивалентный https://stream.space всплывающее окно.

Новые отрисованные строки чата отправляют type: "streamspace", platform: "streamspace", обычный текст chatname/userid, chatmessage, аватар chatimg, уровень в виде изображения chatbadges, и nameColor. Встроенные эмоуты пересоздаются как безопасные изображения либо как альтернативный текст при textonlymode включено. Существующая история, приветственные уведомления, предпросмотр ответов и закреплённые дубликаты исключаются.

viewer_update содержит целое число meta читается из #popupViewersNum когда showviewercount или hypemode включено. События пожертвований, подписок или модерации не выводятся предположительно.

Экспериментально: при проверке отдельное окно beta оставалось в состоянии загрузки. SSApp загрузил окно и захватил обновления зрителей, но доставка живого чата и отдельное окно рабочей версии остаются непроверенными. SSN не может захватывать сообщения, которые сайт не отображает.

w.tv и Prime — захват DOM

Реализации: sources/wtv.js на https://w.tv/USERNAME/chat и sources/prime.js на https://prime.gs/USERNAME?chat_popout=1.

Новые строки чата используют type/platform из wtv или prime, обычный текст chatname, nameColor, и очищенный chatmessage. В текстовом режиме встроенные эмоуты превращаются в безопасные изображения или альтернативный текст. Prime также включает поле строки userid и поддерживает как ссылки профилей при выполненном входе, так и подписи имён без входа. Аватары и значки остаются пустыми, если недоступны в проверенной структуре строки.

Начальная история, закреплённые карточки и предпросмотр ответов исключаются. w.tv виртуализирует чат: для захвата держите его прокрученным к новым сообщениям. Тестовые идентификаторы DOM — индексы отрисовки, а не собственные идентификаторы сообщений. Prime пропускает старую историю, подгруженную выше начальных сообщений, и заглушки игнорируемых пользователей.

Ни одно отдельное окно не предоставляет проверенного количества зрителей, поэтому эти адаптеры не отправляют обновления зрителей и не определяют предположительно события пожертвований, подписок или модерации.

Согласование событий между платформами

Эта таблица показывает соответствие похожих понятий между платформами. По возможности новые источники должны использовать общие имена событий из первого столбца.

Понятие YouTube WS Twitch WS Kick WS
Новый участник / подписчик sponsorship new_subscriber new_subscriber
Продление / повторная подписка resub resub resub
Подарочные подписки giftpurchase subscription_gift subscription_gift
Полученный подарок giftredemption - -
Важная отметка membermilestone - -
Пожертвование / чаевые superchat, supersticker, jeweldonation с hasDonation cheer (биты) donation
Новый фолловер new_follower (опрос)* new_follower new_follower
Количество зрителей viewer_update viewer_update viewer_update
Количество фолловеров - follower_update follower_update
Количество подписчиков subscriber_update subscriber_update -
Состояние трансляции live_chat_ended stream_online/stream_offline stream_online/stream_offline
Рейд - raid -
Активация награды - reward reward

Примечания о согласовании

  • YouTube использует sponsorship для новых участников, тогда как Twitch и Kick используют new_subscriber. При создании межплатформенных триггеров стоит проверять оба варианта.
  • resub согласован на всех трёх платформах для продлений.
  • События подарков различаются: YouTube использует giftpurchase/giftredemption, тогда как Twitch и Kick используют subscription_gift.
  • Пожертвования различаются по платформам: YouTube использует конкретные имена платных событий, например superchat, supersticker, и jeweldonation с hasDonation; у Twitch есть биты (cheer); у Kick есть чаевые (donation).
  • new_follower теперь согласован на всех трёх платформах, но YouTube опрашивает новых подписчиков и может возвращать задержанные или неполные результаты.
  • Лайки и реакции имеют отдельные контракты: отдельный liked/like события доходят до оверлея реакций, если не отфильтрованы глобально, и поступают в основной конвейер только когда capturelikeevent включено. Визуальное или собственное для платформы reaction события сохраняют маршрутизацию, заданную источником. Агрегированные likes_update счётчики отдельно управляются через captureliketotals.

Охват и ограничения совместимости

Этот справочник описывает реализованные данные, но не гарантирует доставку каждого события каждой платформой. Пустой hasDonation присваивания в источнике не доказывают поддержку пожертвований. Получаемые данные по-прежнему определяются видимостью DOM, разрешениями учётной записи, переключателями захвата и доступностью API. Передача удалений зависит от источника; не предполагайте универсальную синхронизацию модерации.

Учтённые расхождения и пробелы

Пара / область Обнаруженное расхождение / отсутствие Влияние
Twitch: стандартный захват и WebSocket Общее: reward, subscription_gift, viewer_update, hype_train, и включаемый по желанию watch_streak. Только Standard: giftpurchase, knock, community_highlight. Только WebSocket: new_subscriber, resub, cheer, powerup, raid, new_follower, follower_update, subscriber_update. channel_points теперь является устаревшим именем активации наград Twitch; новые интеграции должны ориентироваться на reward.
Kick: стандартный захват и WebSocket Стандартный режим отправляет простые маркеры (gift, reward, логическое значение true, viewer_update). WebSocket добавляет официальные события фолловеров, подписок, подарков, активации наград, KICKs, модерации и состояния эфира. Сохраняется совместимость с устаревшим raid данные, но сейчас Kick не предоставляет официальной подписки на raid/host. Режим WebSocket предоставляет больше данных; при переходе следует проверить автоматизацию, основанную на именах событий только стандартного режима. Не требуйте события рейда Kick.
YouTube: стандартный захват и WebSocket Общее: superchat, supersticker, jeweldonation, sponsorship, resub, giftpurchase, giftredemption, viewer_update. Только Standard: thankyou, redirect. Только WebSocket: membermilestone, new_follower, subscriber_update, view_update, likes_update (по явному включению). Основные имена подписок и событий согласованы в обоих вариантах; Super Chat, Super Sticker и Jewels используют hasDonation, тогда как покупки и активации подарочных подписок — нет.
Все поверхности Многие источники заполняют hasDonation без задания data.event. Это правильно; отображение пожертвований должно определяться по hasDonation, с data.event зарезервировано для смысла системы или события.

Альтернативные и устаревшие имена отдельных источников

Эти сопоставления относятся к указанным источникам и контекстам, а не являются глобальными заменами. Поддержка альтернативных имён у получателей различается по страницам. Текущие источники TikTok DOM и TikFinity по-прежнему отправляют followed; Velora использует subscription и channel_points, а Streamlabs использует subscription. Принимайте текущий контракт источника и его соответствующие устаревшие имена, а не переименовывайте каждое совпадающее событие.

Альтернативное / устаревшее имя Каноническая замена Контекст
subscriptionnew_subscriberНовая подписка Twitch / Kick
subgiftsubscription_giftПодаренная подписка Twitch
membershipsponsorshipНовый участник YouTube (общий вариант)
new_membersponsorshipНовый участник YouTube
new_membershipsponsorshipНовый участник YouTube
newmembersponsorshipНовый участник YouTube
new-membershipsponsorshipСборщик DOM YouTube (вариант с дефисом)
upgraded_membershipresubПовышение уровня YouTube
upgraded-membershipresubСборщик DOM YouTube (вариант с дефисом)
membership_upgraderesubПовышение уровня YouTube
membership_milestonemembermilestoneСообщение о достижении YouTube
member_milestonemembermilestoneСообщение о достижении YouTube (вариант с подчёркиванием)
gift_membershipgiftpurchaseНабор подарков YouTube
membership_giftgiftpurchaseНабор подарков YouTube
giftmembershipsgiftpurchaseНабор подарков YouTube (вариант во множественном числе)
gifted_membershipgiftredemptionПолучен подарок YouTube
gifted_membershipsgiftpurchaseНабор подарков YouTube (вариант во множественном числе)
community_giftgiftpurchaseНабор подарков сообществу
channel_pointsrewardАктивация награды Twitch WebSocket (устаревшее имя)
followednew_followerТекущий вывод TikTok DOM/TikFinity; при объединении режимов захвата TikTok принимайте оба имени.

Использование справочника

  • Добавляя новое событие, используйте существующий словарь (subscription_gift, viewer_updateи т. д.) по возможности. Если отклонение неизбежно, задокументируйте его здесь вместе с причиной.
  • Оставьте data.meta предсказуемым: предпочитайте плоские ключи, не перегружайте строки смешанными данными и всегда указывайте единицы (currency, bits, duration).
  • Обновляйте эту страницу вместе с изменениями данных событий; инструкции агентам меняйте только при изменении общих правил разработки.
  • Проверяйте изменения данных и на стороне отправляющего источника, и на стороне принимающего оверлея или триггера Event Flow.
  • Захват зависит от поддержки источника и настроек. Чтобы скрыть строки с маркером события в док-панели или оверлее выделенных сообщений, добавьте &hideevents или &hideallevents. Чтобы скрыть выбранные события, используйте &filterevents=subscription_gift,new_follower,gifted.
  • Для YouTube, Twitch и Kick включите Режим WebSocket для самой широкой поддержки событий конкретной платформы. Захват подарков и пожертвований YouTube, включая подарки и Super Chat, доступен в стандартном режиме и WebSocket; WebSocket добавляет другие типы событий. Точная поддержка всё равно зависит от платформы, роли учётной записи и выданных разрешений.

Наверх

Оверлеи монетизации

Чаевые NinjaBacker используют platform: "ninjabacker", type: "ninjabacker", chatname, обычный текст chatmessage, textonly: true, с префиксом источника id, отформатированный hasDonation, и числовой donoValue. Это обычные строки пожертвований без event переопределение. meta.ninjabacker содержит ISO currency и в основных единицах валюты amount. Для анонимных чаевых используется имя Anonymous. Источник использует либо SSE в реальном времени без повтора, либо отдельно включаемый приёмник подписанных вебхуков в API SSN с очередью доставки до семи дней. Надёжная доставка использует стабильный ninjabacker:delivery:DELIVERY_ID id. Ни один режим не получает обратные операции возвратов или споров. Учётные данные приёмника и секреты подписи никогда не попадают в данные событий. Управляемые вызывающей стороной callbackId не являются идентификаторами оплаты и не передаются. Тестовые чаевые из панели исключаются из строк пожертвований. Они отправляют event: "monetization_test" с meta.ninjabackerTest содержащий id и at (миллисекунды Unix), только для отдельного уведомления предпросмотра.

event: "monetization_update" — снимок только с метаданными из type/platform: "socialstream". meta.monetization.wishlist содержит enabled, qr, position, rank, total, публичный url и текущий item (name, amount, currency, image, публичный url) либо null. meta.monetization.ninja содержит enabled, qr, position, username и публичный URL чаевых. Приватные Tip ID никогда не включаются. meta.monetization.ebay содержит enabled, qr, position, display (cycle/cheapest/first), seconds, отдельно включаемые настройки объявлений и публичные товары. У каждого товара есть id, name, amount, currency, image, url, auction, startingBid, endsAt, available, bought и updatedAt. Время указано в миллисекундах Unix. Учётные данные продавца и личность покупателя не включаются.

Подтверждённая ведущим покупка из списка желаний также включает meta.wishlistPurchase с id, name, необязательным supporter и at (миллисекунды Unix). Это подтверждение ведущего, а не уведомление об оплате Amazon; оно не считается денежным пожертвованием. Оверлеи должны устранять дубликаты по id и игнорировать старые уведомления о покупках.

Оплаченные заказы Shopify

Необязательный приёмник подписанных событий Shopify отправляет platform/type: "shopify" и event: "purchase" только для orders/paid с financial_status: "paid", положительную общую сумму, test: false, отсутствие отмены и актуальная метка времени обновления из подписанного тела. Тестовые, неоплаченные, устаревшие, отменённые уведомления и возвраты не создают действия покупки. Намерение сделать подарок не выводится автоматически.

chatname равно Anonymous; поля покупателя, приватные заметки и URL заказов исключаются. chatmessage является обычным текстом с textonly: true; subtitle хранит до трёх публичных названий товаров. meta.commerce содержит orderTotal и currency в валюте магазина, а также quantity когда известно полное допустимое количество. Получатель и физическое или цифровое назначение остаются незаданными. Без hasDonation или donoValue задано. id — стабильный непрозрачный хеш в пределах магазина и заказа с префиксом Shopify; это не исходный идентификатор заказа.

Покупки используют существующие пути активности, категорию Purchase в Multi-Alerts и Event Flow. Продвижение товаров использует существующий meta.monetization.commerce каталог. Импорт товара или установка его рекламной метки Gift не создают событие покупки или подарка. Настройка Shopify и ограничения доставки.

Подарки и торговля

Используйте event: "gift" для подарка, giftcontribution для оплаченной поддержки сбора на подарок, giftfunded для завершения сбора, и purchase для продажи товара. Эти имена не зависят от провайдера и от того, физический товар или цифровой. Устаревшее имя оставляйте giftpurchase событие для подаренных подписок; Throne раньше использовал это имя неправильно, а теперь отправляет gift. Существующие источники событий подписок не меняются. Собственные фильтры имён событий Throne следует переключить на gift; фильтры пожертвований менять не нужно.

hasDonation остаётся признаком платной поддержки для совместимости, с donoValue с переданным или оценённым значением в долларах США. Подарки и взносы сохраняют эти поля. Завершение сбора не включает оба поля, чтобы не учитывать взносы дважды. Обычные продажи товаров по умолчанию их не включают, сохраняя контракт eBay. Не определяйте намерение подарить по магазину, ссылке списка желаний или физическому товару: покупка для покупателя или другого получателя остаётся продажей, если источник явно не указывает подарок автору.

Необязательный общий meta.commerce поля: recipient (creator, buyer, other), itemType (physical, digital, service), quantity (положительное количество товаров), currency (валюта ISO), goalAmount (целевая сумма сбора в основных единицах валюты, никогда не новый доход) и orderTotal (известная общая сумма оплаченного заказа в основных единицах валюты; торговля, а не доход от пожертвований). Неизвестные сведения не передавайте. Названия товаров храните в subtitle, изображения в contentimg, а текст поддержки — в chatmessage. Существующие метаданные провайдеров остаются доступны. Throne передаёт получателя и валюту, а при завершении — goalAmount; eBay передаёт количество. Ни один из них не предполагает тип товара и не раскрывает приватные сведения о получателе.

Лента активности показывает эти события даже без текста поддержки. Multi-Alerts использует оформление пожертвований для подарков и взносов, включая отдельное уведомление Gift Fully Funded без денежной суммы. Для покупок есть отдельная категория Purchase, включённая по умолчанию, с purchasestyle, purchasesound, purchaseaccent, и disablepurchases параметры URL. Уведомления о покупках не меняют суммы пожертвований.

Event Flow предлагает эти имена событий в триггерах Event Type и Other Event. Триггеры пожертвований по-прежнему проверяют hasDonation; триггеры Gift Sub сохраняют смысл подписки. Compare Property принимает вложенные пути, например meta.commerce.recipient. Шаблоны действий принимают {meta.commerce.quantity} и {meta.commerce.currency}, вместе с существующим {donation}, {subtitle}, и {meta}. Вложенные пути учитывают регистр; отсутствующие значения отображаются пустыми, обход прототипов запрещён.

Вебхуки торговли автора и рекламные оверлеи

Публичные платежи Donation Ko-fi сохраняют hasDonation и получают значение в долларах США donoValue. Оплата подписок использует new_subscriber или resub, с уровнем в membership. Заказы магазина и индивидуальные заказы используют purchase без сумм пожертвований. Приватные события Ko-fi остаются исключёнными. JSON, закодированный как форма, декодируется один раз; имена и сообщения являются обычным текстом.

Buy Me a Coffee donation.created сохраняет денежную поддержку; extra_purchase.created и commission_order.created становятся purchase. wishlist_payment.created становится giftcontribution используя только сумму этого платежа; meta.commerce.completed записывает признак завершения провайдера, не создавая ещё одну денежную строку. membership.started становится new_subscriber с уровнем в membership, больше не используя неверно hasDonation для названия уровня. Сумма начала подписки сама по себе не считается оплаченным списанием. Тестовые, возвращённые, неудачные и неподдерживаемые события обновления или жизненного цикла не создают платных уведомлений. Скрытые заметки сторонников исключаются.

Fourthwall поддерживает ORDER_PLACED (purchase), GIFT_PURCHASE (gift, получатель other), DONATION (обычная строка пожертвования) и SUBSCRIPTION_PURCHASED (new_subscriber). Существующие суммы заказов сохраняют hasDonation для обратной совместимости с пометкой meta.commerce.legacyDonationValue: true; это явное исключение из новых правил по умолчанию для продаж товаров. Заказы с использованными подарочными картами создают уведомление о покупке без суммы пожертвования: новую списанную сумму нельзя надёжно вывести из общей суммы заказа, а покупка подарка уже учтена. Платёжные имена и адреса электронной почты не используются для публичного представления. Тесты из панели управления и обновления заказов не создают платные уведомления.

Эти адаптеры сохраняют существующие пересылку, действия ботов, Event Flow и маршрутизацию направлений с meta.webhookId устранением дубликатов. Они предоставляют публичные имена, сообщения обычным текстом, известные названия товаров в subtitle, и ISO meta.commerce.currency вместе с числовыми суммами пожертвований, где применимо. Они не добавляют учёт возвратов или новую аутентификацию приёмника; используйте существующий настроенный путь вебхука провайдера.

meta.monetization.commerce в monetization_update содержит enabled, qr, position, display (first/cycle), seconds и массив публичных items. У каждого товара есть name, url, image, необязательный amount (null, если неизвестен), currency и purpose (shop/gift/support/membership). Это рекламные сведения, введённые ведущим, а не доказательство оплаты. Добавление и изменение товаров не создаёт событие пожертвования или покупки. Общий оверлей использует mode=commerce; view=both|showcase|card|alerts отделяет продвижение от активности. Необязательные параметры URL style, scale, cardevery, cardfor и onlytype управляют отображением. Существующие режимы провайдеров также принимают параметры вида и расписания. См. руководство по настройке.

События подарков Throne

Включаемая по желанию интеграция Monetization пересылает подписанные события Throne с platform и type со значением throne. Все три используют стабильный идентификатор доставки id, обычный текст chatname, chatmessage с textonly: true, название товара в subtitle, и необязательную HTTPS-миниатюру в contentimg.

событиеЗначениеСумма пожертвования / ранг
giftКупленный подарокhasDonation и в долларах США donoValue; ранг подарка +1
giftcontributionВзнос на подарокТолько сумма взноса; без повышения ранга
giftfundedЗавершён сбор на подарокНет hasDonation или donoValue, избегая повторного учёта прошлых взносов; ранг подарка +1

meta.throne содержит itemName, creator (публичное имя пользователя), completed, currency и в основных единицах валюты amount. Для giftfunded, сумма описывает цель, а не новый доход. Анонимные дарители остаются Anonymous; завершённые подарки сообщества используют Community. Приватные платёжные поля и данные доставки никогда не передаются.

monetization_update снимки дополнительно содержат meta.monetization.throne: enabled, username, url, qr, position, rank, и gifts. Эти снимки не содержат URL вебхука или ключей доступа приёмника.

Голосовые команды ведущего (предварительная версия для настольного приложения)

Event Flow Когда я говорю… триггер получает доверенные локальные команды микрофона из SSApp. Его внутренний контекст действий использует chatname: "Host", type: "hostvoice", распознанную фразу в chatmessage, и textonly: true. Это не входящее событие платформы и не новый способ передачи чата. Отправка этих полей через чат не может активировать голосовой триггер.

Требуются обновлённая настольная сборка, явный запуск микрофона и включение действий после тестового режима. См. настройка предпросмотра и состояние проверки.

Управление отображением товаров

Существующий monetization_update снимки могут включать meta.monetization.commerce.live: null для сохранённого расписания или {mode: "show" | "hide", url?: "https://...", until: 0 | epochMilliseconds}. Show сопоставляет точный сохранённый URL товара; если товара нет, карточка не показывается. Положительное until по истечении возвращает сохранённое расписание; нулевое действует до изменения или перезапуска SSN. Hide скрывает рекламу товаров, но не уведомления о платной активности.

commerce.viewerURL — опубликованный URL магазина только для чтения или пустая строка. При наличии рекламные QR-коды ведут туда. Он никогда не содержит сеанс SSN или ключ публикации. Товары остаются в commerce.items. Элементы отображения, импорт и публикация не создают события пожертвования или покупки. См. Управление товарами для Event Flow и удалённого API.

Event Flow commerceControl ожидает прямой ответ или ответ Chrome до восьми секунд. Для обычных данных событий оно сохраняет событие и добавляет meta.commerceControlResult: {success: true, commerce: controlState} или {success: false, error: "..."}. Для существующего числового, массива или другого необъектного meta, метаданные не меняются, а диагностика возвращается как commerceControlResult в результате действия вместо этого. Неудачные команды управления останавливают дальнейшие действия цепочки, не подавляя исходное платёжное событие. Тайм-аут не доказывает, что команда не применена; проверьте состояние перед повтором относительной команды, например Next. Успех подтверждает только локальное состояние выбора, скрытия или расписания, но никогда не видимость в OBS или синхронизацию публичной страницы.

Именованные процессы Stream Deck / API

Это именованный триггер процесса создаёт внутреннее сообщение Event Flow с type: "api", event: "workflow_trigger", chatname: "Stream Deck / API", пустой chatmessage, и textonly: true. Его meta.workflow объект содержит имя триггера и переданный вызывающей стороной JSON data объект. Читайте значения через шаблоны, например {meta.workflow.data.minutes}. Проверяются только сохранённые включённые сценарии, явно соответствующие этому триггеру. Это не входящее событие зрителя или чата, и оно не передаётся как чат; копирование этих полей в чат не активирует именованный триггер.

Пилот зрительского чата NinjaChatter

Экспериментальный связанный коннектор расширения отправляет строки только для отображения с type: socialstreamchat, platform: ninjachatter, и textonly: true. meta.ninjachatter содержит origin: audience, описательный provider, и публичный room ID. Эти строки обходят ответы на платформы, ботов, триггеры Event Flow и баллы. Показанный провайдер не означает авторизацию. Устаревшие захваты источника NinjaChatter включают meta.ninjachatter.room для подавления дубликатов в пределах комнаты.

Cheer использует отдельный аутентифицированный путь заявки и результата, а не специальную команду чата. Фиксированная предустановка создаёт существующее событие оверлея Actions show_text сообщение на три секунды. Получение означает принятие способом передачи, а не проверенный показ в OBS. Данные зрителя не могут выбирать произвольные действия. Пилот по умолчанию отключён в NinjaChatter; Electron сохраняет существующую пересылку до проверки новой границы приватного связывания.

Торговые доски мест и последние продажи

Существующий monetization_update событие (type/platform: socialstream) также включает meta.monetization.boards. Его board содержит title, style (spots/teams), columns (1–20), visible, и до 120 spots. У каждого места есть строковый id, обычный текст label, status (available/claimed/revealed) и result (обычный текст, пустой до раскрытия). Занятие и раскрытие мест — введённое ведущим состояние отображения, а не доказательство покупки или случайное распределение.

boards.sales хранит до 100 последних записей: id, title, необязательный amount (null, если неизвестно), currency, quantity, source, и at (время записи в миллисекундах Unix). automatic включает сбор, salesVisible управляет отображением и revision увеличивается при изменениях. Автоматический сбор принимает только purchase события Shopify, eBay seller, Fourthwall, Ko-fi и Buy Me a Coffee; приватные и тестовые события исключаются. Метаданные аукциона, чаевые, подарки и занятие мест не считаются покупками. Автоматические записи не подставляют общие суммы заказов, цены объявлений или суммы пожертвований вместо цены товара. Ручные записи используют source: "Host confirmed".

Состояние сохраняется в приватном хранилище монетизации этой установки; публичные снимки исключают идентификаторы устранения повторных доставок, личность покупателя и секреты. Явно показанные продажи сохраняют идентификаторы событий для удаления. Возвраты ведущий должен удалять вручную. Повторные идентификаторы покупок запоминаются отдельно (до 2000), в том числе после очистки видимой истории. Существующий getCommerceState ответ включает commerce.boards; commerceControl принимает команды доски и продаж, описанные в руководстве по доскам. Ручные изменения передают обновлённое состояние, но никогда не создают события покупок, суммы пожертвований или платные награды. Оверлеи скрываются, если снимок ведущего не поступал 35 секунд.

Дополнения для работы продавца: commerce.boards.board.id обозначает поколение доски. Ручной saleAdd может предоставлять boardId и spotId чтобы атомарно записать продажу и занять место; повторные связанные продажи, ещё присутствующие в недавней истории, отклоняются. saleRemove с reopenSpot: true освобождает это место только если поколение доски всё ещё совпадает. Публичные записи продаж не содержат этих полей связи для оператора. Необязательный platform для ручной продажи сохраняет источник для фильтрации, тогда как source: "Host confirmed" обозначает способ подтверждения. amount — итог записи, включая её quantity. Поле адаптера оплаченных заказов eBay meta.ebayPurchase.quantity сохраняется.

salesSettings.auctionSource включает помощник по товару Whatnot или eBay Live. Поле ответа управления commerce.auction содержит только source, title, priceText, status и at из последнего захваченного auction_update, либо null. Срок действия — пять минут; значение очищается при смене источника, снимке простоя или перезапуске. Помощник предназначен только оператору: он не сохраняется и не попадает в передачи зрителям; данные участника ставки или победителя отбрасываются. Скрипты источников и данные событий аукциона не меняются. Копирование черновика не подтверждает оплату и не создаёт продажу.