@MaxMaksimov

Как задеплоить телеграм бота на vercel?

У меня есть небольшой телеграм бот на python/aiogram, который я хотел загрузить на vercel, но как я и ожидал он не заработал.
При переходе на сайт бота загружалась ошибка, а сам бот также не работал. Я в целом впервые работаю с заливанием ботов на хостинг и тем более с vercel, по этому я тут туплю.
Возможно для vercel надо загружать ботов нестандартно, например чтобы через оболочку сайта загружался бот? Подсобите, товарищи
  • Вопрос задан
  • 524 просмотра
Пригласить эксперта
Ответы на вопрос 1
Wispik
@Wispik
На vercel нельзя залить бота, работающего через полинг, только через вебхук. Вот взял куски, из работающего бота на vercel (используется fastapi+aiogram):

Файл /api/index.py:
from fastapi import FastAPI, Request
from tgbot.main import tgbot

app = FastAPI()

@app.post('/api/bot')
async def tgbot_webhook_route(request: Request):
    update_dict = await request.json()
    await tgbot.update_bot(update_dict)
    return ''


Файл /tgbot/main.py:
import asyncio
from aiogram import Bot, Dispatcher, Router
from tgbot.handlers import router

class TGBot:
    def __init__(self, router: Router) -> None:
       token = config('TOKEN')
       self.bot = Bot(token)
       self.dp = Dispatcher()
       self.dp.include_router(router)
       if not config('DEBUG', default=False):
           loop = asyncio.get_event_loop()
           loop.run_until_complete(self.set_commands())
           loop.run_until_complete(self.set_webhook())

    async def update_bot(self, update: dict) -> None:
        await self.dp.feed_raw_update(self.bot, update)
        await self.bot.session.close()

    async def set_webhook(self):
        webhook_url = config('WEBHOOK_URL')
        # WEBHOOK_URL = адрес сайта/api/bot
        await self.bot.set_webhook(webhook_url)
        await self.bot.session.close()

tgbot = TGBot(router)


Файл vercel.json:
{
  "rewrites": [
    { "source": "/(.*)", "destination": "/api/index" }
  ]
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы