Python
Как написать бота в Telegram на Python: первый бот на aiogram
Чтобы написать Telegram-бота на Python, нужно создать бота в BotFather, получить токен, установить библиотеку aiogram, написать обработчик команды /start и запустить бота в режиме polling. После этого бот сможет отвечать на сообщения прямо в Telegram
Для первого проекта лучше не начинать с базы данных, оплаты и сложных кнопок. Сначала нужно получить работающий минимум: пользователь пишет /start, бот отвечает, пользователь пишет текст, бот повторяет или обрабатывает сообщение
Что понадобится перед стартом
Подготовьте
- установленный Python
- редактор кода, например VS Code или PyCharm
- аккаунт Telegram
- бота, созданного через BotFather
- отдельную папку проекта
- виртуальное окружение
Создайте папку проекта
mkdir telegram-bot
cd telegram-bot
Создайте виртуальное окружение
python -m venv .venv
Активируйте его на macOS или Linux
source .venv/bin/activate
.venv\Scripts\Activate.ps1
Создайте бота в BotFather
В Telegram найдите @BotFather и выполните команду /newbot. BotFather попросит указать имя бота и username, который должен заканчиваться на bot
После создания BotFather выдаст токен. Он выглядит примерно так
1234567890:AAExampleSecretToken
Этот токен нельзя публиковать. Через него любой человек сможет управлять вашим ботом
Установите aiogram
В активированном виртуальном окружении выполните
python -m pip install aiogram
Проверьте установку
python -m pip show aiogram
Если пакет установлен, можно писать первый файл
Первый файл bot.py
Создайте файл bot.py
import asyncio
import os
from aiogram import Bot, Dispatcher
from aiogram.filters import Command
from aiogram.types import Message
BOT_TOKEN = os.getenv("BOT_TOKEN")
dp = Dispatcher()
@dp.message(Command("start"))
async def start_handler(message: Message):
await message.answer("Привет! Я первый бот на Python")
@dp.message()
async def echo_handler(message: Message):
await message.answer(f"Вы написали: {message.text}")
async def main():
bot = Bot(token=BOT_TOKEN)
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())
Этот код делает две вещи: отвечает на команду /start и повторяет обычные сообщения пользователя
Как передать токен безопасно
Не вставляйте токен прямо в код. Для учебного запуска используйте переменную окружения
macOS или Linux
export BOT_TOKEN="ваш_токен_из_BotFather"
python bot.py
$env:BOT_TOKEN="ваш_токен_из_BotFather"
python bot.py
Если вы все-таки вставили токен в код и отправили файл кому-то, токен лучше перевыпустить в BotFather
Как понять, что бот работает
После запуска python bot.py программа не должна сразу завершаться. Она будет ждать обновления от Telegram
Откройте своего бота в Telegram и отправьте /start. Если все настроено правильно, бот ответит
Привет! Я первый бот на Python
После этого отправьте любой текст. Бот должен ответить
Вы написали: ваш текст
Если бот молчит, проверьте токен, интернет, установленную библиотеку и то, что файл действительно запущен
Что такое polling
В примере используется polling. Это режим, когда ваш Python-скрипт сам регулярно спрашивает Telegram: «Есть новые сообщения?»
Для учебного бота polling удобен, потому что не нужен сервер с HTTPS и webhook. Вы запускаете файл на компьютере, бот работает, закрываете терминал — бот перестает отвечать
Для рабочего бота на сервере часто используют webhook, но новичку лучше сначала освоить polling
Как добавить команду help
Добавим команду /help
@dp.message(Command("help"))
async def help_handler(message: Message):
await message.answer("Доступные команды: /start, /help")
Разместите этот обработчик рядом с /start, до общего обработчика сообщений. Общий обработчик @dp.message() ловит все, что не поймали более конкретные обработчики
Как не запутаться в структуре
Для первого бота достаточно одного файла. Когда логики станет больше, проект можно разделить
telegram-bot/
bot.py
handlers.py
config.py
.venv/
Но не делите проект слишком рано. Сначала сделайте рабочую версию в одном файле, затем выносите обработчики и настройки в отдельные модули
Частые ошибки
Токен вставлен с пробелом или кавычками не там
Если переменная окружения задана неверно, BOT_TOKEN будет пустым или неправильным. Проверьте, что значение передается без лишних символов
Файл запускается не из активного окружения
Если aiogram установлен, но Python пишет ModuleNotFoundError, возможно, вы запускаете другой Python
Бот не отвечает после закрытия терминала
Это нормально. Пока бот работает локально через polling, процесс должен быть запущен
Общий обработчик стоит раньше команд
Если порядок и фильтры настроены плохо, общий обработчик может мешать более точным сценариям. В простом коде держите команды выше общего обработчика
Мини-практика
Добавьте команду /about, которая отвечает коротким текстом о боте
@dp.message(Command("about"))
async def about_handler(message: Message):
await message.answer("Я учебный бот на Python и aiogram")
После этого измените echo-обработчик так, чтобы бот отвечал только на текстовые сообщения, а не на фото и стикеры. Так вы начнете понимать фильтры и типы сообщений
Что почитать дальше по Python
Если нужен общий маршрут по теме, откройте рубрику Python. Для соседних задач пригодятся эти разборы:
- Создание Telegram бота с ChatGPT на Python: пошаговое руководство для начинающих
- Как научиться писать код на Python: путь от первых строк до самостоятельных программ
- Как округлить число в Питоне до целого: round, int, floor и ceil
- Как подключить HTML к Python через Flask: первый шаблон и обработка формы