Приложение на Go для автоматической остановки стрима в OBS при отправке рейда на другой канал Twitch.
Когда вы отправляете рейд на другой канал через Twitch, это приложение автоматически останавливает стрим в OBS через WebSocket. Приложение использует Twitch PubSub WebSocket API для мониторинга событий рейдов в реальном времени.
- 🎯 Мониторинг событий рейдов через Twitch PubSub WebSocket
- 🛑 Автоматическая остановка стрима в OBS при отправке рейда
- 🔄 Автоматическое переподключение при потере соединения (экспоненциальный backoff: 1с → 2с → 4с → ... → 5 мин)
- 💓 Поддержка соединения через PING/PONG (каждые 4 минуты)
- 📝 Подробное логирование всех событий
- 🧹 Чистый и оптимизированный код (481 строка)
- Go 1.21 или выше
- OBS Studio с включенным WebSocket сервером (v5)
- Twitch OAuth токен для бота
- Numeric User ID канала для мониторинга
Скачайте последний релиз для вашей платформы из Releases:
- Windows (x64):
raid-stopper-windows-amd64.exeилиraid-stopper-windows-amd64.zip - Linux (x64):
raid-stopper-linux-amd64.zip - Linux (ARM64):
raid-stopper-linux-arm64.zip - macOS (Intel):
raid-stopper-macos-amd64.zip - macOS (Apple Silicon):
raid-stopper-macos-arm64.zip
Примечание: ZIP-архивы содержат исполняемый файл и
config.example.jsonдля быстрого старта.
- Клонируйте репозиторий:
git clone <repository-url>
cd raid-stopper- Установите зависимости:
go mod download- Соберите проект:
go build -o raid-stopper- Создайте конфигурационный файл:
cp config.example.json config.json- Отредактируйте
config.jsonс вашими данными:
{
"twitch": {
"channel_id": "123456789",
"bot_username": "your_bot_username",
"bot_oauth_token": "oauth:your_oauth_token"
},
"obs": {
"host": "localhost",
"port": 4455,
"password": "your_obs_websocket_password"
}
}channel_id(string) - Numeric User ID канала для мониторинга рейдовbot_username(string) - Имя пользователя бота (отдельный аккаунт для авторизации)bot_oauth_token(string) - OAuth токен бота для PubSub авторизации
Важно: Канал (
channel_id) и бот (bot_username+bot_oauth_token) - это независимые сущности. Бот используется только для авторизации в PubSub API.
host(string) - Адрес OBS WebSocket сервера (обычноlocalhost)port(int) - Порт OBS WebSocket сервера (по умолчанию4455)password(string) - Пароль для подключения к OBS WebSocket
Numeric User ID можно получить несколькими способами:
Способ 1: Онлайн сервисы
- https://www.streamweasels.com/tools/convert-twitch-username-to-user-id/
- https://streamscharts.com/tools/convert-username
Способ 2: Twitch API
curl -H "Client-ID: YOUR_CLIENT_ID" \
-H "Authorization: Bearer YOUR_TOKEN" \
https://api.twitch.tv/helix/users?login=CHANNEL_NAMEСпособ 3: Браузер (DevTools)
- Откройте страницу канала на Twitch
- Откройте DevTools (F12)
- Найдите в Network запросы к API - User ID будет в URL или ответах
- Перейдите на https://twitchtokengenerator.com/
- Выберите "Custom Scope Token"
- Выберите необходимые скоупы (для базового PubSub доступа можно оставить пустым)
- Нажмите "Generate Token"
- Авторизуйтесь через Twitch
- Скопируйте Access Token
- Добавьте префикс
oauth:в конфиге:"oauth:your_token_here"
- https://twitchapps.com/tmi/ (быстро, но минимальные скоупы)
- Создайте своё приложение на https://dev.twitch.tv/console/apps
- Откройте OBS Studio
- Перейдите в Инструменты → Настройки WebSocket-сервера
- Включите "Включить сервер WebSocket"
- Установите пароль (запомните его для конфига)
- Запомните порт (по умолчанию
4455) - Нажмите "ОК"
Примечание: Требуется OBS Studio 28.0.0 или выше с встроенным WebSocket сервером v5
raid-stopper-windows-amd64.exechmod +x raid-stopper-linux-amd64 # или macos-amd64 / macos-arm64 / linux-arm64
./raid-stopper-linux-amd64go run .┌─────────────────────────────────────────────────────────────┐
│ Raid Stopper Flow │
└─────────────────────────────────────────────────────────────┘
1. Запуск приложения
↓
2. Подключение к Twitch PubSub WebSocket
└─→ wss://pubsub-edge.twitch.tv
3. Подписка на топик raid.{channel_id}
└─→ Авторизация через bot_oauth_token
4. Подключение к OBS WebSocket
└─→ ws://localhost:4455
5. Ожидание событий рейдов
↓
6. Получение события raid_go_v2 (рейд отправлен)
├─→ Логирование информации о рейде
│ └─→ Канал назначения, имя, количество зрителей
│
└─→ Остановка стрима в OBS
└─→ Проверка статуса → StopStream
7. Поддержка соединения
├─→ PING каждые 4 минуты
└─→ Проверка PONG каждые 30 секунд
8. При потере соединения
└─→ Автоматическое переподключение
└─→ Exponential backoff: 1s → 2s → 4s → ... → 5min
- ✅
raid_go_v2- рейд отправлен (выполнен) → стрим останавливается - ⏭️
raid_update_v2- рейд создан (не выполнен) → игнорируется, только логируется
Приложение выводит подробные логи в консоль:
2025/12/29 20:00:00 Starting Raid Stopper...
2025/12/29 20:00:00 Configuration loaded successfully
2025/12/29 20:00:00 Connected to OBS WebSocket v5.3.0 (OBS Studio 30.0.0)
2025/12/29 20:00:00 Connected to Twitch PubSub WebSocket
2025/12/29 20:00:00 Subscribing to raid events for channel ID: 123456789
2025/12/29 20:00:00 Subscribing as bot 'your_bot' to channel ID: 123456789
2025/12/29 20:00:00 Subscribing to topic: raid.123456789
2025/12/29 20:00:01 Successfully subscribed to topic
2025/12/29 20:00:01 Raid Stopper is now running. Press Ctrl+C to exit.
... при отправке рейда ...
2025/12/29 20:15:30 RAID EXECUTED: Raiding target_channel (TargetName) with 150 viewers
2025/12/29 20:15:30 RAID detected! Raiding target_channel (TargetName) with 150 viewers. Stopping stream...
2025/12/29 20:15:30 Stream stopped successfully!
2025/12/29 20:15:30 Stream stopped successfully after raid to target_channel
Нажмите Ctrl+C для корректного завершения работы. Приложение закроет все соединения и завершится.
raid-stopper/
├── main.go # Точка входа приложения (60 строк)
├── config.go # Конфигурация (38 строк)
├── twitch.go # Twitch PubSub WebSocket клиент (283 строки)
├── obs.go # OBS WebSocket клиент (73 строки)
├── config.example.json # Пример конфигурации
├── config.json # Рабочая конфигурация (не в git)
├── go.mod # Go модули
├── go.sum # Зависимости
├── .gitignore # Git ignore
└── README.md # Документация
Всего: 481 строка чистого, оптимизированного кода
Используемые топики:
raid.{channel_id}- события рейдов для указанного канала
Типы событий:
raid_go_v2- рейд выполнен (обрабатывается → остановка стрима)raid_update_v2- рейд создан (игнорируется)
Авторизация:
- Требуется OAuth токен (любой валидный токен, не обязательно от владельца канала)
- Токен передаётся в поле
auth_tokenпри подписке на топик
Поддержание соединения:
- PING каждые 4 минуты
- Проверка PONG каждые 30 секунд
- Timeout: 10 секунд после PING
Используемые методы:
GetVersion- получение версии OBSGetStreamStatus- проверка статуса стримаStopStream- остановка стрима
Особенности:
- Перед остановкой проверяется, активен ли стрим
- Если стрим уже остановлен, команда игнорируется
- Поддерживается только протокол WebSocket v5
При потере соединения используется exponential backoff:
1 сек → 2 сек → 4 сек → 8 сек → 16 сек → 32 сек →
64 сек → 128 сек → 256 сек → 300 сек (5 мин, максимум)
После успешного переподключения backoff сбрасывается на 1 секунду.
- Проверьте интернет-соединение
- Убедитесь, что wss://pubsub-edge.twitch.tv доступен
- Проверьте правильность
channel_id(должен быть numeric) - Проверьте валидность
bot_oauth_token - Убедитесь, что токен не истёк
- Убедитесь, что OBS Studio запущен
- Проверьте, включен ли WebSocket сервер в OBS
- Проверьте правильность хоста, порта и пароля в конфиге
- Проверьте, что указан правильный
channel_id - Убедитесь, что приложение получило событие (смотрите логи)
- Проверьте логи на наличие ошибок от OBS
- Проблема с сетью или фаервол блокирует WebSocket
- Приложение автоматически переподключится
Q: Можно ли мониторить несколько каналов одновременно? A: Нет, текущая версия поддерживает только один канал. Для нескольких каналов запустите несколько экземпляров приложения с разными конфигами.
Q: Нужно ли, чтобы бот был модератором канала? A: Нет, бот используется только для авторизации в PubSub API. Права модератора не требуются.
Q: Можно ли использовать токен владельца канала вместо бота? A: Да, можно использовать любой валидный OAuth токен.
Q: Приложение останавливает стрим при создании рейда или при его отправке?
A: Только при отправке рейда (raid_go_v2). Создание рейда (raid_update_v2) игнорируется.
Q: Как узнать свой Channel ID? A: См. раздел "Как получить Twitch User ID" выше.
Q: Приложение работает на Linux/Mac?
A: Да, Go - кроссплатформенный язык. Просто соберите под нужную ОС: GOOS=linux go build или GOOS=darwin go build
- github.com/gorilla/websocket - WebSocket клиент для Twitch PubSub
- github.com/andreykaipov/goobs - OBS WebSocket клиент (v5)
MIT
Проект использует GitHub Actions для автоматической сборки и публикации релизов:
- Build Workflow - автоматическая сборка на всех платформах при push и PR
- Release Workflow - автоматическая публикация релизов при создании тега
git tag v1.0.0
git push origin v1.0.0GitHub Actions автоматически соберёт бинарники для всех платформ и опубликует их в Releases.
Создано с помощью Claude Code
🎯 Raid Stopper - простой, надёжный и эффективный инструмент для автоматизации завершения стримов при рейдах.