Первый телеграм-бот на Node.js
Инженерия себя
- Твой первый бот
- Что тебе понадобится:
- Редактор для программирования - VS Code
- Движок Node.js
- Подготовка и настройка
- Подготовка окончена. Скоро запустим бота :)
- Создание бота через Botfather
- Запуск бота
- Программирование
- Примеры кода ботов
- Изучение программирования
- Средства, облегчающие программирование
- Библиотека grammy
- Запуск бота с Android смартфона
Твой первый бот
Статья поможет тебе создать своего первого телеграм-бота.
Время создания - 1-2 часа (и может еще пару часов на решение возникших в процессе проблем).
Первый бот будет очень простым и будет запускаться на твоем компьютере или смартфоне (будет работать, пока запущена программа на твоем устройстве). Это подходит для обучения, а в будущем ты сможешь размещать ботов на сервере, чтобы они работали стабильно и непрерывно.
Ты увидишь программный код бота и сможешь в нем покопаться. По мере того, как ты захочешь усложнять бота - ты будешь изучать что-то из программирования (и становиться программистом :)
Бот будет написан на языке JavaScript (потому что я делаю ботов на нем и других языков не знаю). Это один из самых популярных языков в данный момент (наверное, после Python). Node.js расшифровывается как Node JavaScript и является платформой для создания серверных приложений на JavaScript.
Сам я не являюсь профессиональным программистом, поэтому инструкция может быть неоптимальной и даже содержать ошибки.
Вопросы и сложности, возникающие в процессе, можно писать в группе: ссылка на группу
Что тебе понадобится:
(PS: Запуск бота с Android смартфона - и так тоже можно)
- Компьютер с Windows 10 или новее / Mac (для смартфонов отдельные инструкции), подключенный к интернету (возможен и запуск на более старом компьютере, но может понадобиться немного или много помучиться дополнительно). Теперь можно запустить и со смартфона, см ссылку выше.
- Желание сделать своего бота
- Готовность преодолевать трудности и разбираться в новом, продираясь через периоды отчаяния и непонимания :)
- Несколько часов (а может и дней) времени.
Начнем?
Редактор для программирования - VS Code
Один из лучших редакторов для программирования - VS Code. Тебе нужно скачать и установить программу на свой ПК: https://code.visualstudio.com/download
Движок Node.js
Это движок node.js для запуска ботов прямо на компе. Скачай и установи эту программу: https://nodejs.org/ru/download/
Подготовка и настройка
Создание папки
Создай на диске C:\ папку с коротким латинским названием - там будет располагаться твой код. Пусть папка называется bots, итоговый путь к ней будет C:\bots

Запусти Node.js command prompt.
Эта программа автоматически установилась вместе с node.js

Там с помощью командной строки перейди в свою папочку. Введи:
cd c://
И нажать ↵ enter. Команда cd - это change directory. этой командой мы переходим в корневой каталог c
cd bots
↵ enter. Так мы переходим в папочку с ботом

Дальше запускаешь команду:
npm init
На все запросы просто нажимай enter ↵

После этого в твоей папочке создастся файл package.json. Это технический файл, содержащий информацию о проекте. Можно заглянуть в него ради любопытства.
Далее: там же, в нашем терминале, запускаем команду:
npm install grammy --save

Пояснение:
npm install - команда для установки библиотеки API (набора готовых функций) из онлайн-каталога.
grammy - название нашей библиотеки. Она упрощает работу с серверами Телеграма (вместо сложных запросов к Телеграму у нас будут более простые и понятные функции)
--save - означает, что библиотека сохраняется не глобально на компьютере, а именно в нашу папочку.
Инструкция к библиотеке grammy, если ты уже готов к такому, находится здесь: https://grammy.dev/guide/introduction.html (с ее помощью возможно любое сложное взаимодействие с твоим ботом)
Описание всех функций grammy, с помощью которых мы взаимодействуем с ботом, здесь: https://deno.land/x/grammy@v1.15.3/mod.ts?s=Api
Подготовка окончена. Скоро запустим бота :)
Запускай установленную ранее программу VS Code
File -> Open folder -> Найди свою папочку на диске с:\ и выбери ее


Папка открылась в редакторе VS Code
Дальше нам нужно создать файл index.js. Нажми правой кнопкой на пустом месте возле списка файлов, выбери New File, впиши index.js и нажми enter.


Перед нами открылся наш новый файл. В него то мы и засунем программный код бота. Скопируй и вставь этот код в файл:
process.env.BOT_TOKEN = 'СЮДА_ТОКЕН';
const { Bot } = require('grammy');
const bot = new Bot(process.env.BOT_TOKEN)
// Код ниже заставляет отвечать на любое сообщение текстом 'Приветик!'
bot.command('start', (ctx) => ctx.reply('Да, хозяин'));
bot.command('help', (ctx) => ctx.reply('Чем я могу помочь?'));
// Код ниже заставляет отвечать на стикеры заданным текстом
bot.on(':sticker', (ctx) => ctx.reply('Вы прислали стикер, подлец!'));
// Код ниже заставляет отвечать на присланный текст. Он отвечает заданным текстом и вашей цитатой:
bot.on(':text', (ctx) => ctx.reply('Приветик! Вы написали:' + ctx.message.text));
bot.start();
console.log('Бот запущен');
Должно получиться что-то вроде этого:

Теперь немного отвлечемся на...
Создание бота через Botfather
Перейдите в телеграм к https://t.me/BotFather и отправьте ему команду /newbot
Далее задаем имя нашего бота и Username (придется взять что-то подлинее, т.к. все короткие заняты). Username бота обязан заканчиваться на bot, иначе Botfather не примет его. Например, это может быть ya_tvoy_ahaha_bot

В ответе Botfather будет кое-что важное. Это секретный токен нашего бота!
Скопируй токен из ответа и возвращайся в VS Code, чтобы вставить его в первой строчке вместо 'СЮДА_ТОКЕН'. Кавычки нужно оставить, заменив токеном только текст внутри.
Вообще - в программировании нужно быть очень внимательным к синтаксису. Пропуск какой-то кавычки или скобочки обычно приводит к тому, что программа не запустится.
Запуск бота
Мы готовы, сэр! В меню VS Code выбери Run -> Start Debugging. Или просто сразу нажми F5

При первом запуске предлагает выбор "отладчика". Выбери Node.js

Бот запущен! Или...
Произошла какая-то проблема, которых будет сотни на пути! (описание проблемы со скринами скидывай в https://t.me/+Q9ZIMY6x_o0zNDM6 )
Если бот запустился - справа должна появиться панель с кнопочками (1)

Если не появилась - можно посмотреть дебаг консоль. Для этого нажми View -> Debug Console. И скриншот того, что появилось - присылай в чат https://t.me/+Q9ZIMY6x_o0zNDM6
А теперь переходим к нашему боту. Его можно найти в Телеграм по Username, который мы задали при создании бота через Botfather. Или возвращаемся в сам Botfather - в последнем сообщении была ссылка на нашего бота.
Отправляем нашему боту /start и другие варианты:

Видишь, что он отвечает?
Теперь можно вернуться в свой код... и подредактировать эти тексты, написав что-то свое.

Чтобы перезапустить (зеленая круглая стрелочка) или остановить (красный квадратик) бота - пользуйтесь панелькой с кнопочками:

Перезапущенный бот учтет изменения в вашем коде.
Программирование
Если тебе хочется усложнить бота, чтобы он стал поумнее - начинается программирование.
Сложно ли программировать?
Если все делать правильно - то нет. Суть программирования можно описать двумя словами:
Условия и Операции
Операции - это просто. Например, может быть операция сложения и ты напишешь:
let x = a + 10
Или операция "добавить к одной строке другую строку", к строке "привет" добавить имя пользователя, это может выглядеть так:
let text = "Привет, " + first_name
Условия - тоже не сложно. Это проверка чего-то: если бот получает такое-то сообщение, то нужно выполнить такую-то операцию. Если другое - то другую, например:
if (x == 10) {text = 'Сообщаю, что Х равен 10'}
else {text = 'Сообщаю, что Х не равен 10'}
Алгоритм - это и есть набор условий и операций. Операции можно группировать в функции.
Это не так уж сложно. Но если ты захочешь создать большой проект - то тебе понадобится очень много условий и операций (длинный алгоритм). И понадобится использовать вспомогательные штуки (функции, объекты, массивы, классы, файлы-модули)... которые позволяют группировать это все так, чтобы наш мозг лучше ориентировался в 1000 условий и операций :)
Можем попробовать применить это на практике прямо сейчас. Воспользуемся операндом условия if. Заменим часть кода, там где bot.on('text')... на:
bot.on(':text', (ctx) => {
if (ctx.message.text == '10') {
ctx.reply(ctx.message.text * 5)
} else if (ctx.message.text == '20') {
ctx.reply('Вы написали 20. Сейчас я поделю ее на 5, получается: ' + ctx.message.text / 5 )
} else {
ctx.reply('Вы написали не 10 и не 20, а что-то другое. Вот это: ' + ctx.message.text)
}}
);

При получении текстового сообщения бот сравнивает текст с 10. Потом сравнивает с 20. В зависимости от условия - выдает разные результаты.
Так же в коде у нас есть операция умножения и операция "складывания строк" - когда к строке текста добавляется дополнительный текст.
Вот результат работы бота (после изменения кода я его перезапустил кнопочкой - на той панельке с кнопочками. Либо можно было запустить его заново через Run -> Start Debugging)

Примеры кода ботов
Примеры ботов можно скачать в этой статье: https://telegra.ph/Primery-koda-botov-01-11.
Можно запустить и поисследовать код этих ботов. Там ты найдешь:
- Простейший анонимный групповой чат
- Игра-кликер с анонимным чатом между участниками
- Улучшенная версия группового анонимного чата
- Анонимная чат-рулетка
Изучение программирования
В самом начале можно почитать несколько уроков по JavaScript здесь: https://learn.javascript.ru/ (или просто загугли "введение в JavaScript" - и найдешь десятки уроков)
Но самый интересный и эффективный способ учить программирование - это пытаться что-то напрограммировать :) и в процессе учиться, когда чего-то не знаешь.
Идеально, если у тебя есть желание создать какую-то программу. Тогда у тебя будет достаточно интереса, чтобы учиться.
Если же ты просто пытаешься учить программирование "впрок", оно тебе не нужно для собственного проекта - это, скорее всего, будет скучно и быстро надоест.
Эффективный способ обучаться
Возможно, самый эффективный способ обучаться - это разбираться в хорошем коде других программистов. На github опубликовано много открытого кода. Поначалу любой из них может быть слишком сложным для тебя, но в будущем это будет очень полезным.
Полезным не только для обучения, но и для проекта. Гораздо проще брать готовые куски чужого кода (переделывая его под себя), чем придумывать все с нуля.
Сложный момент в программировании -
то, что периодически (а особенно вначале) приходится "биться об стенку, ничего не понимая". Изгуглить пол-интернета, пока разберешься и найдешь какую-то простую ошибку. Этот этап необходимо пройти: научиться гуглить, научиться преодолевать такие "стены".
Со временем ты начнешь ориентироваться и научишься быстро находить нужную информацию (такие "стены" все-равно останутся, но будут реже :)
Средства, облегчающие программирование
Есть огромное количество инструментов, которые сделают программирование удобнее.
Например, можно включить дополнение, которое мгновенно будет подсвечивать синтаксические ошибки в коде (PS: оно включено по умолчанию)
(на скриншоте индивидуальные настройки. У тебя ошибки будут подчеркиваться тонкой волнистой линией - желтой или красной; пишу, чтобы ты ее заметил/а)

Можно настроить код так, чтобы:
- Бот не завершала работу при первой же ошибке. А, например, чтобы сам бот присылал тебе информацию об этой ошибке прямо в Телеграм-чат (с указанием, в каком файле и в какой строке произошел сбой).
Можно устанавливать "точки прерывания" (просто нажми мышкой в редакторе слева от номера строки - появится красная точка). Тогда выполнение будет останавливаться в этом месте и можно будет посмотреть значения всех переменных в режиме реального времени (просто наводя на них мышкой) !

(менее удобный способ - писать console.log('ваши данные') в коде, чтобы получать информацию в консоль)
Можно сделать "сниппеты" - готовые шаблоны-заготовки кода, которые вставляются по нажатию нескольких клавиш.
Для разных сложных задач обычно устанавливаются API - готовые функции, написанные кем-то заранее.
Все это делается легко, когда ты уже "плаваешь в этом океане". Но пока ты новичок - тебя ждет небольшой ад в попытке настроить любую штуку :)
Библиотека grammy
Инструкция к библиотеке grammy, если ты уже готов к такому, находится здесь: https://grammy.dev/guide/introduction.html (с ее помощью возможно любое сложное взаимодействие с твоим ботом)
Запуск бота с Android смартфона
Т.к. не у всех есть компьютер - я нашел три способа запустить бота со смартфона:
- Простой и удобный сервис для программирования, на котором можно временно запустить бота с любого устройства онлайн - https://replit.com/. Наверное, это самый простой способ, но инструкцию к нему я еще не создавал.
- Запуск node.js бота с Android смартфона в Spck Editor for NodeJS
(не очень актуальная статья, т.к. бесплатное приложение ограничивает запуск 1 часом в день, а иногда вообще не работает) - Запуск Телеграм-бота на смартфоне с помощью Dory-node.js
- Пока неоконченная статья: Запуск Телеграм-бота на смартфоне в Termux (более надежный, но и более сложный способ)
Вопросы и общение в специальной группе: https://t.me/+Q9ZIMY6x_o0zNDM6