Я начал погружение в мир IT лишь три недели назад. Серьезно, три недели назад я даже не понимал синтаксиса HTML, а знакомство с языками программирования заканчивалось школьной программой по Pascal 10-летней давности. Однако я решился поехать в IT-лагерь, для детей которого было бы неплохо сделать бота. Я решил, что это вряд ли так сложно. С этого начался длинный путь, в рамках которого я:
- развернул облачный сервер с Ubuntu,
- зарегистрировался на GitHub,
- выучил базовый синтаксис JavaScript,
- прочитал тонну статей на английском и русском языках,
- сделал, наконец, бота,
- написал эту статью, наконец.
Выглядел итоговый результат примерно так: Скажу сразу, это статья для начинающих — чтобы просто понять, как делать элементарные вещи с самой нулевой точки. А еще — для продвинутых программистов — просто чтобы их немного посмешить. 1. Как писать код на JS? Я понимал, что стоит для начала хотя бы разобраться в синтаксисе языка. Выбор пал на JavaScript, просто потому что следующим шагом для меня было создание приложения на ReactNative. Я начал с курса на Codecademy и остался в большом восторге. Первые 7 дней бесплатно. Реальные проекты. Рекомендую. Прохождение его заняло порядка 25 часов. На самом деле далекоооо не все из него пригодилось. Вот так примерно выглядит структура курса и подробно первый блок.2. Как зарегистрировать бота? В начале мне очень помогла вот эта статья из блога некоего Арчакова. Он разжевывает самое начало. Но главное, что там есть — это инструкция по регистрации бота. Лучше я не напишу, и поскольку это самая легкая часть, просто напишу суть. Нужно создать бота и получить его API. Это делается через другого бота — @BotFather. Найдите его в telegram, напишите ему, пройдите простой путь и получите (сохраните!) API-ключ (это набор цифр и букв). Он пригодился мне позже.3. Как выглядит код бота? После долгого изучения статей, я понял, что стоит использовать какую-то библиотеку (сторонний код в формате модуля), чтобы не мучаться с изучением API телеграма и созданием с нуля больших кусков кода. Я нашел фреймворк telegraf, который нужно было как-то подключить к чему-то при помощи npm или yarn. Примерно так я понимал тогда, из чего состоит развертывание бота. Смеяться здесь. Я не обижусь. Больше всего при последующем создании бота мне помогли примеры, указанные внизу страницы:3. Как создать собственный облачный сервер за 100 рублей После долгих поисков я понял, что команда ‘npm’ из картинки выше относится к командной строке. Командная строка есть везде, но чтобы получилось ее исполнить, нужно поставить NodePackageManager. Проблема была в том, что программировал я на PixelBook с ChromeOS. Я пропущу здесь большой блок про то, как я познавал Linux — для большинства это пустое и ненужное. Если у вас есть Windows или MacBook, у вас уже есть консоль. Если в двух словах, я поставил Linux через Crostini. Однако в процессе я понял, что для постоянной работы бота (а не только когда у меня включен компьютер) мне нужен облачный сервер. Я выбрал vscale.io Я закинул 100 рублей, купил самый дешевый сервер Ubuntu (см.картинку). 4. Как подготовить сервер для запуска бота После этого я понял, что нужно сделать на сервере какую-то папку, в которую я положу файл с текстом кода. Для этого в консоли (запускать прямо на сайте через кнопку «Открыть консоль») я вбил
mkdir bot
bot — это стало название моей папки. После этого я установил npm и Node.js, что позволит запускать мне потом код из файликов с разрешением *.js
sudo apt update sudo apt install nodejs sudo apt install npm
Очень рекомендую на этом этапе настроить подключение к серверу через свою консоль. Вот инструкция Это позволит работать с сервером напрямую через консоль своего компьютера.5. Как написать код первого бота. А вот теперь просто открытие для меня. Любая программа — это просто строки текста. Их можно вбить куда угодно, сохранить с нужным расширением и все. Ты прекрасен. Я использовал Atom, но реально, можно просто в блокноте стандартном писать. Главное — сохранить потом файл в нужном расширении. Это как написать текст в Word и сохранить. Я сделал новый файл, в который вставил код из примера на странице telegraf и сохранил в файл index.js (вообще не обязательно называть файл так, но так принято). Важно — вместо BOT_TOKEN вставьте свой API-ключ из второго пункта.
const Telegraf = require('telegraf') const bot = new Telegraf(process.env.BOT_TOKEN) bot.start((ctx) => ctx.reply('Welcome!')) bot.help((ctx) => ctx.reply('Send me a sticker')) bot.on('sticker', (ctx) => ctx.reply('')) bot.hears('hi', (ctx) => ctx.reply('Hey there')) bot.launch()
6. Как закинуть код на сервер через github Теперь мне нужно было закинуть как-то этот код на сервер и запустить его. Для меня это стало челленджем. В итоге, после долгих мытарств я понял, что проще будет создать файл на github, который позовляет обновлять код при помощи команды в консоли. Я зарегал аккаунт на github и сделал новый проект, куда и загрузил файл. После этого мне нужно было понять, как же настроить загрузку файлов с моего аккаунта (открытого!) на сервер в папку bot (если вдруг вы вышли из нее — просто напишите cd bot).7. Как загрузить файлы на сервер через github ч.2 Мне нужно было поставить на сервер программу, которая будет загружать файлы с git. Я поставил git на сервер, вбив в консоль
apt-get install git
После этого мне нужно было настроить загрузку файлов. Для этого я вбил в командную строку
git clone git://github.com/b0tank/bot.git bot
В итоге все из проекта загрузилось на сервер. Ошибкой на данном этапе было, что я, по сути, сделал вторую папку внутри уже существующей папки bot. Адрес до файла выглядел как */bot/bot/index.js Я решил пренебречь этой проблемой. И чтобы подгрузить библиотеку telegraf, которую мы запрашиваем в первой строке кода, вбейте в консоль команду.
npm install telegraf
8. Как запустить бота Для этого, находясь в папке с файлом (чтобы переходить из папки в папку через консоль — выполняйте команду формата cd bot
Чтобы убедиться, что вы там, где нужно можно вбить команду, которая отобразит в консоли все файлы и папки, которые там лежат ls -a
Для запуска я ввел в консоль
node index.js
Если нет никакой ошибки — все хорошо, бот работает. Ищите его в телеграме. Если ошибка есть — применяйте свои знания из 1 пункта.9. Как запустить бота в фоновом режиме Достаточно быстро вы поймете, что бот работает только тогда, когда вы сами сидите в консоли. Чтобы решить эту проблему я использовал команду
screen
После этого появится экран с каким-то текстом. Это значит, что все хорошо. Вы на виртуальном сервере на облачном сервере. Чтобы понять лучше, как это все работает — вот статья. Просто заходите в свою папку и вбивайте команду по запуску бота
node index.js
10. Как работает бот и как расширить его функционал Что же умеет наш бот из примера? Он умеет
bot.start((ctx) => ctx.reply('Welcome!'))
говорить «Welcome!» в момент старта (попробуйте поменять текст)
bot.help((ctx) => ctx.reply('Send me a sticker'))
в ответ на стандартную команду /help отправлять сообщение «Send me a sticker»
bot.on('sticker', (ctx) => ctx.reply(''))
в ответ на стикер отправлять одобрение
bot.hears('hi', (ctx) => ctx.reply('Hey there'))
отвечать «Hey there», если ему пишут ‘hi’ bot.launch() Если вы посмотрите код на github, то быстро поймете, что сильно далеко от этого функционала я не ушел. Что активно используется, так это функция ctx.replyWithPhoto
Она позволяет отправлять заданное фото или gif в ответ на определенный текст. Значимая часть кода была написана детьми 11-13 лет, которым я дал доступ к боту. Они ввели свои user-case. Думаю, легко определить, какая часть сделана была ими. Например, на сообщение «джейк» приходит гифка с известным персонажем из мультика Adventure Time. Чтобы развивать бота дальше, подключать клавиатуру нужно смотреть примеры, например, отсюда11. Как обновлять код и перезапускать бота Не забывайте, что надо обновлять код не только на github, но и на сервере. Делать это просто — стопим бота (нажать ctrl+c), — вводим в консоль, находясь в целевой папке, git pull
— вновь запускаем бота командой node index.js
END Многие вещи, описанные в этом файле, будут супер очевидны для продвинутых программистов. Однако когда я сам пытался одним махом перепрыгнуть пропасть до мира ботов, мне очень не хватало подобного гайда. Гайда, в котором не пропускается очевидные и простые для любого IT-специалиста вещи. В дальнейшем я планирую пост про то, как сделать свое первое приложение на ReactNative в таком же стиле, подписывайтесь!
- Главная »
- NodeJS »
- Node.JS: Делаем своего Telegram бота
Дата: 06.07.2017 в 17:53, Категория:NodeJS
- 124459
- 125 –>
Если вы открыли чат с ботом, кликаем на кнопку “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, 'Отлично! Я обязательно напомню, если не сдохну :)'); });
</pre></pre></pre>
- userId – хранит ID пользователя который прислал сообщение.
- text – хранит первый параметр – текст. Его бот и должен прислать мне.
- time – хранит второй параметр – время. Устанавливаем время когда прийдет уведомление.
Сохраняем все эти параметры в наш массив
notes
и бот отправляет сообщение, что запись успешно сохранилась.Теперь надо поставить таймер, он будет каждую секунду проверять записи, которые совпадают с конкретным временем. Если одно из напоминаний соответствует настоящему времени (часу и минуте), то отправляем пользователю напоминание.
</ul>
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.
</pre></pre>
ПОДПИШИСЬ НА ОБНОВЛЕНИЯ
Только новые публикации и никакого мусора.
Используемые источники:
- https://habr.com/ru/post/447006/
- https://archakov.im/post/telegram-bot-on-nodejs.html