раздел 03

Собрать простого бота

Соберём echo-бот: он отвечает на /start и повторяет любое присланное сообщение. Это минимум, на котором видно весь цикл: токен из окружения, обработчик команды, обработчик сообщений, запуск через polling.

Выбрать библиотеку

Писать запросы к Bot API руками не нужно - есть библиотеки, которые берут на себя получение update и маршрутизацию.

  • Python: aiogram (современная, async) или python-telegram-bot.
  • Node: grammY (лёгкая, современная) или telegraf.

Ниже один и тот же бот на двух стеках. Выбирайте тот язык, который вам ближе.

Вариант Python (aiogram)

Установка:

pip install aiogram

Файл bot.py:

import asyncio
import os

from aiogram import Bot, Dispatcher
from aiogram.filters import CommandStart
from aiogram.types import Message

# Токен читаем из окружения, не из кода
bot = Bot(token=os.environ["BOT_TOKEN"])
dp = Dispatcher()


@dp.message(CommandStart())
async def on_start(message: Message) -> None:
    await message.answer("Привет. Я echo-бот. Напиши что-нибудь.")


@dp.message()
async def echo(message: Message) -> None:
    await message.answer(message.text or "Я понимаю только текст.")


async def main() -> None:
    # Long polling: бот сам опрашивает Telegram
    await dp.start_polling(bot)


if __name__ == "__main__":
    asyncio.run(main())

Запуск (токен передаём через окружение):

BOT_TOKEN=123456789:AAExampleToken python bot.py

Вариант Node (grammY)

Установка:

npm install grammy

Файл bot.js:

import { Bot } from "grammy";

// Токен читаем из окружения, не из кода
const bot = new Bot(process.env.BOT_TOKEN);

bot.command("start", (ctx) =>
  ctx.reply("Привет. Я echo-бот. Напиши что-нибудь."),
);

bot.on("message:text", (ctx) => ctx.reply(ctx.message.text));

// Long polling: бот сам опрашивает Telegram
bot.start();

Запуск:

BOT_TOKEN=123456789:AAExampleToken node bot.js

Проверка

Откройте чат с ботом по ссылке t.me/<username>, нажмите Start. Бот ответит на /start, дальше повторит любое ваше сообщение. Если ответа нет - проверьте, что токен задан верно и скрипт запущен и не завершился с ошибкой.