AniRigНаписать в Telegram
← Все статьи

Как заставить VTuber-модель реагировать на донат: DonationAlerts → Streamer.bot → VTube Studio

12 мин чтения

Зритель кидает донат → модель дёргается, краснеет, получает по голове тортом. Это самая дешёвая по трудозатратам механика, которая заметно оживляет стрим: зрителю приятно, что его действие что-то поменяло в кадре, а вам не нужно отвлекаться от игры.

Связка собирается за полчаса и не требует ни одной строчки кода. В этом гайде весь путь: от хоткея в VTube Studio до тестового доната, который его запускает. Отдельно разберём ошибку с повторной авторизацией DonationAlerts, на которую уходит больше всего времени, если не знать, что происходит внутри.

Всё описанное проверено на живой связке: Streamer.bot + VTube Studio + Twitch-канал с подключённым DonationAlerts.

Что понадобится

  • VTube Studio с вашей моделью и хотя бы одним настроенным хоткеем.
  • Streamer.bot — бесплатный, скачивается с streamer.bot. Дальше по тексту — «SB».
  • Платформа, на которой вы стримите — Twitch, YouTube или Kick. Её нужно будет подключить к Streamer.bot: авторизация плагина DonationAlerts запускается командой из чата.
  • Аккаунт DonationAlerts с настроенными алертами.

Работать будем в трёх программах. Вот кто за что отвечает:

DonationAlertsсюда зритель отправляет донат
Streamer.botсвязывает одно с другим
VTube Studioмодель отыгрывает реакцию

Ключевое звено — Streamer.bot. Сам он ничего не показывает на экране, но умеет слушать одни программы и нажимать кнопки в других. Все девять шагов ниже — это, по сути, настройка трёх программ и двух связей между ними.

Шаг 1. Подготовьте хоткей в VTube Studio

Начинаем с конца цепочки — с того, что должно произойти на экране.

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

Для примера в статье возьмём модель Hiyori, которая идёт в комплекте с VTube Studio. У неё уже есть готовые анимации. Берём одну из них — My Animation 2. Создание своих анимаций тут не разбираем, это отдельная большая тема.

Готовый хоткей на анимацию в настройках VTube Studio
Готовый хоткей на анимацию в настройках VTube Studio

Проверьте, что хоткей работает по нажатию клавиши. Если он не работает вручную, дальше идти нет смысла: автоматика его тоже не запустит.

Шаг 2. Включите API в VTube Studio

Чтобы сторонние программы могли дёргать хоткеи, в VTube Studio нужно включить API.

Settings → Start API (allow plugins) → включить. Порт по умолчанию — 8001, его и оставляем.

Включение Start API в настройках VTube Studio
Включение Start API в настройках VTube Studio

Шаг 3. Свяжите Streamer.bot с VTube Studio

В Streamer.bot откройте Settings → VTube Studio и укажите:

  • address: localhost
  • port: 8001
  • включите autoConnect и autoReconnect — тогда связь будет подниматься сама при каждом запуске
Настройки VTube Studio в Streamer.bot
Настройки VTube Studio в Streamer.bot

Нажмите Connect и сразу переключитесь в VTube Studio. Именно здесь застревает большинство: Streamer.bot молча ждёт ответа, а ответ нужно дать в другой программе.

VTube Studio спрашивает разрешение для плагина, и подтвердить его нужно руками. Окно появляется внутри VTube Studio. Если программа свёрнута, разверните её, иначе запрос легко пропустить.

Запрос разрешения для плагина Streamer.bot в VTube Studio
Запрос разрешения для плагина Streamer.bot в VTube Studio

Текст в окне английский и звучит тревожно: «плагин сможет управлять VTube Studio». На деле плагин получает три разрешения: читать информацию о модели, запускать хоткеи и работать с данными трекинга лица. Видео с вебки плагину недоступно, об этом сказано в том же окне. Прежде чем соглашаться, посмотрите на карточку внизу: там должен быть Streamer.bot и автор nate1280. Если видите другое имя, значит разрешения просит не та программа. Нажмите Deny.

Нажмите Allow. Делается это один раз: VTube Studio выдаст Streamer.bot ключ доступа, тот сохранит его у себя, и дальше связь будет подниматься молча при каждом запуске. Передумаете — доступ отзывается в настройках VTS.

Если разрешение не подтвердить, в логе Streamer.bot появится:

VTubeStudio Socket :: Did not receive response to method (AuthenticationTokenRequest) within a reasonable time frame

Признак успеха — строка в логе:

VTubeStudio Service :: Connected to client

Лог лежит в папке Streamer.bot: logs\log_ГГГГММДД.log. Он вам ещё пригодится: дальше мы будем сверяться с ним на каждом шаге.

Шаг 4. Создайте действие, которое дёргает хоткей

Теперь научим Streamer.bot запускать хоткей. Пока вручную, без доната. Пунктов меню тут много, и они неочевидные, поэтому дальше каждый клик со скриншотом.

1. Создайте действие. Откройте вкладку Actions и щёлкните правой кнопкой по списку действий слева → Add.

Контекстное меню списка действий: пункт Add
Контекстное меню списка действий: пункт Add

2. Дайте действию имя. В примере — Test. Имя ни на что не влияет, но оно будет мелькать в логах, так что лучше понятное.

Диалог ввода имени нового действия
Диалог ввода имени нового действия

3. Добавьте под-действие. Действие — это пустая коробка: работу делают под-действия внутри. Щёлкните правой кнопкой по панели Sub-Actions справа → Add → Integrations → VTube Studio → Trigger Hotkey.

Меню добавления под-действия: Integrations → VTube Studio → Trigger Hotkey
Меню добавления под-действия: Integrations → VTube Studio → Trigger Hotkey

4. Выберите модель и хоткей. В открывшемся диалоге два выпадающих списка: Model — модель из VTube Studio, Hotkey — тот самый хоткей из шага 1.

Диалог Trigger Hotkey с выбором модели и хоткея
Диалог Trigger Hotkey с выбором модели и хоткея

Списки пустые? Значит, Streamer.bot не видит VTube Studio — вернитесь к шагу 3 и проверьте, что подтвердили окно с разрешением плагина.

5. Проверьте. Нажмите кнопку Test внизу диалога — модель должна отыграть хоткей прямо сейчас.

Половина цепочки готова: Streamer.bot умеет управлять моделью. Осталось научить его слушать донаты.

Шаг 5. Подключите чат-платформу

Откройте Platforms и подключите платформу, на которой стримите. Команды Streamer.bot одинаково работают на Twitch, YouTube и Kick. Для Twitch это Platforms → Twitch и два аккаунта: Broadcaster и Bot (можно указать один и тот же).

Настройки подключения Twitch
Настройки подключения Twitch

Без этого шага не сработает следующий: плагин DonationAlerts авторизуется командой из чата, а набрать её без подключённой платформы негде.

Шаг 6. Установите плагин DonationAlerts

Нативной поддержки DonationAlerts в Streamer.bot нет, её добавляет бесплатный плагин play-code-live/streamer.bot-donationAlerts.

  1. Скачайте файл install.sb из раздела релизов.
  2. В Streamer.bot нажмите Import и перетащите файл в поле Import String → Import.
Импорт файла install.sb в Streamer.bot
Импорт файла install.sb в Streamer.bot
  1. Перейдите на вкладку Commands и включите команды !da_connect и !da_start (группа DonationAlerts).
Включение команд da_connect и da_start
Включение команд da_connect и da_start

После импорта в группе DonationAlerts появятся четыре служебных действия:

  • -- DonationAlerts Code
  • -- DonationAlerts Autorization
  • -- DonationAlerts Background Watcher
  • -- DonationAlerts Enable Background Watcher

Трогать их пока не нужно — одно из них мы отредактируем на шаге 8.

Шаг 7. Авторизуйтесь в DonationAlerts

Авторизация запускается командой в чате:

!da_connect

Отправлять её в эфир необязательно — Streamer.bot ловит команды и из собственного окна чата. Это удобнее: служебные команды не видят зрители.

Способ 1: окно чата Streamer.bot. Откройте вкладку Chat и напишите команду там.

Команда !da_connect, отправленная в окне чата Streamer.bot
Команда !da_connect, отправленная в окне чата Streamer.bot

Способ 2: чат вашего канала. Просто напишите команду в эфире.

В обоих случаях откроется браузер со страницей авторизации DonationAlerts — разрешите доступ.

Если чат-платформы у вас нет совсем, авторизацию можно попробовать запустить руками: откройте действие -- DonationAlerts Autorization и нажмите Test. Из чата оно ничего не берёт, просто открывает браузер и ждёт ответа на локальном порту. Этот способ мы не проверяли, дальше в гайде всё идёт через чат.

Страница авторизации DonationAlerts
Страница авторизации DonationAlerts

Проверьте лог Streamer.bot. При успешной авторизации там появится такая последовательность:

-- Donation Alerts: AccessToken and RefreshToken are obtained successfully
-- Donation Alerts: Retrieved user profile info, <userId>, {...}
-- Donation Alerts: Authorized successfully
-- Donation Alerts: Subscribed to the channel, $alerts:donation_<userId>
-- Donation Alerts: Subscribed to the channel, $goals:goal_<userId>
-- Donation Alerts: Waiting for a message

Строка Waiting for a message означает, что сокет живой и ждёт донатов.

Команда !da_connect вводится один раз и больше никогда. Токен сохраняется в data\globals.db (поля daAccessToken, daRefreshToken) и живёт год. При каждом запуске Streamer.bot watcher поднимается сам. Повторный ввод команды не «переподключает», а ломает соединение — почему это происходит, разбираем в разделе про ошибки.

Шаг 8. Свяжите донат с хоткеем

Остался последний стык: сказать действию Test, что его запускает донат.

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

Откройте действие -- DonationAlerts Background Watcher и найдите под-действие №4: Set argument daRanges = 1-2. Очистите значение — оставьте поле пустым.

Очистка параметра daRanges в Background Watcher
Очистка параметра daRanges в Background Watcher

Зачем это нужно: daRanges задаёт диапазоны сумм, для которых плагин создаёт отдельные триггеры. Пока там стоит 1-2, донаты на 1–2 ₽ уходят в триггер DA: Donation (1-2), а не в «любой донат». Тестовый донат на рубль просто не сработает. Пустое значение означает «все донаты идут в DA: Any donation».

Теперь вешаем триггер на действие:

  1. Правый клик на действии Test → Add Trigger → Custom → DonationAlerts → Donations → DA: Any donation.
Добавление кастомного триггера DA: Any donation
Добавление кастомного триггера DA: Any donation
  1. Перезапустите Streamer.bot — плагин перечитывает daRanges при старте.

Шаг 9. Проверьте связку тестовым донатом

Тестовый донат отправляется из личного кабинета DonationAlerts: Alerts → лента событий → тестовый донат (прямая ссылка на страницу донатов).

Отправка тестового доната в личном кабинете DonationAlerts
Отправка тестового доната в личном кабинете DonationAlerts

В логе Streamer.bot должно появиться сообщение из сокета:

-- Donation Alerts: Recieved message
-- Donation Alerts: {"result":{"channel":"$alerts:donation_<userId>","data":{...,"amount":100,"currency":"RUB",...}}}

А модель в VTube Studio — отыграть хоткей.

Модель отыгрывает хоткей после доната
Модель отыгрывает хоткей после доната

Если сообщение в логе есть, а модель не двигается, проблема на последнем стыке — между SB и VTS. Если сообщения нет вовсе — на стыке DA и SB. Дальше разберём оба случая.

Частые проблемы

«Необходимо повторить авторизацию в DonationAlerts. Пожалуйста, введите команду !da_connect»

Самая обидная ошибка, потому что интуитивная реакция — ввести !da_connect ещё раз — делает только хуже.

Если вы только что ввели !da_connect при живом соединении — это ложная тревога. Связка при этом работает.

Что происходит внутри:

  1. DonationAlerts при новой авторизации аннулирует предыдущий access token.
  2. Старый цикл подключения в плагине продолжает крутиться со старым токеном: сокет-клиент там реализован как синглтон с одним полем Socket, и новое подключение затирает старое, не останавливая цикл.
  3. Старый цикл ловит обрыв, молча уходит в catch, переподключается рекурсивно и запрашивает профиль по старому токену → 401 Unauthorized → плагин отправляет в чат сообщение об ошибке авторизации.

То есть жалуется «зомби» от прошлого соединения, а новое в этот момент работает штатно. В логе это видно по чередованию:

19:09:23.865  AccessToken and RefreshToken are obtained successfully
19:09:24.148  Subscribed to the channel, $alerts:donation_<userId>     ← новое соединение, ОК
19:09:25.235  WRN  WebException with status code 401, Unauthorized     ← зомби со старым токеном
19:09:25.437  Subscribed to the channel, $goals:goal_<userId>
19:09:26.144  ERR  [Run (DonationCheckerLoop) Error] WebException: (401) Unauthorized

Что делать: не вводить !da_connect повторно. Нужно переподключиться: перезапустите Streamer.bot, watcher поднимется сам.

Как убедиться, что всё в порядке: в конце лога должна быть строка Waiting for a message и никаких новых 401. После этого отправьте тестовый донат.

Донат срабатывает несколько раз подряд

Побочный эффект тех же повторных !da_connect: подписки обработчиков накапливаются. Признак: строка Ready to connect to the socket повторяется в логе два, три, четыре раза. Лечится перезапуском Streamer.bot.

Заодно там же утекают таймеры локального auth-сервера: в логе каждые 30 секунд появляется -- Donation Alerts: Timer invoked. На работу не влияет, чистится тем же перезапуском.

Донат приходит в лог, но действие не срабатывает

Проверьте, что у действия есть триггер. У действия, созданного вручную, по умолчанию нет ни одного триггера — кнопка Test его запускает, а событие — нет. Правый клик по действию → Add Trigger → Custom → DonationAlerts → Donations → DA: Any donation.

Донат на маленькую сумму не срабатывает

Проверьте daRanges в -- DonationAlerts Background Watcher (шаг 8). Если сумма попадает в указанный диапазон, событие уходит в триггер DA: Donation (X-Y), а не в DA: Any donation.

[Run (CheckAndAnnounce) Error] FormatException в GetNewerGitHubVersion

Это баг проверки обновлений самого плагина: Convert.ToDouble не парсит версию вида 1.10.x (плюс русская локаль, где разделитель дробной части — запятая). На работу интеграции не влияет, можно игнорировать.

Ошибки Twitch EventSub / 7TV / BTTV / FFZ в логе

К этой связке отношения не имеют:

  • Terminal subscription error в EventSub — переподключите Twitch в Streamer.bot.
  • 7TV / BTTV / FFZ :: Response error NotFound — у канала просто нет эмоутов на этих сервисах.

Что ещё умеет ловить плагин

Плагин умеет ловить не только донаты. Все события выбираются там же, где мы выбирали DA: Any donation на шаге 8: правый клик по действию → Add Trigger → Custom → DonationAlerts и дальше по группам событий.

Триггер Когда срабатывает
DA: Any donation Любой донат
DA: Donation (X-Y) Донат на сумму из диапазона — появляется, если заполнить daRanges
DA: Goal Updated Изменилась сумма сбора на цель
DA: Connected Плагин подключился к DonationAlerts
DA: Disconnected Связь с DonationAlerts оборвалась
DA: Reconnected Связь восстановилась после обрыва
DA: Media Add Зритель заказал медиа (трек в очередь)

Шпаргалка: что известно про донат

Когда донат запустил действие, внутри этого действия доступны данные о нём. Чтобы подставить значение в любое текстовое поле под-действия, например в сообщение в чат или в текстовый источник OBS, оберните имя в проценты:

Спасибо за поддержку, %daUsername%! (%daAmount% %daCurrency%)
Переменная Что внутри
daUsername Имя донатера. Anonymous, если он не представился
daAmount Сумма
daCurrency Валюта
daMessage Сообщение от зрителя
daType text — зритель написал сообщение, audio — записал голосовое
daAudioUrl / daAudio Ссылка на голосовое и путь к скачанному .wav
daAmountConverted Та же сумма, пересчитанная в вашу валюту
daName Название алерта из настроек DonationAlerts

Если ловите триггер DA: Goal Updated, там по тому же принципу доступны данные о сборе: daGoalTitle, daGoalCurrent, daGoalTarget, daGoalCurrency, daGoalIsActive.

Что можно сделать дальше

Схема «событие → хоткей» работает не только с донатами, и на ней собираются почти все живые реакции модели:

  • Разные реакции по сумме. Вернуть daRanges (например, 1-99,100-499,500-) и повесить на каждый диапазон свой хоткей: на мелкий донат — смущение, на крупный — салют.
  • Реакция на подписку, рейд, награду за баллы канала. Триггеры Twitch в Streamer.bot настраиваются так же, меняется только источник события.
  • Имя донатера в кадре. Аргумент daUsername можно вывести в текстовый источник OBS тем же действием.
  • Звук + анимация. В одном действии можно комбинировать под-действия: проиграть звук, дёрнуть хоткей, подождать, вернуть исходное выражение.

Главное ограничение здесь не техническое: хоткей отыграет ровно ту анимацию, которая заложена в модель. Если в модели есть только базовая мимика, реагировать на донат будет нечем.