ДИСКЛЕЙМЕР:
Я не программист, а лишь энтузиаст-копипастер, который делится тем, в чем смог разобраться. Не исключено, что знающие специалисты некоторые моменты или формулировки могут счесть ошибочными или нелепыми.
Данный материал служит исключительно для ознакомительных целей.
Если вы представитель NUUM и считаете, что эта статья нарушает какие-либо этические нормы или правила использования сервиса, то свяжитесь со мной по почте info@mikulski.rocks - и я удалю этот пост.
Кулстори
Существовала потребность мониторить чат для трансляции Mikulski_Radio на площадке NUUM наряду с остальными платформами из условной “сетки вещания” для того, чтобы отображать сообщения на стриме (впоследствии я отказался от этой идеи).
“Самоучные погроммистские” скиллы на тот момент как раз достигли такого уровня, когда появилось хоть какое-то понимание Web-API и методов взаимодействия с ним.
Стримить на NUUM я перестал, но решил поделиться собранным кое-как г***окодом, так сказать, “для истории”.
Возможно, что кому-то пригодится в его изысканиях.
Особенности
Скрипт максимально простой и использует только дежурные библиотеки nodejs, никаких дополнительных установок, кроме самого nodejs не требуется.
Не используется авторизация на Nuum, поэтому сообщения из чата можно только получить, но не отправить. Насколько я помню, то больше никаких событий (отслеживания, донаты и т.д.) поймать таким образом нельзя.
Также есть одна особенность, которую вы сами можете проверить, используя вкладку инкогнито в браузере на любом активном стриме: без авторизации новые сообщения подгружаются в чат методом POST-запроса с интервалом в 10 секунд, поэтому часть сообщений может пролетать мимо. Скрипт дублирует эту логику.
Во избежание дублирования в логе одного и того же сообщения происходит сверка на совпадение нового сообщения с предыдущим по id-сообщения.
Как пользоваться
Создать директорию и файл в нем с расширением js. Скопировать код ниже и вставить в файл. Отредактировать строчку const channel = ' '
, подставив в кавычки идентификатор интересующего канала из url (например, в url: https://nuum.ru/channel/mikulski, mikulski – это идентификатор).
Запустить скрипт из директории: node название_файла.js
Больше никаких действий не требуется: скрипт сам подтянет id стрима и id чата, если тот онлайн.
Скрипт
//Подставьте идентификатор нужного канала
//https://nuum.ru/channel/<идентификатор>
const channel = '';
//Переменная для хранения id-сообщений
let msg_id = null;
console.log("NUUM чат-логгер стартовал..");
//Получение Id-стрима
function grab_id() {
fetch(`https://nuum.ru/api/v2/broadcasts/public?with_extra=true&channel_name=${channel}`)
.then(response=> {
if (!response.ok) {
console.log(`При получении Id-стрима что-то пошло не так: ${response.status} (${response.statusText})`);
process.exit(1);
}
return response.json();
})
.then(data => {
//Если стрим оффлайн, отмена
if (data.result.channel.channel_is_live === false)
{
return console.log(`Stream is Offline`);
}
let stream_id = data.result.media_container.media_container_id;
console.log(`Получен Id-стрима: ${stream_id}`);
//Получение Id-чата
function grab_chat_id() {
fetch(`https://nuum.ru/api/v3/chats?contentType=SINGLE&contentId=${stream_id}`)
.then(response=> {
if (!response.ok) {
console.log(`При получении Id-чата что-то пошло не так: ${response.status} (${response.statusText})`);
process.exit(1);
}
return response.json();
})
.then(data => {
let chat_id = data.result?.id;
console.log(`Получен Id-чата: ${chat_id}`);
console.log(`Подключение к чату ${channel}..`);
//Получение сообщений из чата
function nuum() {
let response = fetch(`https://nuum.ru/api/v3/events/${chat_id}/events`, {
method: 'POST',
headers: {
'Content-Type': 'application/json;charset=utf-8',
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:127.0) Gecko/20100101 Firefox/127.0'
},
body: JSON.stringify({"sort":"DESC","eventTypes":["MESSAGE"]})
})
.then(response => {
if (!response.ok) {
console.log(`При получении сообщения что-то пошло не так: ${response.status} (${response.statusText})`);
return
}
return response.json();
})
.then(data => {
//Если приходит пустой результат опроса, отмена
if (data?.result[0] === undefined) {return}
//Назначение переменных на пришедший результат
const nickname = data.result[0]?.author.login;
const msg = data.result[0]?.eventData.text;
const prev_msg = data.result[1]?.eventData.text;
//Если id-сообщения повторяется, отмена
if (msg_id === data.result[0]?.id) {return}
//Вывод в лог сообщений "никнейм - текст сообщения"
console.log(`[NUUM | ${nickname}] ${msg}`);
//Сохраняем id-сообщения в переменную
msg_id = data.result[0]?.id;
})
.catch((error) => {
return console.log(error);
});
}
nuum()
//Интервал запросов в мс
setInterval(nuum, 10000);
});
}
grab_chat_id();
});
}
grab_id();