На 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" }
]
}