Чтобы запустить Telegram-бота на Python, создайте его через @BotFather, сохраните токен в переменной окружения, установите python-telegram-bot и подключите обработчики команд к Application. Соберём бота с командами /start и /help, ответом на обычный текст и понятной диагностикой. Токен в исходный код вставлять не будем.
Telegram-бот состоит из двух частей. Telegram хранит аккаунт бота и пересылает события через Bot API. Ваша Python-программа получает эти события, выбирает обработчик и отправляет ответ. Если программа остановлена, логика тоже не работает, даже если сам бот по-прежнему виден в Telegram.
BotFather выдаёт username и секретный токен для Bot API.
Команды и сообщения попадают в отдельные async-функции Python.
Программа регулярно получает новые updates и отвечает пользователю.
Как Telegram, Bot API и Python связаны между собой
Пользователь пишет не вашей программе напрямую. Сообщение сначала приходит на серверы Telegram и превращается в объект Update. Библиотека python-telegram-bot получает update, передаёт его подходящему handler и отправляет ответ обратно через Bot API.
| Часть | За что отвечает | Что вы настраиваете |
|---|---|---|
| @BotFather | Создание и параметры аккаунта бота | Имя, username, команды, новый токен |
| Bot API | Обмен updates и сообщениями по HTTPS | Токен авторизации и вызываемые методы |
| Python-программа | Логика ответов | Handlers, данные, проверки, запуск |
| Polling | Получение новых updates циклом | Работает, пока запущен процесс |
BotFather не пишет код и не запускает его. Он только создаёт бот-аккаунт и выдаёт ключ, с которым ваша программа обращается к Telegram.

Ответ появляется только после того, как запущенная программа обработает update.
Создаём бота через BotFather и сохраняем токен
- Откройте в Telegram официальный аккаунт
@BotFatherс синей галочкой и отправьте команду/newbot. - Введите отображаемое имя, затем уникальный username латиницей. Обычный username бота заканчивается на
bot, напримерstudy_helper_bot. - Скопируйте полученный токен в менеджер паролей. Не отправляйте его в чат, не показывайте на скриншоте и не добавляйте в Git.
- Если токен уже попал в публичное место, отзовите его через BotFather и выпустите новый. Удалить строку из последнего коммита недостаточно.
Создайте папку проекта и виртуальное окружение. На Windows команды удобно выполнять в PowerShell; на macOS и Linux отличается только команда активации.
mkdir telegram-bot
cd telegram-bot
py -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install python-telegram-bot
$env:TELEGRAM_BOT_TOKEN="ВСТАВЬТЕ_ТОКЕН_ТОЛЬКО_ЗДЕСЬ"В macOS или Linux окружение включается командой source .venv/bin/activate, а переменная задаётся как export TELEGRAM_BOT_TOKEN="...". Значение существует только в текущем окне терминала, что удобно для первого безопасного запуска.

Токен даёт полный контроль над ботом, поэтому его отделяют от файлов проекта.
.venv, команда python -m pip show python-telegram-bot выводит пакет, а токен сохранён вне bot.py.Пишем команды start, help и ответ на текст
Создайте файл bot.py. В актуальном интерфейсе библиотеки обработчики асинхронные: перед ними стоит async def, а отправка сообщения вызывается через await. CommandHandler ловит команды, MessageHandler отбирает обычный текст.
import os
from telegram import Update
from telegram.ext import (
Application,
CommandHandler,
ContextTypes,
MessageHandler,
filters,
)
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
user = update.effective_user
name = user.first_name if user else "друг"
await update.message.reply_text(
f"Привет, {name}! Напишите сообщение, и я его повторю."
)
async def help_command(
update: Update, context: ContextTypes.DEFAULT_TYPE
) -> None:
await update.message.reply_text("Команды: /start и /help")
async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
await update.message.reply_text(f"Вы написали: {update.message.text}")
def main() -> None:
token = os.environ.get("TELEGRAM_BOT_TOKEN")
if not token:
raise RuntimeError("Не задана переменная TELEGRAM_BOT_TOKEN")
app = Application.builder().token(token).build()
app.add_handler(CommandHandler("start", start))
app.add_handler(CommandHandler("help", help_command))
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo))
print("Бот запущен. Для остановки нажмите Ctrl+C.")
app.run_polling(allowed_updates=Update.ALL_TYPES)
if __name__ == "__main__":
main()Application.builder().token(token).build()создаёт приложение с вашим ботом.- Обработчики проверяются по порядку и получают объект
Updateс данными события. - Фильтр
filters.TEXT & ~filters.COMMANDозначает «текст, но не команда». - Проверка переменной окружения останавливает программу с понятной ошибкой вместо неясного сетевого сбоя.
Если импорты, функции и окружение пока непривычны, пройдите первые упражнения курса Python. Отдельный маршрут для команд и обработчиков есть в курсе по Telegram-ботам.
Запускаем бота и проверяем полный путь сообщения
- В том же терминале с заданным токеном выполните
python bot.py. - Откройте своего бота по username, нажмите Start или отправьте
/start. - Отправьте
/help, затем обычный текст, напримерпроверка. - Убедитесь, что пришли три разных ответа. Остановите процесс сочетанием
Ctrl+C.
- Команда
/startприветствует пользователя по имени. - Команда
/helpпоказывает две доступные команды. - Обычное сообщение возвращается с префиксом «Вы написали».
- После
Ctrl+Cбот перестаёт отвечать, потому что локальный polling остановлен.

Handler срабатывает только для того типа update, под который зарегистрирован.
Почему Telegram-бот не отвечает
Читайте первую ошибку в терминале и проверяйте цепочку сверху вниз: запущен ли процесс, есть ли токен, доступна ли сеть, зарегистрирован ли handler. Не меняйте одновременно код, токен и библиотеку: так невозможно понять, что именно помогло.
Переменная создавалась в другом окне терминала или под другим именем. Задайте TELEGRAM_BOT_TOKEN и запустите Python в том же окне.
Токен скопирован не полностью, отозван или содержит лишний пробел. Выпустите новый через BotFather, если старый мог утечь.
Тот же токен уже использует второй запущенный polling-процесс. Остановите старую копию бота и оставьте одну.
Проверьте порядок handlers и фильтр ~filters.COMMAND. Имя команды в CommandHandler пишется без символа /.
requirements.txt, команды отвечают отдельно от текста, ошибки видны в терминале, а бот корректно завершается через Ctrl+C. Для работы круглосуточно следующим шагом нужен постоянно запущенный сервер или платформа размещения.Как создать Telegram-бота на Python?
Создайте бот-аккаунт командой /newbot у @BotFather, установите библиотеку, передайте токен в Application, зарегистрируйте handlers и запустите run_polling().
Почему нельзя хранить токен в bot.py?
Любой, кто увидит токен, сможет управлять ботом через Bot API. Храните его в переменной окружения или секрет-хранилище и немедленно отзывайте после утечки.
Нужно ли держать компьютер включённым?
При локальном polling программа отвечает только пока компьютер, интернет и процесс Python работают. Для режима 24/7 код размещают на постоянно работающем сервере.
Чем polling отличается от webhook?
При polling программа сама запрашивает updates. При webhook Telegram отправляет их на ваш публичный HTTPS-адрес. Для первого локального проекта polling проще.
Может ли бот написать пользователю первым?
Обычный бот не начинает личный диалог сам. Пользователь сначала должен открыть чат и отправить сообщение или добавить бота в группу.
Если установка пакета не проходит, используйте разбор ошибки pip в Windows. Если Python не видит уже установленную библиотеку, проверьте окружение по статье No module named.
После echo-версии добавьте кнопки, состояние диалога и хранение данных. Для запросов к стороннему сервису пригодится материал про API в Python. В Кодике можно сначала отладить каждую функцию отдельно, а затем подключить её к Telegram handler.
