Как разместить (deploy) телеграм бота на платформе vercel?

Как можно загрузить телеграм бот, написанный на Python с использованием aiogram, на платформу Vercel так, чтобы он корректно работал? При попытке загрузки бота на Vercel возникла ошибка, и бот перестал функционировать. Я попробовал загрузить его стандартным способом, но это не помогло. С учетом того, что я новичок в этой области и впервые работаю с хостингом и Vercel, нужна помощь по правильной загрузке бота на эту платформу. Возможно, для Vercel требуется нестандартный способ загрузки ботов, например, запуск через веб-интерфейс? Буду благодарен за любую полезную информацию или инструкции.
  • 24 июня 2024 г. 20:12
Ответы на вопрос 2
Для размещения телеграм бота на платформе Vercel, вам следует следовать определенным шагам:

1. Создайте проект Vercel. Зарегистрируйтесь на vercel.com, если у вас еще нет аккаунта, и создайте новый проект.

2. Убедитесь, что ваш телеграм бот написан на Python с использованием aiogram, и что все необходимые зависимости указаны в файле requirements.txt.

3. Создайте файл server.py, в котором будет содержаться код для запуска вашего бота. Обычно это выглядит примерно так:

```python
# server.py
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.middlewares.logging import LoggingMiddleware
from aiogram.dispatcher.webhook import get_new_configured_app

API_TOKEN = 'YOUR_API_TOKEN'

bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
dp.middleware.setup(LoggingMiddleware())

async def on_startup(dp):
    await bot.set_webhook("https://your-vercel-url.now.sh")

async def on_shutdown(dp):
    # insert code for shutdown, if necessary
    pass

app = get_new_configured_app(dispatcher=dp, path='/')
```

4. Следующим шагом является конфигурация webhook'а для вашего бота на платформе Vercel. Вам нужно создать файл now.json в корневой папке проекта и добавить следующее содержание:

```json
{
  "version": 2,
  "builds": [
    { "src": "/server.py", "use": "@now/python" }
  ],
  "routes": [
    { "handle": "server.py" }
  ]
}
```

5. Загрузите свой проект на Vercel с помощью команды now в командной строке. После успешной загрузки вы получите URL вашего приложения на Vercel.

6. Укажите этот URL в качестве webhook URL вашего телеграм бота с помощью метода setWebhook. Например:

```python
import requests

API_TOKEN = 'YOUR_API_TOKEN'
WEBHOOK_URL = 'https://your-vercel-url.now.sh'

url = f"https://api.telegram.org/bot{API_TOKEN}/setWebhook?url={WEBHOOK_URL}"
response = requests.get(url)

print(response.json())
```

После этого ваш телеграм бот должен успешно развернуться на платформе Vercel и корректно функционировать. Надеюсь, эта информация поможет вам разместить ваш бот на Vercel. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью. Удачи!
На 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" }
  ]
}
Похожие вопросы