И так приступим к написанию бота в Телеграмм:
Как оказывается, написать бота для 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
}
})
}
Структура проекта получилась такая:
Успехов в создании ботиков!