Как указать точку входа для Telegram бота на Яндекс Облаке
При развёртывании Telegram бота на Python в Яндекс Облаке (Cloud Functions) часто возникает путаница с указанием точки входа. Особенно это касается асинхронных ботов на aiogram, где функция main определена через async def. В этой статье мы подробно разберём, как правильно настроить точку входа, чтобы бот заработал без ошибок.
Что такое точка входа в Яндекс Облаке?
Точка входа (entry point) - это путь к функции, которая будет вызвана при запуске облачной функции. Формат записи: имя_файла.имя_функции. Например, если ваш файл называется bot.py, а функция - main, то точка входа будет bot.main.
Почему async не подходит для точки входа?
Слово async является зарезервированным ключевым словом в Python. Яндекс Облако ожидает имя функции, а не ключевое слово. Поэтому запись имя_файла.async вызовет ошибку. Используйте имя вашей асинхронной функции, например main.
Как правильно указать точку входа для асинхронного бота?
Следуйте этим шагам:
- Убедитесь, что в вашем файле есть функция с именем
main(или любым другим, кроме зарезервированных слов). - Функция должна быть определена как
async def main():. - Внутри функции вызовите
await dp.start_polling(bot)или аналогичный код запуска бота. - В настройках облачной функции укажите точку входа в формате
имя_файла.main.
Пример корректного кода для Яндекс Облака
Ниже приведён фрагмент кода, который будет работать при правильной точке входа. Обратите внимание на структуру: функция main запускает поллинг, а send_weather_updates выполняется как фоновая задача.
import asyncio
from aiogram import Bot, Dispatcher
bot = Bot(token='TOKEN')
dp = Dispatcher()
async def send_weather_updates():
while True:
# логика отправки
await asyncio.sleep(60)
async def main():
asyncio.create_task(send_weather_updates())
await dp.start_polling(bot)
if __name__ == '__main__':
asyncio.run(main())Частые ошибки и их решение
Ошибка: "Function returned undefined, expected response"
Эта ошибка возникает, если точка входа указана неверно или функция не экспортируется. Проверьте, что имя файла и функции в точке входа совпадают с реальными.
Ошибка: "async is not defined"
Не используйте async в качестве имени функции. Переименуйте её в main или handler.
Проблемы с базой данных
Если вы используете SQLite, убедитесь, что файл базы данных лежит в той же директории, что и облачная функция, или используйте абсолютный путь. В Яндекс Облаке временная файловая система, поэтому для постоянного хранения лучше применять Yandex Database или Object Storage.
Заключение
Правильное указание точки входа - ключ к успешному деплою Telegram бота на Яндекс Облаке. Используйте имя вашей асинхронной функции (например, main) и следуйте формату имя_файла.имя_функции. Если возникли проблемы, проверьте логи облачной функции и убедитесь, что все зависимости установлены. Теперь ваш бот будет работать стабильно!