Skip to content

Первое знакомство

Что сделаем?

  • Создадим аккаунт боту
  • Установим и настроим проект
  • Запустим бота, который отвечает на команду /start
  • Научимся работать с «переменными окружения» и --watch режимом

Создание аккаунта телеграм боту

Для начала, создайте своего бота и получите токен. Вы можете сделать это воспользовавшись ботом @BotFather.

Отправьте ему команду /newbot и следуйте инструкциям пока вы не получите токен вида 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw.

Установка

Для начала нам необходим создать проект и установить туда GramIO с помощью npm. Создаём папку и прописываем в ней npm init для создания package.json для нашего проекта. Так же укажите "type": "module" (TODO: рассказать зачем) чтобы конфиг выглядел примерно так:

json
{
    "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.

bash
npm install gramio # или npm i gramio

Первый бот

Давайте напишем логику нашему первому боту. Создайте файл index.js и напишите в нём:

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 и вне обработчиков событий.

js
import { Bot } from "gramio";

const bot = new Bot("12345678:AaBbCcDdEeFfGgHh");

bot.api.sendMessage({
    chat_id: "id нужного чата",
    text: "Вы написали /start",
});

А вот в обработчиках вам понадобиться обратиться к context.bot переменную которая является нашем инициализированным классом бота

js
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 в нашем проекте и перенесём токен туда.

dotenv
BOT_TOKEN=12345678:AaBbCcDdEeFfGgHh

Объявление переменных окружения в этом файле до нельзя простое, ведь это всего-лишь пара ключ=значение.

Хорошо, файл создан, но как обращаться к этим «переменным окружения»? Для этого существует объект process.env в котором в нашей программе и будут лежать эти переменные, но стоит помнить что файл .env существует для удобства и не все программы читают его по умолчанию. Например в Node.js нам необходимо указать его в аргументе --env-file.

Давайте модифицируем наш код, чтобы использовать переменные окружения.

js
import { Bot } from "gramio";

const bot = new Bot(process.env.BOT_TOKEN).command("start", (context) =>
    context.send("Вы написали /start")
);

bot.start();

И запустим указав наш .env файл. (дока)

bash
node --env-file=.env index.js

а ещё давайте добавим --watch режим, который будет перезапускать наш скрипт при изменениях в файле!

bash
node --watch --env-file=.env index.js

Так же давайте для удобства вынесем эту команду в наш package.json.

для этого добавьте scripts объект и в нём dev с содержимым нашей команды. В итоге это выглядит примерно так:

json
{
    "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.