Первое знакомство
Что сделаем?
- Создадим аккаунт боту
- Установим и настроим проект
- Запустим бота, который отвечает на команду
/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.