Телеграм-бот на Python за вечер: первый бот на aiogram 3
Автор: Daniel academy · 23 июля 2026 г. · wc: ~5 мин

Про Telegram-ботов написано столько, что можно утонуть. Беда в том, что половина этих текстов пересказывает официальную документацию своими словами, а вторая половина обрывается ровно там, где становится интересно. Ты копируешь код, он даже запускается, а потом остаёшься один на один с вопросом «а дальше-то что».
Давай по-другому. За этот вечер ты соберёшь живого бота на Python, который отвечает на команды и кнопки, поймёшь, что делает каждая строчка, и увидишь честную карту: где легко, а где начинается настоящая инженерия.
Одно условие. Совсем с нуля Python по ходу дела не выучить: если переменные и функции для тебя пока тёмный лес, отложи ботов на неделю и начни с бесплатного курса по Python с нуля. Вернёшься подготовленным, и всё, что ниже, ляжет само.
Что понадобится
Немного:
- Python 3.11 или новее. Проверить:
python --version. - Аккаунт в Telegram.
- Пятнадцать свободных минут и желание, чтобы что-то заработало сегодня.
Никаких серверов, доменов и облаков пока не нужно. Бот будет жить у тебя на ноутбуке, и этого хватит, чтобы всё попробовать.
Токен: знакомимся с BotFather
У каждого бота есть тот, кто его регистрирует, и это не ты напрямую, а специальный бот по имени BotFather. Звучит забавно, работает буднично.
- Открой Telegram и найди
@BotFather(у него синяя галочка, не перепутай с двойниками). - Отправь ему
/newbot. - Придумай боту имя (его видят люди) и username (обязательно заканчивается на
bot, напримерvecher_test_bot). - В ответ прилетит строка вида
123456789:AAeR7.... Это и есть токен.
Относись к токену как к паролю. Кто им владеет, тот управляет ботом. Не выкладывай его в GitHub и не показывай на скриншотах. Если случайно засветил, зайди в @BotFather, набери /mybots, выбери своего бота, открой API Token и нажми «Revoke current token». Старый токен умрёт, ты получишь новый.
Минимальный бот, который правда работает
Ставим библиотеку. aiogram это самый живой и современный фреймворк для ботов на Python, и мы берём его третью версию:
pip install aiogram
Создай файл bot.py и положи в него вот это:
import asyncio
from aiogram import Bot, Dispatcher
from aiogram.filters import CommandStart
from aiogram.types import Message
TOKEN = "сюда_вставь_свой_токен"
dp = Dispatcher()
@dp.message(CommandStart())
async def start(message: Message) -> None:
await message.answer("Привет. Я живой. Напиши мне что-нибудь.")
@dp.message()
async def echo(message: Message) -> None:
await message.answer(f"Ты написал: {message.text}")
async def main() -> None:
bot = Bot(TOKEN)
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())
Запусти командой python bot.py, открой своего бота в Telegram, нажми Start и напиши пару сообщений. Он отвечает. Поздравляю, это уже настоящий бот.
Теперь разберём, что здесь происходит, потому что копировать без понимания смысла мало.
Dispatcher это диспетчер: он смотрит на входящие сообщения и решает, какой функции их отдать. Функции с декоратором @dp.message(...) называются хендлерами, то есть обработчиками. Первый ловит команду /start, второй ловит вообще всё остальное и возвращает текст обратно.
Слова async и await пугают новичков зря. Бот почти всё время ничего не делает, он ждёт сообщений от множества людей сразу. Асинхронность это способ ждать много всего одновременно, не поднимая под каждого отдельный поток. Пока достаточно запомнить правило: любой поход в Telegram пишем через await.
start_polling это опрос: бот в цикле спрашивает у Telegram «есть что-нибудь новое?» и обрабатывает то, что пришло. Для старта идеально, настраивать ничего не надо.
Добавим кнопки
Текст это хорошо, но живого бота делают кнопки. Заменим хендлер /start на такой и добавим к нему обработчик нажатия:
from aiogram import F
from aiogram.types import (
CallbackQuery,
InlineKeyboardButton,
InlineKeyboardMarkup,
)
@dp.message(CommandStart())
async def start(message: Message) -> None:
keyboard = InlineKeyboardMarkup(
inline_keyboard=[
[InlineKeyboardButton(text="Расскажи о себе", callback_data="about")]
]
)
await message.answer("Привет. Нажми на кнопку.", reply_markup=keyboard)
@dp.callback_query(F.data == "about")
async def about(callback: CallbackQuery) -> None:
await callback.message.answer("Я бот, которого ты написал за вечер. Неплохо для начала.")
await callback.answer()
Появилась новая вещь: callback_query. Когда человек жмёт на inline-кнопку, Telegram присылает не сообщение, а callback с данными, которые мы зашили в callback_data. Мы ловим его отдельным хендлером. Маленький await callback.answer() в конце убирает у пользователя крутящиеся часики. Забудешь его, и кнопка будет выглядеть зависшей. Это первая классическая грабля, на которую наступают все.
Где заканчивается вечер и начинается работа
Вот честный момент, ради которого стоило всё затевать. То, что ты собрал, отвечает на сообщения, но ничего не помнит. А почти любой полезный бот это диалог с памятью: записать на занятие, оформить заказ, провести опрос по шагам. Для этого нужно состояние (по-английски FSM, конечный автомат): бот должен помнить, что минуту назад он спросил твоё имя и теперь ждёт именно имя, а не случайный текст.
Дальше по нарастающей идёт то, что отличает игрушку от продукта:
- Состояние и сценарии. Бот ведёт человека по шагам и не путается, даже если тот отвечает невпопад.
- База данных. Чтобы данные пережили перезапуск, их надо где-то хранить.
- Роутеры и структура. Один файл на весь бот превращается в кашу быстрее, чем кажется, поэтому код разносят по роутерам.
- Деплой. Пока ноутбук закрыт, бот мёртв. Чтобы он работал круглосуточно, нужен сервер, а polling рано или поздно меняют на webhook.
- Нагрузка. Одно дело ты и три друга, другое дело пять тысяч человек в одну минуту.
Ни один из этих пунктов не страшен сам по себе. Страшно другое: собирать их по обрывкам статей, где каждая написана под свою версию библиотеки и половина уже устарела.
Если хочется пройти весь путь по порядку, от первого хендлера до бота, который живёт в проде и не падает, у нас есть курс по Telegram-ботам на aiogram 3. Он собран так, как объясняют новому разработчику в команде: через код, через типичные грабли и через вопрос «а что будет, когда пользователей станет много». Каждая тема заканчивается практикой, которую тренажёр проверяет сразу после запуска.
А сегодня закрой ноутбук с ощущением, что вечер прошёл не зря. У тебя есть работающий бот, и ты понимаешь, почему он работает. Это заметно больше, чем уносит из среднего туториала девять человек из десяти.