Пишем бота для telegram на node.js

Пишем бота для telegram на node.js

И так приступим к написанию бота в Телеграмм:

Как оказывается, написать бота для telegram, как два пальца об асфальт.

Легко в общем!

Если кому-то нужно разработать бота для telegram или для другой платформы, напишите мне в VK — сделаем. Также интегрируем с 1С и остальными требуемыми программными продуктами.

Для чего можно использовать бота:

  • Социальные боты в электронной коммерции. Боты-продажники;
  • Боты напоминалки;
  • Проводить обучение;
  • Использоваться для управления умным домом и многое другое, все на что способна фантазия!

Запилим бота?

Запилим бота — увеличим продажи!

Итак, чтобы написать бота нам потребуется:

Кувалда!

Шутка!

Будем использовать библиотеку node-telegram-bot-api: https://github.com/yagop/node-telegram-bot-api

Вначале опишу какой простой бот получился в Telegram

Кстати можете посмотреть возможности ботов, на примере моего бота в телеграм, который позволяет вести список задач.

Бот называется — DP-TodoList
https://tlgg.ru/DP_TodoList_bot

И так описание бота, который будем разрабатывать:

Что он умеет:

  • умеет отправлять пользователю на запрос — классическую музыку рандомно
  • Две клавиатуры прикрутил к нему обычную и инлайновую
  • Отвечать на кое-какие сообщения
Обычная клавиатура
Инлайновая клавиатура

Начинаем писать бота в Telegram

В телеграм находим BotFather.

Набираем в нем:

/newbot

Придумываем название боту. И имя юзера. Он нам выдаст токен, который будем использовать.

Также у него есть и другие команды, для задания описания бота, команд и прочего:

Начинаем разработку бота на Node.js

В консоли пишем:

npm init -y

для создания package.json и управления зависимостями.

Устанавливаем node-telegram-bot-api

npm install --save node-telegram-bot-api

Файл index.js получился такой самый простой:

const TelegramBot = require('node-telegram-bot-api');

const token = 'СЮДА_ВСТАВЛЯЕМ_ТОКЕН_КОТОРЫЙ_ПОЛУЧИЛИ';

const bot = new TelegramBot(token, {polling: true});

bot.onText(/\/echo (.+)/, (msg, match) => {

  const chatId = msg.chat.id;
  const resp = match[1]; // the captured "whatever"

  bot.sendMessage(chatId, resp);
});

bot.on('message', (msg) => {
  const chatId = msg.chat.id;

  bot.sendMessage(chatId, 'Получили твое сообщение! Спасибо!');
});

Вставляем свой токен, который получили от BotFather и можно его разместить на бесплатном хостинге Heroku, и все сразу заработает, самый простой ботик!

Но лучше токен, поместить в переменную окружения, также можно на Heroku.

Полезные ссылки по ботам Телеграм

Документация по ботам telegram находится: https://core.telegram.org/bots/api

Также есть сайт и на русском с описанием: https://tlgrm.ru/docs/bots/api

Описываю какой код бота для Телеграм получился

const fs = require('fs');

Подключаем библиотеку для работы с файлами

const TelegramBot = require('node-telegram-bot-api');
const token = process.env.TELEGRAM_BOT_TOKEN;
const bot = new TelegramBot(token, {polling: true});
const idAdmin = 32949386;

Подключаем библиотеку node-telegram-bot-api, токен получаем из переменной окружения, и устанавливаем константу idAdmin — ему дополнительно сообщения потом будем слать.

bot.on('message', (msg) => {
  const chatId = msg.chat.id;
  const first_name = msg.chat.first_name;

  if (msg.text) {

    const text = msg.text.toLowerCase();

    if (~text.indexOf("привет")) {  
      bot.sendMessage(chatId, 'Приветик, ' + first_name + '!');
    } else if (~text.indexOf("start")) {
    } else if (~text.indexOf("закрыть")) {
      bot.sendMessage(chatId, 'Клавиатура закрыта', {
        reply_markup: {
          remove_keyboard: true
        }
      });
    } else if (~text.indexOf("клав")) {
      openKlava(chatId);
    } else if (~text.indexOf("здраст")) {
      bot.sendMessage(chatId, 'Здравствуй, здравствуй, ' + first_name + '!');
    } else if (~text.indexOf("здравст")) {
      bot.sendMessage(chatId, 'Здравствуй, здравствуй, ' + first_name + '!');
    } else if (~text.indexOf("дур")) {
      bot.sendMessage(chatId, '' + first_name + ', не ругайся, а то обижусь!');
    } else if (~text.indexOf("туп")) {
      bot.sendMessage(chatId, '' + first_name + ', не ругайся, а то обижусь!');
    } else if (~text.indexOf("класи")) {
      openClassik(chatId, first_name);
    } else if (~text.indexOf("класси")) {
      openClassik(chatId, first_name);
    } else if (~text.indexOf("про автора")) {
      bot.sendMessage(chatId, 'Про автора бота', {
        reply_markup: {
          inline_keyboard: [
            [
              {
                text: 'Автор',
                url: 'https://polyakovdmitriy.ru'
              }
            ],
            [
              {
                text: 'Классика',
                callback_data: 'classik'
              }
            ]
          ]
        }  
      })
    } else {
      bot.sendMessage(chatId, '' + first_name + ', я тебя не понимать!');
    }
  }

  bot.forwardMessage(chatId, idAdmin, msg.message_id);
});

Здесь у нас в bot.on(‘message’ — прилетают все сообщения.

const chatId = msg.chat.id; — Достаем id чата.

const first_name = msg.chat.first_name; — Достаем имя пользователя.

if (msg.text) { — если есть свойство текст пытаемся его обработать.

Здесь: Если пришел текст привет - то бот отвечает: Приветик, Имя!

if (~text.indexOf("привет")) {  
  bot.sendMessage(chatId, 'Приветик, ' + first_name + '!');

И также остальные текстовые фразы обрабатывает.

  bot.sendMessage(chatId, 'Про автора бота', {
    reply_markup: {
      inline_keyboard: [
        [
          {
            text: 'Автор',
            url: 'https://polyakovdmitriy.ru'
          }
        ],
        [
          {
            text: 'Классика',
            callback_data: 'classik'
          }
        ]
      ]
    }  
  })

Этим кодом создается клавиатура инлайновая.

bot.forwardMessage(chatId, idAdmin, msg.message_id); — этим кодом все сообщения пересылаются админу.

Далее

bot.onText(/\/start/, (msg, match) => {
  const chatId = msg.chat.id;
  bot.sendMessage(chatId, 'Приветик, ' + msg.chat.first_name + '!');
  openKlava(chatId);
});

Здесь обрабатывается команда /start

bot.on('callback_query', (query) => {
  const chatId = query.message.chat.id;
  if (query.data === 'classik') {
    openClassik(chatId, query.message.chat.first_name);
  } 
});

Этим кодом обрабатывается callback — от инлайновой клавиатуры.

bot.on('contact', (msg) => {
  const chatId = msg.chat.id;
  bot.sendMessage(chatId, 'Спасибо! Ваш заказ принят, мы с Вами свяжемся!');
});

Этим кодом отлавливается контакты, которые отправили боту, хотя их можно также отловить bot.on(‘message’ — сюда они тоже приходят.

function openKlava(chatId) {
   bot.sendMessage(chatId, 'Клавиатура открыта', {
    reply_markup: {
      keyboard: [
        [
          {
            text: 'Классика'
          }, {
            text: 'Закрыть'
          }
        ],
        [
          {
            text: 'Заказать разработку бота',
            request_contact: true
          }
        ],
        [
          {
            text: 'Про автора'
          }
        ]        
      ],
      one_time_keyboard: true
    }  
  }) 
}

Здесь создаем клавиатуру.

request_contact: true — обозначает запрос контактов, также можно запрашивать локацию.

function openClassik(chatId, first_name) {
  fs.readdir('./klasik/', function(err,files) {
    const rf = files[Math.floor(Math.random()*files.length)];
    bot.sendMessage(chatId, '' + first_name + ', лови классическую музыку!');
    bot.sendAudio(chatId, './klasik/' + rf).then(()=>{
      bot.sendMessage(chatId, 'И слушай!');
    });  
  })  
}

Этот код отправляет классическую музыку, случайно выбранную из папки ./klasik/

Итого файл index.js полностью:

const fs = require('fs');

const TelegramBot = require('node-telegram-bot-api');
const token = process.env.TELEGRAM_BOT_TOKEN;

const bot = new TelegramBot(token, {polling: true});

const idAdmin = 32949386;

bot.on('message', (msg) => {
  const chatId = msg.chat.id;
  const first_name = msg.chat.first_name;

  if (msg.text) {

    const text = msg.text.toLowerCase();

    if (~text.indexOf("привет")) {  
      bot.sendMessage(chatId, 'Приветик, ' + first_name + '!');
    } else if (~text.indexOf("start")) {
    } else if (~text.indexOf("закрыть")) {
      bot.sendMessage(chatId, 'Клавиатура закрыта', {
        reply_markup: {
          remove_keyboard: true
        }
      });
    } else if (~text.indexOf("клав")) {
      openKlava(chatId);
    } else if (~text.indexOf("здраст")) {
      bot.sendMessage(chatId, 'Здравствуй, здравствуй, ' + first_name + '!');
    } else if (~text.indexOf("здравст")) {
      bot.sendMessage(chatId, 'Здравствуй, здравствуй, ' + first_name + '!');
    } else if (~text.indexOf("дур")) {
      bot.sendMessage(chatId, '' + first_name + ', не ругайся, а то обижусь!');
    } else if (~text.indexOf("туп")) {
      bot.sendMessage(chatId, '' + first_name + ', не ругайся, а то обижусь!');
    } else if (~text.indexOf("класи")) {
      openClassik(chatId, first_name);
    } else if (~text.indexOf("класси")) {
      openClassik(chatId, first_name);
    } else if (~text.indexOf("про автора")) {
      bot.sendMessage(chatId, 'Про автора бота', {
        reply_markup: {
          inline_keyboard: [
            [
              {
                text: 'Автор',
                url: 'https://polyakovdmitriy.ru'
              }
            ],
            [
              {
                text: 'Классика',
                callback_data: 'classik'
              }
            ]
          ]
        }  
      })
    } else {
      bot.sendMessage(chatId, '' + first_name + ', я тебя не понимать!');
    }
  }
  bot.forwardMessage(chatId, idAdmin, msg.message_id);
 
});

bot.onText(/\/start/, (msg, match) => {

  const chatId = msg.chat.id;
  bot.sendMessage(chatId, 'Приветик, ' + msg.chat.first_name + '!');
  openKlava(chatId);

});

bot.on('callback_query', (query) => {
  const chatId = query.message.chat.id;
  if (query.data === 'classik') {
    openClassik(chatId, query.message.chat.first_name);
  } 
});

bot.on('contact', (msg) => {

  const chatId = msg.chat.id;
  bot.sendMessage(chatId, 'Спасибо! Ваш заказ принят, мы с Вами свяжемся!');

});

function openClassik(chatId, first_name) {
  fs.readdir('./klasik/', function(err,files) {
    const rf = files[Math.floor(Math.random()*files.length)];
    bot.sendMessage(chatId, '' + first_name + ', лови классическую музыку!');
    bot.sendAudio(chatId, './klasik/' + rf).then(()=>{
      bot.sendMessage(chatId, 'И слушай!');
    });  
  })  
}

function openKlava(chatId) {
   bot.sendMessage(chatId, 'Клавиатура открыта', {
    reply_markup: {
      keyboard: [
        [
          {
            text: 'Классика'
          }, {
            text: 'Закрыть'
          }
        ],
        [
          {
            text: 'Заказать разработку бота',
            request_contact: true
          }
        ],
        [
          {
            text: 'Про автора'
          }
        ]        
      ],
      one_time_keyboard: true
    }  
  }) 
}

Структура проекта получилась такая:

Успехов в создании ботиков!

Оставить комментарий