Как настроить webhook для бота на aiogram 3 с использованием nginx?

Друзья, уже третий день я пытаюсь настроить webhook для своего бота в Telegram, но безуспешно. Я перепробовал все возможные решения, но ChatGPT не смог помочь. Пожалуйста, подскажите, как это сделать. <br/> <br/> У меня есть VPS сервер, на котором размещен сайт, и я хочу, чтобы Telegram бот работал в связке с ним. Для этого необходимо настроить webhook. <br/> <br/> Вот пример кода моего бота на Python: <br/> <br/> main.py <br/> <pre><code class="python">import asyncio
from aiogram import Bot, Dispatcher, types
from aiogram.filters import CommandStart
from aiogram.types import InlineKeyboardButton, WebAppInfo
from aiogram.utils.keyboard import InlineKeyboardBuilder
import config

bot = Bot(token=config.TELEGRAM_API_TOKEN)
dp = Dispatcher()

# Главное меню
# И так далее
#...........

# Запуск бота
async def main():
    await dp.start_polling(bot)

if __name__ == "__main__":
    asyncio.run(main())</code></pre> <br/> <br/> Также прилагаю настройки моего сайта на nginx: <br/> <br/> mysite.service <br/> <pre><code class="python"># Блок для перенаправления HTTP на HTTPS
server {
    listen 80;
    server_name mysite.com;

    return 301 https://$host$request_uri;
}

# Блок для HTTPS
server {
    listen 443 ssl;
    server_name mysite.com;

    ssl_certificate /home/mysite/site/SSL/fullchain.pem;
    ssl_certificate_key /home/mysite/site/SSL/private.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}</code></pre>
  • 5 сентября 2024 г. 20:13
Ответы на вопрос 2
Чтобы настроить webhook для бота на Aiogram 3 с использованием Nginx, вам нужно выполнить несколько шагов. Я постараюсь объяснить их по порядку.

### 1. Код бота

Вам нужно изменить код вашего бота для установки вебхука. Ниже приведён пример, как это можно сделать.

```python
import os
import asyncio
from aiogram import Bot, Dispatcher, types
from aiogram.utils import executor
import config

bot = Bot(token=config.TELEGRAM_API_TOKEN)
dp = Dispatcher()

@dp.message_handler(commands=['start'])
async def start_command(message: types.Message):
    await message.answer("Hello! I'm your bot.")

async def on_startup(dp):
    await bot.set_webhook("https://mysite.com/webhook")

async def on_shutdown(dp):
    await bot.delete_webhook()

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(on_startup(dp))  # Устанавливаем вебхук при запуске
    executor.start_polling(dp, skip_updates=True, on_shutdown=on_shutdown)
```

Убедитесь, что вы используете корректный URL для вашего вебхука, заменив `https://mysite.com/webhook` на ваш собственный адрес.

### 2. Обработка webhook-запросов

Добавьте обработчик для обработки запросов, которые будут приходить на ваш вебхук. Добавьте следующий код в ваш файл:

```python
from aiohttp import web

async def handle_webhook(request):
    data = await request.json()
    update = types.Update(**data)
    await dp.process_update(update)
    return web.Response()

app = web.Application()
app.router.add_post('/webhook', handle_webhook)

# Запускаем aiohttp-сервер на определённом порту
if __name__ == "__main__":
    web.run_app(app, host='0.0.0.0', port=8443)
```

### 3. Настройка Nginx

Теперь вам нужно настроить Nginx для проксирования запросов на ваш вебхук. Добавьте следующий блок в ваш файл конфигурации Nginx, который уже настроен на HTTPS:

```nginx
location /webhook {
    proxy_pass http://127.0.0.1:8443;  # Порт, на котором работает ваш aiohttp сервер
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}
```

### 4. Перезапуск сервисов

После внесения всех изменений вам нужно перезапустить Nginx и ваш бот:

```bash
sudo systemctl restart nginx
# Запустите ваш бот. Если у вас создан systemd сервис, используйте:
sudo systemctl start mysite.service
```

### 5. Проверка

Теперь ваш бот должен принимать сообщения через вебхук. Вы можете протестировать его, отправив команду `/start` в чате с вашим ботом.

### Дополнительные советы

- Убедитесь, что ваш сервер доступен по внешнему IP и что порты 80 и 443 открыты в firewall.
- Проверьте, что сертификаты SSL корректны.
- Если возникают ошибки, вы можете посмотреть логи Nginx и вашего бота для диагностики.

Если у вас возникли дополнительные вопросы или проблемы, пожалуйста, не стесняйтесь задать их!
Код на python использует polling, причём тут вебхуки? Для вебхуков надо web app сделать, который их принимает. Вот в документации пример: https://docs.aiogram.dev/en/latest/dispatcher/webh... и там же есть образец настройки nginx.
Похожие вопросы