Простейший чат-логгер для стримов на NUUM (NodeJS, без авторизации) – Mikulski
Наложение сайта

Простейший чат-логгер для стримов на NUUM (NodeJS, без авторизации)

ДИСКЛЕЙМЕР:
Я не программист, а лишь энтузиаст-копипастер, который делится тем, в чем смог разобраться. Не исключено, что знающие специалисты некоторые моменты или формулировки могут счесть ошибочными или нелепыми.
Данный материал служит исключительно для ознакомительных целей.
Если вы представитель 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();

Страничка с кодом на Github

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