Разработка Telegram-ботов с нуля на Python

Практический курс по созданию функциональных чат-ботов для Telegram. Вы изучите работу с API, библиотеку aiogram, базы данных и научитесь размещать ботов на сервере.

1. Введение в Telegram Bot API и регистрация первого бота через BotFather

Введение в Telegram Bot API и регистрация первого бота через BotFather

Добро пожаловать в курс «Разработка Telegram-ботов с нуля на Python»! Это первая статья, с которой начнется ваше погружение в мир автоматизации, чат-ботов и программирования интерактивных интерфейсов внутри одного из самых популярных мессенджеров в мире.

Сегодня мы не будем писать сложный код, но мы заложим фундамент, без которого работа невозможна. Мы разберемся, как устроены боты «под капотом», что такое API, и зарегистрируем вашего первого цифрового помощника.

Что такое Telegram-бот?

Telegram-бот — это специальный аккаунт в Telegram, который управляется не человеком, а программой. Пользователи могут взаимодействовать с ботом, отправляя ему сообщения, команды и встроенные запросы. В ответ бот может отправлять текст, изображения, видео, файлы или даже создавать интерактивные кнопки и меню.

Боты используются повсеместно:

* Бизнес: автоматизация поддержки клиентов, интернет-магазины внутри чата. * Утилиты: конвертеры валют, напоминания, погодные информеры. * Развлечения: игры, викторины, генерация мемов. * Администрирование: модерация чатов, сбор статистики.

Но где «живет» бот? Важно понимать, что сам бот (программный код) не находится на серверах Telegram. Он работает на вашем компьютере или арендованном сервере, а Telegram выступает лишь связующим звеном между пользователем и вашей программой.

!Схема архитектуры работы Telegram-бота: пользователь общается с сервером Telegram, а сервер передает данные вашей программе.

Понятие Telegram Bot API

Чтобы ваша программа на Python могла «общаться» с серверами Telegram, используется API (Application Programming Interface — программный интерфейс приложения).

Представьте, что вы пришли в ресторан. Вы (ваша программа) хотите заказать еду (отправить сообщение пользователю), но вы не можете зайти на кухню (сервер Telegram) и приготовить её сами. Вам нужен официант, который примет заказ, отнесет его на кухню и вернет результат. В данном случае API — это и есть тот самый официант.

Telegram Bot API — это набор правил и команд, основанный на HTTP-запросах. Вся коммуникация происходит по следующему принципу:

  • Пользователь пишет боту «Привет».
  • Приложение Telegram отправляет это сообщение на сервер Telegram.
  • Сервер Telegram «упаковывает» это сообщение в специальный формат (обычно JSON) и ждет, пока ваша программа его заберет (или сам отправляет его вам, если настроен Webhook).
  • Ваша программа получает информацию: «Пользователь ID 12345 написал 'Привет'».
  • Ваша программа формирует ответ и отправляет специальный запрос обратно в Telegram: «Отправь пользователю ID 12345 текст 'Здравствуй!'».
  • Telegram доставляет сообщение пользователю.
  • В этом курсе мы будем использовать библиотеку Python, которая берет на себя всю рутинную работу по формированию этих запросов, но понимание сути процесса критически важно для отладки.

    BotFather: Отец всех ботов

    В Telegram существует уникальная система создания ботов. Вам не нужно заполнять формы на сайте разработчиков. Регистрация происходит прямо внутри мессенджера через главного бота — BotFather.

    BotFather — это официальный бот Telegram, который управляет всеми другими ботами. Через него вы создаете новые аккаунты ботов, настраиваете их описание, аватарки и получаете ключи доступа.

    Пошаговая регистрация бота

    Давайте создадим вашего первого бота прямо сейчас. Следуйте инструкции:

  • Поиск BotFather:
  • Откройте Telegram и в строке поиска введите @BotFather. Убедитесь, что у бота стоит синяя галочка верификации. Остерегайтесь подделок — официальный бот называется именно так, без лишних символов.

  • Запуск:
  • Нажмите кнопку Start (или «Запустить») внизу экрана. Бот пришлет вам список доступных команд.

  • Создание нового бота:
  • Отправьте команду: BotFather попросит вас придумать имя для нового бота.

  • Выбор имени (Name):
  • BotFather спросит: "Alright, a new bot. How are we going to call it? Please choose a name for your bot." Это имя, которое будет отображаться в списке контактов и заголовке чата. Оно может быть на любом языке, содержать пробелы и эмодзи. Например: Мой Первый Бот 🤖. Введите имя и отправьте сообщение.

  • Выбор юзернейма (Username):
  • Теперь BotFather попросит: "Good. Now let's choose a username for your bot." Это техническое имя, по которому бота можно будет найти через поиск (ссылка вида t.me/username). Правила для юзернейма: * Только латинские буквы, цифры и подчеркивания. * Должен быть уникальным (никто другой не должен его занимать). * Обязательно должен заканчиваться на слово bot. Например: TetrisBot или tetris_bot.

    Если имя занято, BotFather сообщит об этом ("Sorry, this username is already taken"). Попробуйте другое, добавив цифры или изменив название.

  • Получение токена:
  • Если все прошло успешно, BotFather поздравит вас и пришлет длинное сообщение, содержащее API Token.

    !Пример успешного диалога с BotFather при создании нового бота.

    Что такое API Token и почему он важен?

    В финальном сообщении от BotFather вы увидите строку вида: 123456789:ABCdefGHIjklMNOpqrsTUVwxyz

    Это и есть ваш API Token (токен). Это самая важная часть регистрации.

    > Токен — это ключ от вашего бота. Любой, у кого есть этот токен, может управлять вашим ботом: читать сообщения пользователей и отвечать от имени бота.

    Правила безопасности при работе с токеном:

  • Никогда не передавайте токен посторонним.
  • Не публикуйте токен в открытом доступе. Если вы выкладываете код на GitHub, убедитесь, что токен не прописан в коде напрямую (в следующих уроках мы научимся прятать его в переменные окружения).
  • Если токен скомпрометирован: Если вы случайно показали токен кому-то, немедленно зайдите в BotFather, отправьте команду /mybots, выберите своего бота, нажмите API Token -> Revoke current token. Старый токен перестанет работать, и вы получите новый.
  • Базовая настройка профиля бота

    Пока ваш бот выглядит «пустым»: у него нет аватарки и описания. Давайте это исправим, чтобы пользователи понимали, для чего он нужен.

    Все настройки также производятся через BotFather. Введите команду /mybots и выберите вашего бота из списка. Появится меню с кнопкой Edit Bot.

    Основные элементы оформления:

    | Элемент | Команда BotFather | Где отображается | Для чего нужно | | :--- | :--- | :--- | :--- | | Botpic | /setuserpic | Аватарка в списке чатов | Визуальная узнаваемость бренда или функции. | | Description | /setdescription | Текст, который виден до нажатия кнопки «Start» | Объясняет новому пользователю, что умеет бот. | | About | /setabouttext | В профиле бота (информация) | Краткое описание или ссылка на сайт. | | Commands | /setcommands | Меню команд (кнопка «Menu») | Подсказки для быстрой навигации. |

    Попробуйте установить аватарку для вашего бота прямо сейчас. Нажмите Edit Botpic и просто отправьте BotFather любую картинку как обычное изображение.

    Как проверить, работает ли бот?

    На данном этапе, если вы найдете своего бота в поиске по юзернейму и нажмете «Запустить», ничего не произойдет. Сообщения будут уходить, но бот будет молчать.

    Это нормально. Мы зарегистрировали «учетную запись», но еще не подключили к ней «мозги» — нашу Python-программу. Сервера Telegram принимают сообщения от вас, но им некуда их переслать, так как ваш скрипт еще не запущен.

    Резюме

    В этой статье мы сделали первый и самый важный шаг:

  • Разобрались, что бот — это код, работающий на стороннем сервере и общающийся с Telegram через API.
  • Познакомились с BotFather — главным инструментом управления ботами.
  • Зарегистрировали бота, получили его Username и API Token.
  • Узнали о правилах безопасности при работе с токеном.
  • Сохраните ваш токен в надежном месте (например, в менеджере паролей или временном текстовом файле на локальном компьютере). В следующей статье мы установим Python, настроим рабочее окружение и напишем первые строки кода, которые заставят вашего бота ожить и ответить на приветствие.

    2. Настройка окружения и создание простейшего эхо-бота на Python с библиотекой aiogram

    Настройка окружения и создание простейшего эхо-бота на Python с библиотекой aiogram

    В предыдущей статье мы успешно зарегистрировали бота через BotFather и получили заветный токен. Теперь у нас есть «тело» бота на серверах Telegram, но у него пока нет «мозга». В этой статье мы вдохнем в него жизнь: настроим рабочее окружение, установим необходимые библиотеки и напишем код, который научит бота отвечать на сообщения.

    Мы будем использовать библиотеку aiogram. Это современный, асинхронный и мощный фреймворк для создания Telegram-ботов на Python. Почему именно он? Потому что он быстр, активно поддерживается сообществом и позволяет легко масштабировать проекты от простых эхо-ботов до сложных магазинов.

    Шаг 1: Подготовка Python и виртуального окружения

    Прежде чем писать код, нужно подготовить фундамент. Если у вас еще не установлен Python, скачайте последнюю версию с официального сайта Python. Для работы с aiogram версии 3.x нам потребуется Python версии 3.8 или выше.

    Зачем нужно виртуальное окружение?

    Представьте, что вы строите дом. Для одного дома вам нужны кирпичи и цемент, а для другого — дерево и гвозди. Если свалить все материалы в одну кучу, начнется хаос. В программировании так же: разные проекты могут требовать разные версии библиотек.

    Виртуальное окружение (Virtual Environment) — это изолированная папка, в которую устанавливаются библиотеки только для конкретного проекта. Это «ящик с инструментами», собранный специально под текущую задачу.

    Создание виртуального окружения

  • Создайте папку для вашего проекта, например my_first_bot.
  • Откройте терминал (командную строку) и перейдите в эту папку.
  • Выполните команду для создания окружения:
  • * Windows: * macOS / Linux:

    После выполнения команды в папке проекта появится директория venv.

    Активация окружения

    Теперь нужно сказать системе: «Я хочу использовать именно этот ящик с инструментами».

    * Windows: * macOS / Linux:

    Если все прошло успешно, в начале строки терминала появится надпись (venv).

    Шаг 2: Установка библиотек

    Теперь, находясь внутри активированного окружения, установим aiogram. Также нам понадобится библиотека python-dotenv для безопасного хранения токена (об этом чуть ниже).

    Введите в терминале:

    Дождитесь окончания установки. Теперь мы готовы писать код.

    Шаг 3: Безопасность превыше всего

    В прошлой лекции мы говорили, что токен нельзя показывать посторонним. Если вы напишете токен прямо в коде (например, TOKEN = "123:ABC..."), и этот код попадет в интернет, вашего бота могут украсть.

    Профессиональный стандарт — хранить секретные данные в переменных окружения. Для этого мы создадим специальный файл .env.

  • В папке проекта создайте файл с именем .env (без названия, только расширение).
  • Откройте его любым текстовым редактором и напишите:
  • Важно: не используйте кавычки и пробелы вокруг знака равенства.

    Шаг 4: Пишем код эхо-бота

    Создайте файл main.py. Это будет точка входа в нашу программу. Мы напишем простейшего эхо-бота — программу, которая присылает пользователю в ответ тот же текст, что он отправил.

    [VISUALIZATION: Схема работы эхо-бота. Слева иконка пользователя, справа иконка сервера с кодом Python. Стрелка от пользователя к серверу с текстом

    3. Интерактивность: работа с текстовыми командами, Inline-кнопками и Reply-клавиатурами

    Интерактивность: работа с текстовыми командами, Inline-кнопками и Reply-клавиатурами

    Добро пожаловать в третью часть курса «Разработка Telegram-ботов с нуля на Python»! В предыдущих уроках мы научились регистрировать бота и создали простого «эхо-бота», который повторяет всё, что ему пишут. Это забавно, но бесполезно. Настоящая сила ботов раскрывается, когда они начинают понимать намерения пользователя и предлагают удобные инструменты для взаимодействия.

    Сегодня мы превратим вашего бота из попугая в полноценного собеседника. Мы разберем три кита интерактивности:

  • Команды — специальные ключевые слова для запуска функций.
  • Reply-клавиатуры — кнопки, заменяющие клавиатуру телефона.
  • Inline-клавиатуры — кнопки, встроенные прямо в сообщения.
  • Обработка команд: больше, чем просто текст

    Вы наверняка замечали, что общение с любым ботом начинается с команды /start. В Telegram команда — это строка, начинающаяся со слэша /. Для бота это сигнал: «Эй, выполни конкретное действие!».

    В библиотеке aiogram для обработки команд используется специальный фильтр Command. Давайте улучшим наш код из прошлого урока, научив бота реагировать на /start и /help по-разному.

    Обновляем код бота

    Откройте ваш файл main.py. Нам понадобятся новые импорты. Вместо простой обработки текста мы добавим фильтры.

    Теперь, если пользователь напишет /start, сработает функция cmd_start. Если напишет любой обычный текст, бот промолчит (если мы удалили эхо-хэндлер) или ответит эхом (если оставили).

    Reply-клавиатуры: Удобное меню

    Заставлять пользователя постоянно вводить команды вручную (/settings, /profile) — плохая практика. Это неудобно, особенно на мобильных устройствах. Здесь на помощь приходят Reply-клавиатуры.

    Reply-клавиатура — это набор кнопок, который появляется внизу экрана вместо обычной буквенной клавиатуры пользователя.

    !Reply-клавиатура заменяет стандартную клавиатуру ввода текста.

    Создание Reply-кнопок

    В aiogram за это отвечают классы ReplyKeyboardMarkup (сама клавиатура) и KeyboardButton (кнопка). Давайте создадим простое меню.

    Обратите внимание на параметр resize_keyboard=True. Если его не указать, кнопки будут огромными, занимая половину экрана. Этот параметр делает их аккуратными и компактными.

    Как обрабатывать нажатия?

    Важно понимать: нажатие на Reply-кнопку просто отправляет текст, написанный на ней, в чат. Для бота это выглядит так, будто пользователь вручную набрал слово «Меню».

    Поэтому для обработки нажатия мы используем обычный фильтр текста. В aiogram 3.x для этого удобно использовать «магический фильтр» F.

    Inline-клавиатуры: Кнопки внутри сообщений

    Если Reply-клавиатура — это глобальный пульт управления, то Inline-клавиатура привязана к конкретному сообщению. Кнопки находятся прямо под текстом («в линии» с контентом).

    !Inline-кнопки прикреплены к конкретному сообщению и не исчезают при прокрутке чата.

    Inline-кнопки бывают двух основных типов:

  • URL-кнопки: перекидывают пользователя на сайт.
  • Callback-кнопки: отправляют скрытый сигнал боту для выполнения действия без отправки сообщения в чат.
  • Создание Inline-кнопок

    Используем классы InlineKeyboardMarkup и InlineKeyboardButton.

    Магия Callback-запросов

    Когда пользователь нажимает на кнопку «Связаться», в чат не отправляется сообщение. Вместо этого Telegram отправляет вашему боту специальный объект — CallbackQuery. Внутри него скрыта строка, которую мы указали в callback_data (в примере выше — "contact_manager").

    Это позволяет создавать интерфейсы, которые не засоряют переписку. Чтобы поймать это нажатие, нужен специальный декоратор @dp.callback_query.

    Метод callback.answer() важен. Он сообщает Telegram, что нажатие обработано. Если передать show_alert=True, пользователь увидит всплывающее окно с текстом.

    Reply или Inline: что выбрать?

    Новички часто путаются, когда использовать какой тип клавиатуры. Вот простая таблица для принятия решений:

    | Характеристика | Reply-клавиатура | Inline-клавиатура | | :--- | :--- | :--- | | Расположение | Вместо клавиатуры ввода | Под сообщением | | Срок жизни | Постоянная (пока не уберешь) | Привязана к контексту сообщения | | Действие | Отправляет текст в чат | Открывает ссылку или шлет сигнал (callback) | | Идеально для... | Главного меню, навигации, телефона | Карточек товаров, ссылок, голосований, действий с конкретным объектом |

    Специальные кнопки

    Telegram позволяет запрашивать у пользователя особые данные через Reply-кнопки, которые нельзя просто ввести текстом с той же легкостью:

    * Запрос контакта: KeyboardButton(text="Отправить номер", request_contact=True) * Запрос геолокации: KeyboardButton(text="Где я?", request_location=True)

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

    Резюме

    Сегодня мы сделали огромный шаг вперед. Ваш бот теперь умеет:

  • Понимать команды /start и /help.
  • Показывать удобное меню через Reply-кнопки.
  • Взаимодействовать с контентом через Inline-кнопки.
  • Обрабатывать скрытые нажатия через CallbackQuery.
  • В следующем уроке мы углубимся в архитектуру и узнаем, как управлять состоянием диалога (FSM), чтобы бот мог запоминать ответы пользователя и проводить его через сложные анкеты и опросы.

    4. Хранение данных: использование машины состояний (FSM) и подключение базы данных SQLite

    Хранение данных: использование машины состояний (FSM) и подключение базы данных SQLite

    Приветствую вас в четвертой части курса «Разработка Telegram-ботов с нуля на Python»! Мы уже научились регистрировать ботов, отправлять сообщения и создавать красивые кнопки. Но до сих пор наши боты страдали одной серьезной проблемой — у них была «память золотой рыбки».

    Бот не помнил, о чем вы говорили с ним минуту назад. Если вы нажимали кнопку, он реагировал, но не знал контекста. Сегодня мы это исправим. Мы превратим вашего бота в внимательного собеседника, который умеет запоминать ответы пользователя и сохранять их навсегда.

    В этой статье мы разберем две фундаментальные технологии:

  • FSM (Finite State Machine) — машина конечных состояний, которая позволяет вести диалог по сценарию.
  • SQLite — база данных для долгосрочного хранения информации.
  • Проблема контекста

    Представьте, что вы хотите создать бота для записи на стрижку. Диалог должен выглядеть так:

  • Бот: «Как вас зовут?»
  • Пользователь: «Иван»
  • Бот: «На какое время записать?»
  • Пользователь: «14:00»
  • Без специальных инструментов, когда пользователь пишет «14:00», бот просто видит текст «14:00». Он не знает, что это ответ на вопрос о времени, а не, например, количество яблок. Чтобы связать вопросы и ответы, нам нужно «состояние».

    Машина конечных состояний (FSM)

    FSM (Finite State Machine) — это модель программирования, где программа в любой момент времени находится в одном из определенных состояний. В зависимости от текущего состояния, бот по-разному реагирует на одни и те же сообщения.

    В библиотеке aiogram поддержка FSM встроена и очень удобна. Она позволяет:

    * Назначить пользователю состояние (например, WaitingForName). * Сохранить временные данные в памяти (имя, возраст, телефон). * Переключать состояния по цепочке.

    !Схема перехода между состояниями в диалоге бота

    Реализация FSM в aiogram

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

    В файле main.py (или отдельном файле states.py) создадим класс состояний:

    Теперь напишем логику переключения. Нам понадобятся три функции-хэндлера:

  • Старт: Запускает процесс и переводит в первое состояние.
  • Имя: Ловит имя, сохраняет его и переводит во второе состояние.
  • Возраст: Ловит возраст, сохраняет его и завершает опрос.
  • #### Шаг 1: Запуск анкеты

    Обратите внимание на аргумент state: FSMContext. Именно через него мы управляем памятью конкретного пользователя.

    #### Шаг 2: Обработка имени

    Теперь нам нужен хэндлер, который сработает только если пользователь находится в состоянии waiting_for_name.

    Метод state.update_data() работает как словарь: мы можем положить туда любые данные по ключам.

    #### Шаг 3: Обработка возраста и финиш

    Теперь у нас есть рабочий диалог. Но есть нюанс: MemoryStorage (хранилище в памяти), которое используется по умолчанию, хранит данные в оперативной памяти (RAM). Если вы перезагрузите бота, все данные потеряются. Для надежности нам нужна база данных.

    База данных SQLite

    SQLite — это компактная реляционная база данных. В отличие от гигантов вроде PostgreSQL или MySQL, ей не нужен отдельный сервер. Вся база данных хранится в одном обычном файле на вашем компьютере.

    Это идеальный выбор для новичков и небольших проектов. Python имеет встроенную поддержку SQLite, так что ничего устанавливать не нужно.

    Основные понятия баз данных

    Представьте базу данных как набор таблиц Excel:

    * Таблица (Table): Лист, где хранятся данные об одном типе объектов (например, users). * Столбец (Column): Характеристика объекта (Имя, ID, Возраст). * Строка (Row): Конкретная запись (Иван, ID 123, 25 лет). * SQL (Structured Query Language): Язык запросов, на котором мы общаемся с базой.

    Подключение SQLite к боту

    Создадим файл database.py, чтобы отделить работу с базой от логики бота.

    Разберем ключевые команды:

    * connect: открывает «дверь» к файлу базы. * cursor: специальный объект, который выполняет команды и бегает по строкам таблицы. * execute: выполнить SQL-команду. * commit: сохранить изменения. Без этого данные не запишутся на диск.

    Интеграция базы данных в FSM

    Теперь вернемся в main.py и изменим последний шаг нашей анкеты (process_age). Вместо того чтобы просто выводить данные в чат, мы сохраним их в базу.

    Сначала импортируем нашу функцию:

    Обновленный хэндлер:

    Теперь, даже если вы выключите компьютер, данные о пользователе Иване останутся в файле my_bot_database.db.

    Просмотр данных

    Чтобы убедиться, что данные сохранились, вы можете использовать бесплатную программу DB Browser for SQLite. Просто откройте в ней файл вашей базы данных, перейдите во вкладку «Данные» и увидите таблицу со всеми записями.

    !Интерфейс программы для просмотра содержимого базы данных SQLite

    Резюме

    Сегодня мы сделали огромный шаг в развитии нашего бота:

  • Разобрались с FSM, научив бота запоминать контекст диалога и проводить опросы.
  • Познакомились с SQLite — простой и надежной базой данных.
  • Связали эти технологии, создав бота, который собирает информацию и сохраняет её на веки вечные.
  • В следующей статье мы научимся размещать нашего бота на удаленном сервере, чтобы он работал 24/7, даже когда ваш компьютер выключен.

    5. Запуск бота в продакшн: деплой на сервер, настройка Webhook и логирование

    Запуск бота в продакшн: деплой на сервер, настройка Webhook и логирование

    Поздравляю! Вы прошли долгий путь от регистрации бота в BotFather до создания сложной анкеты с базой данных. Ваш бот работает, он умен и полезен. Но есть одна проблема: он живет на вашем ноутбуке. Как только вы закроете крышку ноутбука или выключите Wi-Fi, бот «уснет» и перестанет отвечать пользователям.

    Чтобы бот был доступен 24/7, его нужно переселить в «облако» — на удаленный сервер. Этот процесс называется деплой (deployment). В этой финальной статье курса мы превратим ваш любительский проект в профессиональный сервис: настроим логирование, арендуем сервер, разберемся с Webhook и запустим бота в фоновом режиме.

    Почему print() — это плохо: Настраиваем логирование

    Во время разработки вы наверняка использовали функцию print(), чтобы смотреть, что происходит в коде. Например: print("Пользователь нажал кнопку"). В продакшене (реальной работе) это плохая практика.

    Почему print не подходит:

  • Нет структуры: Вы не видите время события и уровень его важности.
  • Нет сохранения: Если консоль закроется, вы потеряете историю ошибок.
  • Производительность: Частый вывод текста в консоль может замедлять работу.
  • Вместо этого мы будем использовать встроенную библиотеку logging.

    Настройка logging в aiogram

    Добавьте этот код в самое начало вашего файла main.py:

    Разберем параметры: * level=logging.INFO: Бот будет записывать все сообщения уровня INFO и выше (WARNING, ERROR). Отладочные сообщения (DEBUG) будут игнорироваться, чтобы не засорять логи. * format: Задает вид строки. Мы увидим время, уровень важности, имя модуля и само сообщение.

    Теперь в консоли вы будете видеть красивые системные сообщения от aiogram, а если захотите добавить свои, используйте:

    Polling vs Webhook: Как бот получает сообщения?

    Существует два способа доставки сообщений от серверов Telegram к вашей программе. До этого момента мы использовали Polling (поллинг).

    Long Polling (Длинный опрос)

    Представьте, что вы ждете важное письмо. Вы каждые 5 секунд подходите к почтовому ящику, открываете его и проверяете: «Есть письмо? Нет. А сейчас? Нет». Это и есть Polling.

    Ваша программа постоянно спрашивает Telegram: «Есть новые сообщения?». Это просто в настройке (работает даже с локального компьютера), но создает лишнюю нагрузку и небольшую задержку.

    Webhook (Вебхук)

    Теперь представьте, что вы попросили почтальона: «Как только придет письмо, позвони мне в дверь и вручи его». Вам не нужно бегать к ящику.

    При использовании Webhook вы сообщаете Telegram свой адрес (URL вашего сервера). Когда пользователь пишет боту, Telegram сам отправляет данные вашей программе.

    !Сравнение методов получения обновлений: активный опрос против уведомлений

    Когда что использовать?

    * Polling: Идеально для старта, тестирования и небольших ботов (до 1000-2000 пользователей). * Webhook: Необходим для высоконагруженных проектов, экономит ресурсы сервера и работает быстрее. Требует наличия «белого» IP-адреса и SSL-сертификата (https).

    Подготовка проекта к переезду

    Прежде чем покупать сервер, нужно подготовить код.

    1. Файл зависимостей

    На сервере не будет тех библиотек, которые вы устанавливали на своем компьютере. Чтобы не вспоминать их названия, создайте файл requirements.txt.

    В терминале вашего проекта выполните:

    В файле появится список всех библиотек (aiogram, aiosqlite и т.д.) с их версиями.

    2. Скрытие токена

    Убедитесь, что ваш токен не написан в коде напрямую. Он должен браться из переменных окружения или файла .env. Никогда не загружайте файл .env в публичные репозитории (GitHub/GitLab).

    Аренда сервера (VPS)

    Вам понадобится VPS (Virtual Private Server). Это удаленный компьютер, который работает круглосуточно.

  • Зарегистрируйтесь у любого хостинг-провайдера.
  • Выберите самую дешевую конфигурацию (обычно достаточно 1 CPU, 1 GB RAM).
  • В качестве операционной системы выберите Ubuntu 20.04 или 22.04.
  • После оплаты вы получите IP-адрес сервера и пароль от пользователя root.
  • Деплой бота: Пошаговая инструкция

    Мы рассмотрим деплой на примере метода Polling, так как он проще для первого раза и не требует настройки домена и SSL-сертификатов.

    Шаг 1: Подключение к серверу

    Откройте терминал (PowerShell в Windows или Terminal в macOS) и введите:

    Введите пароль (символы не будут отображаться при вводе).

    Шаг 2: Обновление и установка ПО

    Обновим список пакетов и установим Python и Git:

    Шаг 3: Загрузка кода

    Вы можете загрузить код через Git (если выкладывали его на GitHub) или просто скопировать файлы через программу FileZilla.

    Допустим, мы используем Git:

    Шаг 4: Настройка окружения

    Создаем виртуальное окружение и устанавливаем библиотеки:

    Создайте файл .env прямо на сервере:

    Вставьте туда ваш токен (BOT_TOKEN=...), нажмите Ctrl+O (сохранить) и Ctrl+X (выйти).

    Шаг 5: Systemd — делаем бота бессмертным

    Если вы просто запустите бота командой python main.py, он выключится, как только вы закроете терминал. Нам нужно создать службу (service).

    Создадим файл конфигурации systemd:

    Вставьте следующий текст (замените пути на свои):

    * Restart=always: Если бот упадет с ошибкой, сервер сам его перезапустит. * ExecStart: Указываем путь к Python внутри виртуального окружения.

    Сохраните файл. Теперь активируем службу:

    Проверить статус можно командой:

    Если горит зеленый огонек active (running) — поздравляю, ваш бот в продакшене!

    Продвинутый уровень: Настройка Webhook в коде

    Если вы решите перейти на Webhook, вам нужно будет изменить код запуска бота. В aiogram 3.x это делается через SimpleRequestHandler.

    Вам потребуется:

  • Доменное имя (например, mybot.com).
  • SSL сертификат (можно получить бесплатно через Let's Encrypt).
  • Веб-сервер (Nginx) для проксирования запросов.
  • Вот пример того, как меняется Python-код для вебхука:

    Этот код запускает локальный веб-сервер на порту 8080. Nginx должен будет принимать запросы из интернета и перенаправлять их на этот порт.

    Заключение курса

    Мы прошли огромный путь. В этом курсе вы:

  • Познакомились с BotFather и API Telegram.
  • Написали код на Python с использованием aiogram.
  • Создали интерактивные клавиатуры.
  • Научились хранить состояние диалога (FSM) и данные в SQLite.
  • Задеплоили бота на настоящий Linux-сервер.
  • Теперь у вас есть все инструменты, чтобы создавать ботов любой сложности: от простых напоминалок до магазинов и сервисов поддержки. Развивайтесь, читайте документацию и пишите код!

    Удачи в разработке! 🚀