Node.JS: Делаем своего Telegram бота
-
123432
-
125

Последнее время начал увлекаться разработкой приложений на Node.JS. Понравился своей гибкостью и тем, что приложения можно писать на JavaScript, а с ним я хоть немного дружу.
Недавно написал скрипт, который следит за активностью группы в ВК. А чуть позже, решил поинтересоваться Telegram API. Дуровы всегда умели делать качественный продукт и Telegram меня обрадовал своей быстротой и возможностью создания своего бота с понятным даже новичку API.
И в этой статье я коротко расскажу о том, как создать своего бота на Node.JS. Кстати, вот ссылка на репозиторий бота.
Первым делом, нам надо создать своего бота и получить Token. Волноваться вам не стоит насчет тяжести создания бота, для этого у нас есть @BotFather.
Если вы открыли чат с ботом, кликаем на кнопку "Start".
После чего, бот нам выдает все доступные команды.
Отправляем команду /newbot
или кликаем по активной ссылке этой команды. Далее, бот нас попросить ввести имя для нашего бота.
Можете не париться с именем и вписать любое тестовое имя. Плюс в том, что вы в любой момент сможете удалить тестового бота или поменять имя.
Я решил во время статьи создать бота для этого блога и назвал его "Archakov Blog".
На последнем этапе, бот попросит вас придумать никнейм (логин). К никнейму в конце обязательно надо добавить суффикс "bot" можно и "Bot". К сожалению, никнейм поменять больше не получится. Если это ваш первый бот, не парьтесь и придумайте любой никнейм.
В итоге, получаем сообщение о том, что бот был создан и в конце будет указан его токен. Этот токен нам пригодится в процессе разработки.
Не советую делиться токеном с другими людьми. Так как он дает полный доступ к вашему боту. Начиная от редактирования имени и до удаления бота.
Теперь приступим к написанию кода и первым делом установим Node.JS. У меня OS X и хочу предупредить, что от операционной системы не будет зависеть разработка нашего бота.
Как установить Node.JS рассказывать я не хочу и не буду. Для этого обращаемся к гугл с запросом как установить Node.JS.
После того, как установили Node.JS, начинаем разрабатывать наше приложение, а точней бота. Node.JS ищет в каждой папке наличие папки node_modules
с модулями, откуда он и будет подключать библиотеку для работы с Telegram API.
Советую поучиться работать с npm командой в консоли. Заранее установите этот менеджер пакетов, он нам скоро пригодится. Кстати, очень крутая и полезная штука, в будущем пригодится. Особенно, когда наступит апокалипсис, будете сидеть и пакеты устанавливать...
Создаем папку с тестовым проектом, к примеру telegram-bot
. Далее, в этой папке создаем файл index.js
и все! Вы красавчик! Бот создан, можете работать с ним.
Ага, канешна. Код сам не напишется!
Прежде чем его и писать, установим модуль node-telegram-bot-api
. Для этого открываем консоль, пропишем путь к директории нашего проекта cd telegram-bot
(укажите полный путь к этой папке).
В моем случае, это cd /Applications/MAMP/htdocs/telegram-bot
.
Если вы на Windows, советую создавать папку в корне диска, чтобы можно было обращаться к проекту по короче, к примеру cd C:\telegram-bot
.
Отлично, теперь не забываем про npm
. В консоли вбиваем команду: npm install node-telegram-bot-api
или yarn add node-telegram-bot-api
(в зависимости от того, что вы используете yarn или npm).
И через несколько секунд модуль установился. Ура! В репозитории уже есть пример кода и с помощью этого кода, сделаем своего мега-тру-бота.
Теперь перейдем к файлу index.js
и напишем немного кода.
// Подключаем библиотеку для работы с Telegram API в переменную
var TelegramBot = require('node-telegram-bot-api');
// Устанавливаем токен, который выдавал нам бот
var token = 'ТУТ_ВСТАВЛЯЕМ_ТОКЕН';
// Включить опрос сервера. Бот должен обращаться к серверу Telegram, чтобы получать актуальную информацию
// Подробнее: https://core.telegram.org/bots/api#getupdates
var bot = new TelegramBot(token, { polling: true });
// Написать мне ... (/echo Hello World! - пришлет сообщение с этим приветствием, то есть "Hello World!")
bot.onText(/\/echo (.+)/, function (msg, match) {
var fromId = msg.from.id; // Получаем ID отправителя
var resp = match[1]; // Получаем текст после /echo
bot.sendMessage(fromId, resp);
});
// Простая команда без параметров
bot.on('message', function (msg) {
var chatId = msg.chat.id; // Берем ID чата (не отправителя)
// Фотография может быть: путь к файлу, поток (stream) или параметр file_id
var photo = 'cats.png'; // в папке с ботом должен быть файл "cats.png"
bot.sendPhoto(chatId, photo, { caption: 'Милые котята' });
});
В начале кода мы подключили модуль (библиотеку) для работы с Telegram API. Далее, в переменной token
вставляем наш токен, который выдавал нам BotFather при создании нашего бота.
Работа с командами очень простая и понятная. Советую немного потренироваться еще с регулярными выражениями, правильно составлять команду по маске. Данный модуль содержит кучу полезных методов. Прочтите документацию в репозитории этого модуля.
Давайте в качестве моего примера, попробуем сделать напоминалку важных дел. Конечно, пример не ахти, но кому-нибудь будет полезно.
Подключаем модуль для работы с Telegram API и прописываем токен:
var TelegramBot = require('node-telegram-bot-api');
var token = 'ТУТ_ВСТАВЛЯЕМ_ТОКЕН';
var bot = new TelegramBot(token, {polling: true});
Далее, создаем переменную в которой будут храниться все заметки от пользователя.
var notes = [];
Добавляем команду /напомни
, с помощью которой и будем добавлять напоминание.
bot.onText(/напомни (.+) в (.+)/, function (msg, match) {
var userId = msg.from.id;
var text = match[1];
var time = match[2];
notes.push({ 'uid': userId, 'time': time, 'text': text });
bot.sendMessage(userId, 'Отлично! Я обязательно напомню, если не сдохну :)');
});
- userId - хранит ID пользователя который прислал сообщение.
- text - хранит первый параметр - текст. Его бот и должен прислать мне.
- time - хранит второй параметр - время. Устанавливаем время когда прийдет уведомление.
Сохраняем все эти параметры в наш массив notes
и бот отправляет сообщение, что запись успешно сохранилась.
Теперь надо поставить таймер, он будет каждую секунду проверять записи, которые совпадают с конкретным временем. Если одно из напоминаний соответствует настоящему времени (часу и минуте), то отправляем пользователю напоминание.
setInterval(function(){
for (var i = 0; i < notes.length; i++) {
const curDate = new Date().getHours() + ':' + new Date().getMinutes();
if (notes[i]['time'] === curDate) {
bot.sendMessage(notes[i]['uid'], 'Напоминаю, что вы должны: '+ notes[i]['text'] + ' сейчас.');
notes.splice(i, 1);
}
}
}, 1000);
Чтобы вы поняли как работает код выше, я нарисовал схему:
Итого:
var TelegramBot = require('node-telegram-bot-api');
var token = 'ТУТ_ВСТАВЛЯЕМ_ТОКЕН';
var bot = new TelegramBot(token, {polling: true});
var notes = [];
bot.onText(/напомни (.+) в (.+)/, function (msg, match) {
var userId = msg.from.id;
var text = match[1];
var time = match[2];
notes.push({ 'uid': userId, 'time': time, 'text': text });
bot.sendMessage(userId, 'Отлично! Я обязательно напомню, если не сдохну :)');
});
setInterval(function(){
for (var i = 0; i < notes.length; i++) {
const curDate = new Date().getHours() + ':' + new Date().getMinutes();
if (notes[i]['time'] === curDate) {
bot.sendMessage(notes[i]['uid'], 'Напоминаю, что вы должны: '+ notes[i]['text'] + ' сейчас.');
notes.splice(i, 1);
}
}
}, 1000);
Сохраняем наш скрипт, я назвал reminder.js
. Запускаем его через консоль, командой node reminder.js
В итоге, я получил свое ожидаемое напоминание.

Спасибо за внимание. Не ленитесь учить JavaScript, за ним будущее веб и в частности всей галактики! Так же, выкладываю полный файл reminder.js.
ПОДПИШИСЬ НА ОБНОВЛЕНИЯ
Только новые публикации и никакого мусора.