MAX Bot API можно освоить на одном небольшом проекте, если сразу видеть вход, действие и результат. MAX Bot API принимает обычные HTTP-запросы, поэтому первого бота можно собрать на Python без тяжёлого фреймворка. Ниже вы соберёте работающий пример и проверите обычный и граничный сценарии.
Токен легко случайно положить в код, marker легко потерять, а long polling ошибочно принять за готовую production-архитектуру. Поэтому отделим настройку, входные данные, основное действие и проверку. В этой статье вы соберёте бота, который получает новые события, узнаёт команду /start и отправляет ответ в тот же чат. Проверка: сообщение /start даёт один ответ, marker обновляется, а пустая очередь не вызывает ошибку.
прочитать MAX_TOKEN из окружения. Не расширяйте проект до первого успешного запуска.
ответ содержит updates и новый marker. Проверяйте значение, а не отсутствие ошибки.
После успеха добавьте /help и ответ для неизвестной команды. Так копирование станет практикой.
Как устроен учебный проект MAX Bot API
MAX Bot API получает входные данные, проверяет их, выполняет одно внешнее действие и сохраняет наблюдаемый результат. Держите ввод, логику и отображение раздельно: тогда каждый этап можно проверить отдельно.
| Этап | Действие | Проверяемый результат |
|---|---|---|
| Токен | прочитать MAX_TOKEN из окружения | секрет отсутствует в файле и выводе |
| События | вызвать GET /updates с timeout и marker | ответ содержит updates и новый marker |
| Команда | извлечь текст и chat_id из события | обрабатывается только ожидаемый тип сообщения |
| Ответ | отправить POST /messages для найденного чата | пользователь видит приветствие один раз |
Контрольные точки: токен, события, команда и ответ. Следующий шаг начинается после совпадения с ожидаемым результатом.

От входных данных до видимого результата. Сначала проверяется вход, затем действие и только потом интерфейс.
https://platform-api2.max.ru/updates и убедитесь, что сервер возвращает JSON, а не HTML. Сохраните команду запуска и ожидаемый вывод.Собираем рабочий пример шаг за шагом
Материал сверялся с официальной документацией сервиса 21 октября 2026 года. Создайте окружение, установите httpx и задайте MAX_TOKEN. Для разработки используйте long polling, а для production планируйте webhook. Проверьте текущую папку через pwd или Get-Location. Вставьте пример целиком, выполните один раз, затем разбирайте по частям.
import os
import time
import httpx
BASE = "https://platform-api2.max.ru"
TOKEN = os.environ["MAX_TOKEN"]
HEADERS = {"Authorization": TOKEN}
def send(chat_id: int, text: str) -> None:
response = httpx.post(
f"{BASE}/messages",
params={"chat_id": chat_id},
headers=HEADERS,
json={"text": text},
timeout=20,
)
response.raise_for_status()
def run() -> None:
marker = None
while True:
response = httpx.get(
f"{BASE}/updates",
params={"timeout": 30, "marker": marker},
headers=HEADERS,
timeout=40,
)
response.raise_for_status()
payload = response.json()
marker = payload.get("marker", marker)
for update in payload.get("updates", []):
message = update.get("message", {})
if message.get("body", {}).get("text") == "/start":
send(message["recipient"]["chat_id"], "Привет! Я бот Кодика.")
time.sleep(0.2)
if __name__ == "__main__":
run()- Терминал получает список обновлений и запоминает marker следующей страницы.
- Команда
/startприводит к POST-запросу и новому сообщению в чате. - Повторный запуск даёт тот же предсказуемый результат.
- Пустой ввод получает понятное сообщение вместо падения.
Главная функция принимает явные аргументы и возвращает данные, которые можно проверить отдельно от интерфейса. Найдите в примере вход, проверку и место формирования результата.

Что отличает устойчивый проект от случайного запуска. Явные границы делают ошибку локальной и понятной.
Что происходит внутри и почему это работает
Long polling удерживает запрос до появления события или тайм-аута. Поле marker не даёт повторно читать уже обработанную часть очереди. Логику держите отдельно от вывода: функция получает аргумент и возвращает значение, а интерфейс показывает его. Документация MAX прямо относит GET /updates к разработке и тестированию. Для production нужен webhook и проверяемый HTTPS-адрес.
| Часть | За что отвечает | Что проверить |
|---|---|---|
| GET /updates | получает события и marker | Authorization передан заголовком |
| Разбор события | находит текст и chat_id | неожиданный тип не роняет цикл |
| POST /messages | отправляет ответ в чат | ошибка HTTP не маскируется |
Marker следует сохранять после успешной обработки пачки. Если процесс упал между чтением и ответом, возможен повтор. Для важных действий добавьте журнал идентификаторов событий и идемпотентность. Не прячьте поток в одном обработчике: сохраните вход, проверьте его, вызовите операцию и только затем обновите интерфейс.
Проверяем проект и добавляем свою функцию
Добавьте команды /help и /about, вынесите выбор ответа в чистую функцию и протестируйте её без сети. До правки запишите ожидаемое поведение одним предложением. После граничного теста повторите обычный сценарий.
- Сохраните ожидаемый результат: сообщение /start даёт один ответ, marker обновляется, а пустая очередь не вызывает ошибку.
- Измените правило: добавьте /help и ответ для неизвестной команды. Сначала предскажите итог.
- Передайте граничное значение и убедитесь, что приложение не падает.
- Верните корректные данные и объясните роли трёх основных частей.
- секрет отсутствует в файле и выводе
- ответ содержит updates и новый marker
- обрабатывается только ожидаемый тип сообщения
- пользователь видит приветствие один раз
После изменения повторите основной и ошибочный сценарии, чтобы новое поведение не сломало исходный результат. Полезная правка проходит от нового ввода до видимого результата.

Четыре проверки перед следующим шагом. Каждый следующий этап начинается после наблюдаемого результата.
Что запомнить и куда двигаться дальше
После учебного запуска замените бесконечный цикл на webhook, добавьте журнал ошибок и ограничьте команды понятным набором. Для закрепления откройте в статье про Discord webhook, в первом API на FastAPI и в Telegram-боте на Python.
Как изучить тему в Кодике
Сначала разберите формат данных и одну функцию, затем подключайте сеть, интерфейс или внешний сервис. Сначала восстановите главную функцию и проверьте её на трёх значениях.
| Шаг | Что разобрать | Мини-проверка |
|---|---|---|
| 1. Основа | Функции, словари, циклы и переменные окружения Python | Объясните вход и выход функции. |
| 2. Инструмент | HTTP GET/POST, JSON, тайм-ауты и raise_for_status | Повторите команду по памяти. |
| 3. Проект | Разбор одного события и отправку ответа | Проверьте два сценария. |
| 4. Рефакторинг | Webhook, идемпотентность и журналирование | Разделите ввод, логику и вывод. |
Закрепите проект, переписав ключевую функцию по памяти и добавив собственный граничный случай. Базовый синтаксис закрепите через курс Python.
Секрет попадает в Git. Читайте его из MAX_TOKEN и отзывайте при утечке.
Используйте актуальный platform-api2.max.ru из документации.
Бот повторно читает события и дублирует ответы.
Документация рекомендует webhook для рабочего окружения.
Что получится в итоге

Финальный экран показывает результат, состояние запроса и понятное сообщение об ошибке без раскрытия секретов.
Зачем нужен marker?
Он указывает, с какого места читать следующую порцию обновлений.
Почему токен передаётся заголовком?
Query-параметр больше не поддерживается и чаще попадает в журналы.
Что проверять первым, если MAX Bot API не запускается?
Версию среды, текущую папку, команду запуска и первую строку ошибки.
Как понять, что проект MAX Bot API работает?
Проверьте основной сценарий, неверный ввод, повторный запуск и один граничный случай.
Можно ли начать с готового кода?
Да. Добейтесь результата, измените одно правило и восстановите ключевую функцию без копирования.
Выберите одно улучшение и проведите его от ввода до результата.
Если не хватает основы, перейдите курс Python, затем восстановите ключевую функцию без подсказки.