Всем привет!
Если вы хоть раз пытались нормально вкатиться в разработку Telegram‑ботов, то почти наверняка сталкивались с одной проблемой: информации в интернете много, но она какая‑то рваная. То есть где‑то вам сразу дают библиотеку, заставляя писать код и даже не объяснив, как бот вообще работает.
В особых сценариях (например разработка userbot) смешивают воедино Telegram Bot API, Telegram API (да, это разные вещи!), api_id, api_hash, token, chat_id, webhook и еще десяток терминов.
А где‑то вообще показывают «hello world», который фактически‑то работает, но только ты ступишь на шаг вперед, так всё начинает разваливаться, ведь понимания практически 0.
В этой статье моя цель — разобрать всё это нормально и по‑человечески, объяснив как вообще нужно писать бота, что нужно для старта, когда хватает polling режима, а когда уже нужен webhook (про оба режима расскажу ниже).
И покажу как опубликовать бота для работы 24/7 со стабильным подключением к Telegram API без региональных ограничений. Получив при этом бесплатный домен с настроенным SSL для webhook и совсем не настраивая сервер (просто сделав git push или перетянув файлы в интерфейсе) в облаке Amvera.
Что будет в статье
Что вообще нужно, чтобы написать Telegram-бота;
Чем Telegram Bot API отличается от Telegram API;
Как создать бота в @BotFather;
Как руками проверить Bot API без библиотек;
Узнаем, как бот вообще получает обновления (новые сообщения, нажатия на кнопки и т.д.);
Разберем все основные термины;
Напишем минимального бота на Python для закрепления.
Запустим бота на хостинге без региональных ограничений для API Telegram за 3 минуты и 3 команды в IDE.
Предупреждение: в практической части статьи необходимы базовые знания Python
Что вообще нужно, чтобы написать Telegram-бота
Если не усложнять, то для первого Telegram-бота вам нужны всего 4 вещи:
Аккаунт в Telegram (нужен только для создания бота);
Сам бот, которого мы создадим в @BotFather;
Токен этого бота;
Любой backend-код, который будет отправлять HTTPS-запросы к BotAPI.
backend‑код — это ваш код, который каким‑либо образом будет обращаться к Telegram Bot API. В нашем случае это будет код на Python. Естественно, мы не будем прописывать URL для каждого действия бота, за нас это уже сделали разработчики такой популярной библиотеки, как
aiogram. Весь код будет максимально простым и читаемым. HTTPS‑запросы — это просто обращения по специальному URL BotAPI. Вообще, ниже я разберу это подробнее, но чтобы новички не запинались на ровном месте, приведу сразу пример:curl "https://api.telegram.org/bot$BOT_TOKEN/getMe"<‑ это пример HTTPS‑запроса с помощью утилиты curl. Он обращается по URL Telegram BotAPI с эндпоинтом/getMe, который в ответ вернет всю информацию о боте. Вместо$BOT_TOKENнужно подставить токен, который мы получим дальше в диалоге с BotFather.
Немного про сущность бота
Если пройтись по теории из официальной документации Telegram Bot API, то уже можно вывести сущность бота в Telegram.
Итак, Telegram‑бот — это специальный аккаунт, который не требует номера телефона. Бот сам по себе выступает интерфейсом (тем, что стоит между кодом и пользователем, тем что видят сами пользователи) для кода, запущенного где‑то на backend‑сервере.
Цитата из документации: «Telegram Bots are special accounts that do not require an additional phone number to set up. These accounts serve as an interface for code running somewhere on your server.»
Для подключения бота к коду используется bot_token, который выдает @BotFather сразу после создания бота. Это как бы «пароль», с помощью которого при отправке запросов к Telegram Bot API, Telegram понимает, с каким именно ботом нужно работать.
Токен имеет следующий вид: 012345678:AAZXXWr1-acQWo_4CjGQWf1_11C_fGU-TZQ. Что интересно, первые цифры до двоеточия — это user_id вашего бота. Однако полагаться на это не стоит, так как официального подтверждения я не увидел.
Чем Telegram Bot API отличается от Telegram API
Здесь у новичков часто начинается путаница.
Как я ранее подчеркнул, эти два API — довольно разные вещи. Когда человек ищет что‑то типо «telegram api», он часто сам не до конца понимает, что именно ему нужно.
У Telegram на самом деле несколько разных API. На стартовой странице прям в лицо перечисляются 4 различных API:
Если сильно коротко, то Telegram API и TDLib — более низкоуровневые API, которые предназначены в основном для создания собственных Telegram‑клиентов. Там и появляются
api_id,api_hash, которые используются для авторизации пользователя и которые нужно получать черезmy.telegram.org.
Для нас интересен именно Telegram Bot API. Это уже совсем другой сценарий. Этого API нам более чем достаточно для создания обычного бота.
В официальной документации он описан как HTTP‑based interface для разработчиков, которые хотят создавать ботов для Telegram. Проще говоря: вам не нужно лезть в низкоуровневые детали работы Telegram, потому что посредником выступает Bot API, а вы общаетесь с ним через упрощённый HTTPS‑интерфейс.
Создаём бота через @BotFather
Теперь, когда у нас уже есть минимальное представление о сущности бота, мы можем перейти к первому реальному действию.
Telegram в разделе о BotFather пишет, что для создания нового бота нужно использовать команду /newbot. После этого @BotFather попросит вас указать имя и username для бота, а затем сгенерирует bot_token для нового бота.
Здесь есть некоторые особенности. username бота обязательно должен быть длиной от 5 до 32 символов, может содержать только латинские буквы, цифры и подчёркивания, и обязан заканчиваться на bot. То есть создать бота с username “botdlyaprikolov” не получится, понадобится писать “dlyaprikolovbot”.


Сам этот bot_token — главное, что нам нужно сохранить. Telegram прямо предупреждает, что токен используется для авторизации бота и отправки запросов к BotAPI, его обязательно нужно хранить в безопасности, ведь получив токен, кто угодно сможет управлять вашим ботом. Если токен был потерян или по ошибке опубликован, BotFather позволяет сгенерировать новый через команду /revoke.

На всякий случай повторю еще раз: ни в коем случае, ни при каких обстоятельствах не делитесь с другими людьми токеном бота! В примере на скриншоте указаны неактуальные токены, исключительно по этой причине я их не замазал.
Как руками проверить https Telegram Bot API без библиотек и дополнительных установок
Вот это место часто пропускают. А зря.
Прежде чем тащить в проект aiogram, python-telegram-bot или любую другую библиотеку, полезно хотя бы один раз руками пощупать сам Bot API. Официальный туториал прямо говорит, что браузер умеет отправлять HTTPS‑запросы, и после получения токена предлагают вставить строку с getMe в браузер. Там же отдельно сказано, что в теории с API можно взаимодействовать через браузер, и через curl, хотя для больших приложений это совсем не практично.
Первый запрос выглядит так (и вы с ним уже знакомы, если внимательно читали статью):
https://api.telegram.org/bot<ВАШ_ТОКЕН>/getMe
Если вы все вставили корректно, вы получите JSON с информацией о боте. И здесь очень важно зафиксировать чуть ли не основную мысль статьи: BotAPI — это обычный HTTP API. Он не живёт внутри того же aiogram. Библиотеки просто помогают избавиться от необходимости вручную прописывать каждый запрос.

Send message в Telegram Bot API
Отправляем первое сообщение через sendMessage c использованием Curl
Следующий логичный шаг — заставить бота кому‑то написать.
Для этого в Bot API есть специальный метод sendMessage. В официальной документации он описан очень прямо: Use this method to send text messages. On success, the sent Message is returned. То есть метод просто отправляет текстовое сообщение и в случае успеха возвращает объект отправленного сообщения.
Здесь уже просто через браузер не получится. Лучше всего для ручной проверки использовать утилиту curl, которая обычно предустановлена в систему.
Пример запроса (не забудьте заменить BOT_TOKEN и chat_id):
curl -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \ -d "chat_id=123456789" \ -d "text=Привет! Это мое первое сообщение через Telegram Bot API"
Но здесь новички почти сразу встречают настоящую и довольно популярную проблему: где вообще взять chat_id? К счастью, мы уже разобрали эту тему в отдельной статье: https://habr.com/ru/companies/amvera/articles/996686/. Если коротко: айди можно взять в боте @AmveraID_bot. Понятное дело, помимо этого есть масса способов получить chat_id. Например: из getUpdates.
Итак, когда у нас есть chat_id и bot_token, давайте отправим запрос.
curl -X POST "https://api.telegram.org/botТОКЕН/sendMessage" \ -d "chat_id=мой_айди" \ -d "text=Привет! Это мое первое сообщение через Telegram Bot API"
Error 400 в Telegram API
Упс… Что-то пошло не так. BotAPI вернул ошибку: chat not found.
{"ok":false,"error_code":400,"description":"Bad Request: chat not found"}
Но что не так, если айди мы точно скопировали правильно?
А всё просто. Здесь появляется одно из главных особенностей специальных аккаунтов ботов. Именно по этой причине сейчас ваша личка не состоит из мусора от левых ботов, которые пишут вам без вашего разрешения.
Как вы уже поняли: боты не могут писать первые без вашей инициативы. Они просто не видят чат. Чтобы написать вам, у бота уже должна быть переписка с вами или разрешение со специальной формы (например, когда вы отправляете заявку на вступление в канал).
Решается все просто: просто напишем боту первое сообщение и повторим запрос.
{"ok":true,"result":{"message_id":2,"from":{"id":8788391298,"is_bot":true,"first_name":"\u0418\u043c\u044f\u0411\u043e\u0442\u0430","username":"qwe123p1oi098_bot"},"chat":{"id":ваш_айди,"first_name":"example_firstname","username":"ваш_username","type":"private"},"date":1774969215,"text":"\u041f\u0440\u0438\u0432\u0435\u0442! \u042d\u0442\u043e \u043c\u043e\u0435 \u043f\u0435\u0440\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 Telegram Bot API"}}
Ура! Теперь мы отправили первое сообщение через Telegram.
getUpdates и setWebhook: или как бот вообще получает обновления
Это все классно, но ведь мы так и не получили сообщение, которое мы сами отправили боту. Как тогда бот должен получать их?
Для этого Telegram поддерживает два способа отправки обновлений: getUpdates и setWebhook. По аналогии с user_id и chat_id, у нас уже есть статья по этой теме, очень рекомендуем почитать! Webhook в Telegram и Discord: как подключить и чем лучше polling.
Пока что нас интересует именно getUpdates — метод, когда бот сам спрашивает у Telegram, нет ли новых сообщений. В таких библиотеках, как aiogram, метод getUpdates отправляется практически постоянно, чтобы получать все обновления как можно быстрее.
Самый простой тест:
Написать своему боту любое сообщение;
Открыть в браузере или через
curlвот такой URL:https://api.telegram.org/bot<ВАШ_ТОКЕН>/getUpdates
В ответ Telegram вернет массив Update. Если бот получил обычное сообщение, то внутри апдейта будет поле message, а внутри его - from, chat, text и прочие данные, которые мы обычно видим в клиенте Telegram.
Обычно так достают:
message.from.id->user_id;message.chat.id->chat_id.
Почему getUpdates может возвращать одно и то же сообщение снова
Здесь многие считают, что Telegram «сломался».
В документации Bot API прямо сказано что по умолчанию getUpdates возвращает апдейты, начиная с ближайшего неподтвержденного апдейта (earliest unconfirmed update). Апдейт считается подтвержденным только тогда, когда getUpdates вызывается в offset, которые больше его update_id.
Простыми словами это работает так:
Telegram прислал вам апдейт с
update_id = 100;вы его как‑либо обработали;
Следующий запрос с
getUpdatesвы делаете уже сoffset = 101;И тогда старый апдейт уже не возвращается.
Пример:
curl "https://api.telegram.org/bot$BOT_TOKEN/getUpdates?offset=101&timeout=30"
Создаём минимального бота на Python для закрепления
Теперь, когда мы уже:
Создали бота через
@BotFather;Получили
bot_token;Руками проверили Bot API;
и имеем представление о сущности ботов и работе самого API,
мы можем со спокойной душой перейти к коду на Python.
Для примера я возьму aiogram. В официальной документации aiogram указано, что это асинхронный фреймворк для Telegram Bot API на Python 3.10+.
То есть из зависимостей у нас — заранее установленный Python 3.10 или выше.
Установка
pip install aiogram
Первый минимальный бот
Давайте создадим файл bot.py.
Прежде чем переходить к коду, я хочу немного рассказать про сам принцип написания кода.
В этой статье я не буду учить писать сложных ботов, я лишь хочу научить алгоритму, по которому стоит начинать разработку. Естественно, я разберу наш пример.
Итак, лучше всего начать с описания бота в абстракции от программирования.
Представим, что нам нужно закрепить все знания, полученные за статью. То есть бот должен уметь получать новые сообщения, получать информацию о себе и как‑то ее отправлять пользователю с помощью команды /botinfo (команду можно придумать любую). Тут приходит в голову самый распространенный сценарий: создать эхо‑бота с доп. функционалом вывода информации о себе.
Сейчас мы получили основную картину функционала. Часто этого уже достаточно для того, чтобы перейти к написанию кода.
По пунктам нам нужно:
Привязать бота к коду;
Научить бота получать обновления;
Обрабатывать каждое входящее сообщение, причем: 3.1) Если сообщение — это команда /botinfo, то выводить информацию о боте; 3.2) Если сообщение — это команда /start, то выводить приветствие; 3.3) Если ни то, ни другое — просто отправлять пользователю его же сообщение.
1. Привязка бота к коду
В уже созданном ранее файле bot.py импортируем необходимые модули.
import asyncio import logging import os from aiogram import Bot, Dispatcher, F from aiogram.filters import CommandStart, Command from aiogram.types import Message
Что здесь импортируется и зачем
import asyncio aiogram — это асинхронный фреймворк. Поэтому запускать бота мы будем тоже асинхронно — через asyncio.run(...).
Асинхронность — это подход, при котором программа не «замирает» на одном действии, а умеет параллельно ждать ответы от сети, Telegram API и любых других внешних источников. Для ботов это прям полезно, так как бот почти все время либо ждет обновления, либо ждет ответ от Telegram.
import logging Этот модуль не нужен для работы Telegram‑бота, а для логирования. Логи — это сообщения в консоли. Можно обойтись и без него, но я считаю, что его наличие — только плюс.
import os В нашем случае os нужен для чтения переменных окружения. Токен бота лучше не вставлять прямо в код. Намного безопаснее хранить его в переменной окружения вроде BOT_TOKEN. Сам по себе os нужен для взаимодействия с системой.
Переменная окружения — это значение, которое хранится не в коде, а прям в системе. Это удобно и безопасно.
from aiogram import Bot, Dispatcher, F Здесь уже импортируются основные инструменты aiogram.
Bot— это объект бота. Без него вы не сможете вызывать методы API.Dispatcher— это диспетчер обновлений. Он нужен для обработки входящих апдейтов.F— это удобный способ фильтровать события. Например с помощью его можно сказать «обрабатывай только текстовые сообщения».
from aiogram.filters import CommandStart, Command Это фильтры команд.
CommandStart()— это фильтр команды/start;Command("botinfo")— это фильтр для команды/botinfo. Т.е. так мы просто отбрасываем лишние команды.
from aiogram.types import Message Message — это объект входящего сообщения. Фактически мы просто импортировали тип сообщения. Через него мы сможем получить текст сообщения, пользователя и ответить обратно.
Далее инициализируем бота и диспетчер:
BOT_TOKEN = os.getenv("BOT_TOKEN") if not BOT_TOKEN: raise RuntimeError("Переменная окружения BOT_TOKEN не задана") bot = Bot(BOT_TOKEN) dp = Dispatcher()
Что здесь происходит и зачем это нужно
BOT_TOKEN = os.getenv("BOT_TOKEN") Этой строкой мы пробуем достать токен бота из переменной окружения BOT_TOKEN.
То есть логика тут очень простая:
если токен в системе задан — Python возьмет его;
если нет — получим None.
if not BOT_TOKEN: Это простая защита от одной из самых частых ошибок. Здесь мы проверяем, не забыли ли вы задать токен в системе. Это сработает как раз потому что os.getenv() возвращает None в случае, если токен не задан.
bot = Bot(BOT_TOKEN) Здесь мы создаем сердце бота - его объект. Это и есть сама привязка бота к коду. Теперь aiogram знает, с каким именно ботом ему нужно работать. Мы будем использовать переменную bot для работы с ботом.
dp = Dispatcher() А это создание диспетчера обновлений. Именно dp будет принимать апдейты и передавать их в нужные обработчики.
Сейчас бот ничего не умеет. Мы просто привязали токен к объекту Bot.
2. Научим бота получать обновления
Теперь переходим ко второму большому шагу.
Пока у нас есть только bot и dp, но бот до сих пор не увидит ни единого входящего сообщения.
Чтобы бот начал видеть входящие апдейты, его нужно запустить в режиме polling.
Но пока запускать polling рано. Почему? Потому что polling сам по себе только получает обновления, но мы еще не научили бота что с ними делать.
А значит правильный порядок такой:
Сначала описать обработчики сообщений;
И только потом запускать polling.
Поэтому сразу перейдем к третьему пункту.
3. Обрабатываем каждое входящее сообщение
Здесь и начинается самая интересная часть.
Сейчас нам нужно описать поведение бота так, как мы сформулировали ранее.
3.1 Если сообщение — команда /botinfo
Начнём именно с нее, так как она чуть интереснее, чем /start. Здесь бот не просто отвечает каким‑то заданным ранее сообщением, а сначала получает информацию о себе, а потом отправляет ее пользователю.
Добавляем в bot.py такой обработчик:
@dp.message(Command("botinfo")) async def cmd_botinfo(message: Message): me = await bot.get_me() await message.answer( "Информация о боте:\n" # С помощью \n мы делаем перенос строк f"ID: {me.id}\n" # Здесь выводим ID f"Имя: {me.first_name}\n" # Здесь first_name (ИмяБота) f"Username: @{me.username}" # Здесь username (@qwe123p1oi098_bot) )
Обратите внимание на то, что много функций вызывается со словом
await. Это обязательно для работы с асинхронными операциями, которые должны дождаться какого-то результата внутриasync def.
@dp.message(Command("botinfo")) Эта строка говорит диспетчеру: "Если пришло сообщение и это команда /botinfo, выполняй функцию ниже.
async def cmd_botinfo(message: Message): Это асинхронная функция-обработчик. Здесь важно писать именно async def, т.к. aiogram работает асинхронно. Помимо этого передаем в функцию объект входящего сообщения (message: Message).
me = await bot.get_me() Вот это самое интересное. Здесь уже вызывается реальный HTTPS запрос к Bot API. Фактически на стороне фреймворка выполняется следующий запрос:
https://api.telegram.org/bot<ВАШ_ТОКЕН>/getMe
После чего ответ от Telegram упаковывается в переменную me. То есть по ответу:
{ "ok": true, "result": { "id": 8788391298, -> me.id "is_bot": true, "first_name": "ИмяБота", -> me.first_name "username": "qwe123p1oi098_bot", -> me.username "can_join_groups": true, "can_read_all_group_messages": false, "supports_inline_queries": false, "can_connect_to_business": false, "has_main_web_app": false, "has_topics_enabled": false, "allows_users_to_create_topics": false } }
await message.answer(...) Этой строкой бот отправляет ответ туда же, откуда пришла команда. Его удобность в том, что в отличие от bot.send_message(...), здесь нам не нужно указывать chat_id.
В message.answer() мы передаем text, в который мы упаковали нужные данные из me в более-менее красивое сообщение.
3.2 Если сообщение - команда /start
Полностью по аналогии с первым обработчиком, мы можем создать обработчик команды /start, используя CommandStart() вместо Command("start").
@dp.message(CommandStart()) async def cmd_start(message: Message): await message.answer("Привет! Напиши /botinfo")
Если вы внимательно читали пункт выше, то для вас уже ничего не нужно объяснять.
3.3 Если ни то, ни другое - просто отправляем пользователю его же сообщение.
Здесь отличий также минимум:
@dp.message(F.text) async def echo_message(message: Message): await message.answer(message.text)
Здесь в строке @dp.message(F.text) мы говорим диспетчеру, что хотим обрабатывать только текстовые сообщения, ни какие другие.
В строчке await message.answer(message.text) с помощью message.text получаем текст, который отправил пользователь и возвращаем его же.
Сообщение обработали, осталось лишь запустить polling.
Добавим в конец файла bot.py следующий код:
async def main(): await dp.start_polling(bot) if __name__ == "__main__": logging.basicConfig(level=logging.INFO) asyncio.run(main())
async def main(): Это основная асинхронная функция запуска бота. Это самый правильный способ запуска.
await dp.start_polling(bot) Это и есть запуск polling-режима. Именно с этого момента бот начинает постоянно запрашивать у Telegram обновления и передавать их в Dispatcher, который в свою очередь их обработает.
if name == "__main__": Это стандартная конструкция в Python, которая запустит код ниже (вызов функции main()) только в случае, если файл запущен напрямую, а не импортирован с другого модуля. Ее лучше просто запомнить и использовать только в главном файле, который потом будете запускать.
logging.basicConfig(level=logging.INFO) Этой строкой мы включаем базовые логи. Опять же, все, что связано с logging опционально. Эту строку тоже лучше просто запомнить.
asyncio.run(main()) И здесь мы, наконец, запускаем нашу асинхронную функцию main().
Весь код получается таким:
import asyncio import logging import os from aiogram import Bot, Dispatcher, F from aiogram.filters import CommandStart, Command from aiogram.types import Message BOT_TOKEN = os.getenv("BOT_TOKEN") if not BOT_TOKEN: raise RuntimeError("Переменная окружения BOT_TOKEN не задана") bot = Bot(BOT_TOKEN) dp = Dispatcher() @dp.message(Command("botinfo")) async def cmd_botinfo(message: Message): me = await bot.get_me() await message.answer( "Информация о боте:\n" # С помощью \n мы делаем перенос строк f"ID: {me.id}\n" # Здесь выводим ID f"Имя: {me.first_name}\n" # Здесь first_name (ИмяБота) f"Username: @{me.username}" # Здесь username (@qwe123p1oi098_bot) ) @dp.message(CommandStart()) async def cmd_start(message: Message): await message.answer("Привет! Напиши /botinfo") @dp.message(F.text) async def echo_message(message: Message): await message.answer(message.text) async def main(): await dp.start_polling(bot) if __name__ == "__main__": logging.basicConfig(level=logging.INFO) asyncio.run(main())
Считаю очень важным подчеркнуть то, что приоритет обработчиков важно выстраивать правильно. Если вы первым обработчиком сделаете @dp.message(F.text), то все обработчики ниже, которые также будут относиться к тексту (например для команды /start) просто не сработают, т.к. диспетчер будет думать, что обработка уже завершена. Всегда делайте общий фильтр в самом конце кода!
Как запустить бота локально
Теперь осталось лишь передать токен в переменную окружения и запустить файл.
Linux / MacOS:
export BOT_TOKEN="ВАШ_ТОКЕН" python bot.py
Windows PowerShell:
$env:BOT_TOKEN="ВАШ_ТОКЕН" python bot.py
После этого переходим в диалог с ботом и проверяем функционал.
Уже на этом этапе мы имеем полностью рабочего бота, осталось лишь перейти к заключающей главе статьи.
Запуск бота для работы 24/7 за 5 минут со стабильным соединением к API Telegram
Мы бы могли держать бота локально (что уж очень неудобно и непрактично), могли бы арендовать VPS/VDS, но тогда бы статья переросла в инструкцию по настройке VPS.
Сейчас же я вам предлагаю воспользоваться решением проще - деплоем в Amvera Cloud. Не зря же это корпоративный блог, так ведь?)
Amvera Cloud - это сервис для развертывания IT-приложений без настройки сервера. Все, что вам понадобится - настроить две строки конфигурации, загрузить файлы и добавить одну переменную окружения. Все это займет около пяти минут и вы получите стабильное подключение к API Telegram без региональных ограничений.
Помимо этого, важным бонусом будет:
Бесплатный баланс 111 рублей сразу после регистрации для теста. Это позволит нам бесплатно развернуть бота и даже некоторое время покрутить его.
Возможность деплоя как в Москве (РФ), так и в Варшаве (Польша), что в наше время очень важно. При этом алгоритм развертывания остается бессменным и бот будет работать с API Telegram без задержек и внешних ограничений.
Регистрация и создание проекта
Сразу после регистрации открываем главную страницу проектов и создаем проект с типом “Приложение”. Бот будет работать из всех регионов, но для долгосрочной надежности, выберем европейский кластер. Далее вы сможете выбрать необходимый тариф и загрузить данные.
Этап с настройкой конфигурацией можно пропустить. В любом случае конфиг либо сгенерируется сам, либо нам понадобится поправить одно-два значения.
Минимальная настройка
Если вы сделали все правильно, в разделе “Приложения” должен появиться ваш проект. Открываем его и переходим во вкладку “Переменные”.
Здесь нам просто нужно задать переменную окружения BOT_TOKEN. Лучше всего для секретных ключей нажимать кнопку “Это секрет”.

Далее переходим во вкладку “Конфигурация”. Здесь просто повторяем конфигурацию со скриншота. Скорее всего вам понадобится поправить только параметры requirementsPath и scriptName. Не забудьте нажать кнопку “Применить”.

Так как Amvera не имеет встроенного терминала, все библиотеки нужно перечислить в файлике requirements.txt. Фактически он должен содержать названия и версии библиотек.
Например:
python-dotenv==ВЕРСИЯ aiogram tensorflow pandas scikit-learn emoji Flask pytz
Нам же достаточно просто указать:
aiogram==3.26.0
И загрузить этот файлик в репозиторий. А если файла нет -- его можно сгенерировать на этапе загрузки файлов при создании проекта.
В целом, после настройки переменных окружения, конфигурации и загрузки всех файлов, проект готов к сборке и запуску. Для этого жмите кнопку “Собрать” во вкладке “Конфигурация”.
После небольшого ожидания проект должен перейти в статус “Приложение запущено”, что будет означать о том, что все прошло без проблем.
Итог
Итак, в этой статье мы разобрали все основы для работы с Telegram Bot API и написали небольшого бота по разобранной теме и даже развернули его в европейском регионе Amvera для постоянной работы без ограничений к API.
Надеюсь, что статья была для вас полезна.
