Как заставить VTuber-модель реагировать на донат: DonationAlerts → Streamer.bot → VTube Studio
Зритель кидает донат → модель дёргается, краснеет, получает по голове тортом. Это самая дешёвая по трудозатратам механика, которая заметно оживляет стрим: зрителю приятно, что его действие что-то поменяло в кадре, а вам не нужно отвлекаться от игры.
Связка собирается за полчаса и не требует ни одной строчки кода. В этом гайде весь путь: от хоткея в VTube Studio до тестового доната, который его запускает. Отдельно разберём ошибку с повторной авторизацией DonationAlerts, на которую уходит больше всего времени, если не знать, что происходит внутри.
Всё описанное проверено на живой связке: Streamer.bot + VTube Studio + Twitch-канал с подключённым DonationAlerts.
Что понадобится
- VTube Studio с вашей моделью и хотя бы одним настроенным хоткеем.
- Streamer.bot — бесплатный, скачивается с streamer.bot. Дальше по тексту — «SB».
- Платформа, на которой вы стримите — Twitch, YouTube или Kick. Её нужно будет подключить к Streamer.bot: авторизация плагина DonationAlerts запускается командой из чата.
- Аккаунт DonationAlerts с настроенными алертами.
Работать будем в трёх программах. Вот кто за что отвечает:
Ключевое звено — Streamer.bot. Сам он ничего не показывает на экране, но умеет слушать одни программы и нажимать кнопки в других. Все девять шагов ниже — это, по сути, настройка трёх программ и двух связей между ними.
Шаг 1. Подготовьте хоткей в VTube Studio
Начинаем с конца цепочки — с того, что должно произойти на экране.
Откройте настройки хоткеев модели и создайте хоткей, который будет отыгрываться на донат. Это может быть смена выражения лица, анимация, показ артефакта — что угодно, что вы уже умеете вешать на клавишу.
Для примера в статье возьмём модель Hiyori, которая идёт в комплекте с VTube Studio. У неё уже есть готовые анимации. Берём одну из них — My Animation 2. Создание своих анимаций тут не разбираем, это отдельная большая тема.

Проверьте, что хоткей работает по нажатию клавиши. Если он не работает вручную, дальше идти нет смысла: автоматика его тоже не запустит.
Шаг 2. Включите API в VTube Studio
Чтобы сторонние программы могли дёргать хоткеи, в VTube Studio нужно включить API.
Settings → Start API (allow plugins) → включить. Порт по умолчанию — 8001, его и оставляем.

Шаг 3. Свяжите Streamer.bot с VTube Studio
В Streamer.bot откройте Settings → VTube Studio и укажите:
address:localhostport:8001- включите
autoConnectиautoReconnect— тогда связь будет подниматься сама при каждом запуске

Нажмите Connect и сразу переключитесь в VTube Studio. Именно здесь застревает большинство: Streamer.bot молча ждёт ответа, а ответ нужно дать в другой программе.
VTube Studio спрашивает разрешение для плагина, и подтвердить его нужно руками. Окно появляется внутри 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.

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

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

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

Списки пустые? Значит, Streamer.bot не видит VTube Studio — вернитесь к шагу 3 и проверьте, что подтвердили окно с разрешением плагина.
5. Проверьте. Нажмите кнопку Test внизу диалога — модель должна отыграть хоткей прямо сейчас.
Половина цепочки готова: Streamer.bot умеет управлять моделью. Осталось научить его слушать донаты.
Шаг 5. Подключите чат-платформу
Откройте Platforms и подключите платформу, на которой стримите. Команды Streamer.bot одинаково работают на Twitch, YouTube и Kick. Для Twitch это Platforms → Twitch и два аккаунта: Broadcaster и Bot (можно указать один и тот же).

Без этого шага не сработает следующий: плагин DonationAlerts авторизуется командой из чата, а набрать её без подключённой платформы негде.
Шаг 6. Установите плагин DonationAlerts
Нативной поддержки DonationAlerts в Streamer.bot нет, её добавляет бесплатный плагин play-code-live/streamer.bot-donationAlerts.
- Скачайте файл
install.sbиз раздела релизов. - В Streamer.bot нажмите Import и перетащите файл в поле Import String → Import.

- Перейдите на вкладку Commands и включите команды
!da_connectи!da_start(группаDonationAlerts).

После импорта в группе DonationAlerts появятся четыре служебных действия:
-- DonationAlerts Code-- DonationAlerts Autorization-- DonationAlerts Background Watcher-- DonationAlerts Enable Background Watcher
Трогать их пока не нужно — одно из них мы отредактируем на шаге 8.
Шаг 7. Авторизуйтесь в DonationAlerts
Авторизация запускается командой в чате:
!da_connect
Отправлять её в эфир необязательно — Streamer.bot ловит команды и из собственного окна чата. Это удобнее: служебные команды не видят зрители.
Способ 1: окно чата Streamer.bot. Откройте вкладку Chat и напишите команду там.

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

Проверьте лог 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 задаёт диапазоны сумм, для которых плагин создаёт отдельные триггеры. Пока там стоит 1-2, донаты на 1–2 ₽ уходят в триггер DA: Donation (1-2), а не в «любой донат». Тестовый донат на рубль просто не сработает. Пустое значение означает «все донаты идут в DA: Any donation».
Теперь вешаем триггер на действие:
- Правый клик на действии
Test→ Add Trigger → Custom → DonationAlerts → Donations →DA: Any donation.

- Перезапустите Streamer.bot — плагин перечитывает
daRangesпри старте.
Шаг 9. Проверьте связку тестовым донатом
Тестовый донат отправляется из личного кабинета DonationAlerts: Alerts → лента событий → тестовый донат (прямая ссылка на страницу донатов).

В логе 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 при живом соединении — это ложная тревога. Связка при этом работает.
Что происходит внутри:
- DonationAlerts при новой авторизации аннулирует предыдущий access token.
- Старый цикл подключения в плагине продолжает крутиться со старым токеном: сокет-клиент там реализован как синглтон с одним полем
Socket, и новое подключение затирает старое, не останавливая цикл. - Старый цикл ловит обрыв, молча уходит в
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 тем же действием. - Звук + анимация. В одном действии можно комбинировать под-действия: проиграть звук, дёрнуть хоткей, подождать, вернуть исходное выражение.
Главное ограничение здесь не техническое: хоткей отыграет ровно ту анимацию, которая заложена в модель. Если в модели есть только базовая мимика, реагировать на донат будет нечем.