Первое знакомство
Что сделаем?
- Создадим аккаунт боту
- Установим и настроим проект
- Запустим бота, который отвечает на команду
/start
- Научимся работать с «переменными окружения» и
--watch
режимом
Создание аккаунта телеграм боту
Для начала, создайте своего бота и получите токен
. Вы можете сделать это воспользовавшись ботом @BotFather.
Отправьте ему команду /newbot
и следуйте инструкциям пока вы не получите токен вида 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw
.
Установка
Для начала нам необходим создать проект и установить туда GramIO
с помощью npm
. Создаём папку и прописываем в ней npm init
для создания package.json для нашего проекта. Так же укажите "type": "module"
(TODO: рассказать зачем) чтобы конфиг выглядел примерно так:
{
"name": "bot-test",
"type": "module",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"description": ""
}
Следующим шагом мы установим необходимую нам зависимость - GramIO.
npm install gramio # или npm i gramio
Первый бот
Давайте напишем логику нашему первому боту. Создайте файл index.js
и напишите в нём:
import { Bot } from "gramio";
const bot = new Bot("12345678:AaBbCcDdEeFfGgHh").command("start", (context) =>
context.send("Вы написали /start")
);
bot.start();
где 12345678:AaBbCcDdEeFfGgHh
это токен нашего бота.
Этот код можно разобрать на части -
import { Bot } from "gramio";
- это импорт главного класса нашей библиотеки.const bot = new Bot("12345678:AaBbCcDdEeFfGgHh")
- создаём переменнуюbot
и инициализируем класс передав ему токен нашего бота.command("start", (context) => ???);
- Регистрируем нашу команду/start
для которой будет вызываться эта функция`context.send("Вы написали /start")
- с помощью этого метода отправляем в тот же чат указанное сообщениеbot.start();
- а благодаря этому запускаем прослушивание событий с помощью Long-Polling (пока не важно)
Запустим этот код с помощью node index.js
и проверим работу бота.
// TODO: картинка
Что за .send
?
Это метод контекста Message
, который позволяет отправить сообщение в тот же чат откуда и пришло исходное сообщение. Благодаря этому мы можем не описать полностью в какой чат нам нужно отправлять сообщение, но всё же если нужно мы также можем воспользоваться обычными методами из API.
Вы можете отправить запрос к API и вне обработчиков событий.
import { Bot } from "gramio";
const bot = new Bot("12345678:AaBbCcDdEeFfGgHh");
bot.api.sendMessage({
chat_id: "id нужного чата",
text: "Вы написали /start",
});
А вот в обработчиках вам понадобиться обратиться к context.bot
переменную которая является нашем инициализированным классом бота
import { Bot } from "gramio";
const bot = new Bot("12345678:AaBbCcDdEeFfGgHh").command("start", (context) =>
context.bot.api.sendMessage({
chat_id: "id нужного чата",
text: "Вы написали /start",
})
);
bot.start();
Конфигурация нашего бота
Сразу же стоит запомнить что хранить так токен - зло. Рекомендуется хранить секреты в переменных окружения, поэтому давайте создадим файл .env
в нашем проекте и перенесём токен туда.
BOT_TOKEN=12345678:AaBbCcDdEeFfGgHh
Объявление переменных окружения в этом файле до нельзя простое, ведь это всего-лишь пара ключ=значение
.
Хорошо, файл создан, но как обращаться к этим «переменным окружения»? Для этого существует объект process.env
в котором в нашей программе и будут лежать эти переменные, но стоит помнить что файл .env
существует для удобства и не все программы читают его по умолчанию. Например в Node.js нам необходимо указать его в аргументе --env-file
.
Давайте модифицируем наш код, чтобы использовать переменные окружения.
import { Bot } from "gramio";
const bot = new Bot(process.env.BOT_TOKEN).command("start", (context) =>
context.send("Вы написали /start")
);
bot.start();
И запустим указав наш .env
файл. (дока)
node --env-file=.env index.js
а ещё давайте добавим --watch
режим, который будет перезапускать наш скрипт при изменениях в файле!
node --watch --env-file=.env index.js
Так же давайте для удобства вынесем эту команду в наш package.json
.
для этого добавьте scripts
объект и в нём dev
с содержимым нашей команды. В итоге это выглядит примерно так:
{
"name": "bot-test",
"type": "module",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"dev": "node --watch --env-file=.env index.js"
},
"author": "",
"license": "ISC",
"description": "",
"dependencies": {
"gramio": "^0.0.40"
}
}
Теперь мы можем её вызывать так - npm run dev
.