Как я сделал автоматические оповещения о начале стрима на Boosty в Discord и Telegram – Mikulski
Наложение сайта

Как я сделал автоматические оповещения о начале стрима на Boosty в Discord и Telegram

ДИСКЛЕЙМЕР:
Я не программист и не линуксоид, а лишь энтузиаст-копипастер, который делится тем, в чем смог разобраться. Поэтому, не исключено, что знающие специалисты некоторые моменты или формулировки могут счесть неправильными или нелепыми.

Подача данного материала предполагает, что вы обладаете базовым уровнем знаний по nodejs, а также понимаете принцип работы и настройки конфига Nginx-Rtmp-модуля.

Сервисов, которые предоставляют ботов с оповещениями о начале стрима достаточно много. Но все они, как правило, привязаны к крупным площадкам. Twitch и Discord – самая распространенная связка. Некоторое время назад я написал гайд о том, как сделать оповещения в Telegram-канал при начале стрима на Twitch. И этого вполне достаточно, если рестримить на другие площадки вместе с Twitch: просто в теле поста указать остальные ссылки. Но что делать, если вы планируете стримить только на Boosty или VkPlayLive?
Я нашел достаточно простое решение.
Технология элементарная: когда стрим стартует, то меняется содержимое определенного файла, за которым следят боты. Изменение файла служит триггером для ботов и они постят оповещение.
В моем случае, я использую VPS на Ubuntu с установленными Nginx-rtmp-модулем (он меняет содержимое файла, когда стрим до него дотягивается) и Nodejs для ботов (с запуском через pm2). Если вы хотите это повторить на домашнем Windows, то технически, Nginx-rtmp вам не нужен. Проще будет использовать Touch Portal, Lioranboard, Streamdeck и т.д., чтобы при старте стрима редактировался файл. Как бы то ни было, с Windows разбираться у меня задачи не стояло, поэтому расскажу как это устроено у меня.

Nginx-rtmp

OBS транслирует не напрямую на Boosty, а сперва в Nginx-rtmp-сервер. Который реагирует на входящий коннект, запускает bash-скрипт для изменения отслеживаемого файла, а также “проталкивает” стрим на Boosty.
Понадобится bash-скрипт, который при активации будет добавлять в конец содержимого файла notification символ “i“:

#!/bin/bash
echo "i" >> /path/to/file/notification

Важно выдать скрипту необходимые права для запуска:

sudo chmod u+x /path/to/file/notification.sh

Пример конфига Nginx:

rtmp {
    server {
        listen 1935;

        application boosty {
            live on;
            record off;
            exec publish /path/to/file/notification.sh;
            push rtmp://vsu.mycdn.me/input/<stream_key>;
        }
    }
}

Также, обратите внимание, чтобы в верхушке конфига в строке user был указан тот же самый пользователь, который создавал bash-скрипт, иначе директива exec_publish не сработает.

Вкратце, что тут происходит:
Создается application под названием boosty. Адрес, который вбивается в OBS, будет следующим: rtmp://IP.ВАШЕГО.VPS/boosty
При публикации (т.е. когда поток из OBS придет на сервер) запустится shell-команда /path/to/file/notification.sh – которая запустит bash-скрипт.
Чтобы правки применились надо перезапустить nginx.service:

sudo systemctl reload nginx

Тут можно отметить любопытный момент Nginx-rtmp. В директиве exec_publish можно сразу прописывать типичные команды: например, создать папку – mkdir или создать файл – touch и это работает. Но echo, printf или tee, почему-то, не исполняются. Поэтому приходится создавать bash-скрипт для этих целей.

Telegram-бот

Опущу детали того, как создать бота в Telegram и получить токен. Об этом можно прочесть здесь.
Так получилось, что я всю дорогу пользуюсь nodejs, поэтому пример будет на javascript с библиотекой telegraf:

npm i telegraf

Создается файл config.json, куда помещается токен телеграм-бота:

{
	"token":"<ТОКЕН>"
}

Основной скрипт будет выглядеть примерно так:

const fs = require('fs');
const {token} = require('./config.json');
const { Telegraf } = require('telegraf');
const { message } = require('telegraf/filters');
const bot = new Telegraf(token);

fs.watchFile("/path/to/file/notification", (curr, prev) => {
console.log('File is changed!');
bot.telegram.sendMessage('@telegram_channel', 'Подруб на Boosty!');
});

bot.launch();

fs.watchFile("/path/to/file/notification" – путь к отслеживаемому файлу.
bot.telegram.sendMessage('@telegram_channel', 'Подруб на Boosty!') – адрес Telegram-канала, куда будет поститься уведомление и текст сообщения.
Бота нужно обязательно добавить в администраторы канала с правом писать сообщения.

Discord

Создать бота в Discord и получить токен можно в Discord Developer Portal, создав там новое приложение.
Чтобы увидеть ID каналов/ролей/пользователей, нужно перейти в “режим разработчика”(Настройки -> Расширенные) и тогда через правый клик мыши будет доступно новое контекстное меню.

В config.json помещается токен и ID-канала, в который будет публиковаться уведомление (не забудьте боту разрешить писать сообщения, обращаться по ролям и прикреплять ссылки в этом канале):

{
	"token":"DISCORD_BOT_TOKEN",
	"alert_channel":"ID_CHANNEL",
	"boosters_role": "ID_ROLE"
}

Так получилось, что у меня Discord-бот работает на библиотеке Discordjs-12. Возможно, в более свежих версиях, синтаксис будет отличаться.

npm i discord.js-12

Пример основного скрипта:

const Discord = require('discord.js-12');
const fs = require('fs');
const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES",  "GUILD_MEMBERS"]});
const {
	token,
	boosters_role,
	alert_channel
} = require('./config.json');

client.once('ready', () => {
	console.log("Status: Connected to discord");
});

client.on('ready', () => {
fs.watchFile("/path/to/file/notification", (curr, prev) => {
  console.log(`File is changed!`);
  client.channels.cache.get(alert_channel).send(`Подруб на Boosty! <@&${boosters_role}>`);
});
});

Здесь, все аналогично боту Telegram.
Стоит обратить внимание, что обращение по ролям пишется вот в таком виде: `<@&${ROLE_ID}>`.

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии