Skip to content

thearturca/vkplay-live-message-client

Folders and files

NameName
Last commit message
Last commit date
Oct 13, 2024
Aug 22, 2024
Nov 3, 2024
Jan 8, 2023
Aug 22, 2024
Aug 22, 2024
Oct 15, 2023
Aug 22, 2024
Oct 28, 2024
Oct 28, 2024
Aug 22, 2024
Aug 22, 2024
Aug 22, 2024
Aug 22, 2024

Repository files navigation

VKplay live chat API client

Это пре-альфа версия, здесь не протестировано на продолжительном подключении к вебсокету. Возможны вылеты и ошибки. Баги присылать сюда https://github.com/thearturca/vkplay-live-message-client/issues

Описание

Эта библиотека поможет вам подключиться к чату канала стримера на стриминговой площадке live.vkplay.ru, и получать/отправлять сообщения с парсингом смайлов, создавать чат-ботов или клиенты для чатов. Чаты работают даже когда стримера нет в сети.

Авторизация

Для отправки сообщений нужно указать токен live.vkplay.ru, либо авторизационные данные для входа (логин и пароль). Так как ещё нет легального удобного способа получить токен, его нужно взять из localStorage вашего браузера, если вы уже залогинены. Находиться в поле auth. Лучше всего создать новый аккаунт для бота. Если вы знаете, как достать токен, сообщите мне в discord.

Иструкция по получению токена с реферешом live.vkplay.ru:

  1. Откройте окно браузера в режиме инкогнито
  2. Перейдите на страничку live.vkplay.ru
  3. Нажмите на кнопку Вход и залогиньтесь
  4. Обновите страницу
  5. Нажмите Ctrl+Shift+I, перейдите в вкладку Application. Слева нажмите на Local Storage.
  6. Найдите в столбце Key значение auth. Скопируйте accessToken, refreshToken и expiresAt. Это можно будет вставить в поле auth в вашем боте.
  7. Найдите в столбце Key значение _clientId. Скопируйте значение. Это будет clientId для бота.

Discord для вопросов: thearturca

Установка

npm i vklive-message-client

Пример использования

Токен

const authToken: string = process.env.VKPL_OAUTH;

if (!authToken) {
    throw new Error("VKPL_OAUTH is not set");
}

const client = new VKPLMessageClient({ auth: { accessToken: authToken }, channels: [target], debugLog: true });
await client.connect();
await client.sendMessage("Connected to chat!", target);

client.on("message", async (ctx) => {
      if (ctx.message.text.startsWith("!command"))
            await ctx.sendMessage("Hello World");
});

client.on("reward", async (ctx) => {
      if (ctx.reward.name === "reward_name")
          await ctx.sendMessage("Reward received!");
});

Токен + Рефреш токен с сохранением в файл

Note

У вас должен быть файл token.json с содержимым в следующем виде:

{
    "accessToken": "token",
    "refreshToken": "refreshToken",
    "expiresAt": 12345,
    "clientId": "clientId"
}

Данные нужно брать из localStorage вашего браузера

const auth = JSON.parse(await fs.promises.readFile("token.json", "utf8")); // должен иметь следующий вид: { accessToken: "token", refreshToken: "refreshToken", expiresAt: 12345, clientId: "clientId" }

const client = new VKPLMessageClient({ auth: auth, channels: [target], debugLog: true });
await client.connect();
await client.sendMessage("Connected to chat!", target);

client.on("message", async (ctx) => {
      if (ctx.message.text.startsWith("!command"))
            await ctx.sendMessage("Hello World");
});

client.on("reward", async (ctx) => {
      if (ctx.reward.name === "reward_name")
          await ctx.sendMessage("Reward received!");
});

client.on("refresh-token", async (ctx) => {
   await fs.promises.writeFile("token.json", JSON.stringify(ctx.auth));
});

Логин и Пароль

Caution

Данный способ не работает. Лучше использовать токен

const login: string = process.env.VKPL_LOGIN ?? "";
const password: string = process.env.VKPL_PASSWORD ?? "";

const client = new VKPLMessageClient({ auth: { login, password }, channels: [target], debugLog: true });
await client.connect();
await client.sendMessage("Connected to chat!", target);

client.on("message", async (ctx) => {
      if (ctx.message.text.startsWith("!command"))
            await ctx.sendMessage("Hello World");
});

client.on("reward", async (ctx) => {
      if (ctx.reward.name === "reward_name")
          await ctx.sendMessage("Reward received!");
});

Изменение названия трансляции и категории по командам

const client = new VKPLMessageClient(...);
await client.connect();

// Команда смены названия. `!название [название трансляции]`
const titleCommand = "!название".toLowerCase();

// Команда смены категории. `!категория [название категории]`
const categoryCommand = "!категория".toLowerCase();

client.on("message", async (ctx) => {
      // Только для модераторов канала
      if (!ctx.user.isChannelModerator)
            return;

      // Проверка на команду смены названия
      if (ctx.message.text.toLowerCase().startsWith(titleCommand)) {
            const newTitle = ctx.message.text.slice(titleCommand.length);

            try {
                  const stream = await ctx.api.setStreamInfo(ctx.channel.blogUrl, {
                        title: newTitle
                  });

                  await ctx.reply(`Название трансляции обновлено: ${stream.data.stream.title}`);

            } catch (error) {
                  console.error(error);
                  await ctx.reply("Ошибка обновления названия трансляции");
            }
      }

      // Проверка на команду смены категории
      if (ctx.message.text.toLowerCase().startsWith(categoryCommand)) {
            const newCategory = ctx.message.text.slice(categoryCommand.length);

            try {
                  const stream = await ctx.api.setCategory(ctx.channel.blogUrl, newCategory);

                  await ctx.reply(`Категория обновлена: ${stream.data.stream.category.title}`);
            } catch (error) {
                  console.error(error);
                  await ctx.reply("Ошибка обновления категории");
            }
      }
});

Фичи

Readonly режим

В режиме readonly нельзя отправлять сообщения, но можно получать их. Для активации этого режима нужно в поле auth написать "readonly" или не передавать параметр auth вообще.

const client = new VKPLMessageClient({ auth: "readonly", channels: [target], debugLog: true });
await client.connect(); // После подключения все сообщения будут выводится в консоль

Вставка ссылок

В боте есть возможность вставки ссылок в текст сообщения. Доступно 2 формата ссылок:

  • Прямая ссылка. Пример: https://github.com/thearturca/vkplay-live-message-client
  • Ссылка в стиле markdown. Пример: [Ссылка](https://github.com/thearturca/vkplay-live-message-client)

Ссылка в стиле markdown будет выглядеть следующим образом:

Ссылка

Пример вставки ссылки

const client = new VKPLMessageClient({ auth: { accessToken: authToken }, channels: [target], debugLog: true });
await client.connect();

// отправки прямой ссылки
await client.sendMessage("Ссылка на мой гитхаб: https://github.com/thearturca/vkplay-live-message-client", target);

// отправки ссылки в стиле markdown
await client.sendMessage("[Ссылка на мой гитхаб](https://github.com/thearturca/vkplay-live-message-client)", target);

Получение наград

Возможность получение уведомление об активации награды зрителем.

const client = new VKPLMessageClient({ auth: { accessToken: authToken }, channels: [target], debugLog: true });
await client.connect();

client.on("reward", async (ctx) => {
      if (ctx.reward.name === "reward_name")
          await ctx.sendMessage("Reward received!");
});

Статус стрима

Возможность получить событие о запуске/остановке стрима.

const client = new VKPLMessageClient({ auth: { accessToken: authToken }, channels: [target], debugLog: true });
await client.connect();

client.on("stream-status", async (ctx) => {
      if (ctx.type === "stream_start")
          await ctx.sendMessage("Stream started!");

      if (ctx.type === "stream_end")
          await ctx.sendMessage("Stream stopped!");
});

Информация о канале

Возможность получать изменения в информации о канале, такие как название, категория, зрители и т.д.

const client = new VKPLMessageClient({ auth: { accessToken: authToken }, channels: [target], debugLog: true });
await client.connect();

client.on("channel-info", async (ctx) => {
      await ctx.sendMessage(`Current viewers: ${ctx.viewers}`);
});