Aiogram Webhook
пытаюсь поставить вебхук на бота, используя библиотеку AIOGRAM (c pytelegrambotapi всё ок), использую вот эту доку
https://docs.aiogram.dev/en/latest/examples/webhook_example.html
Пытаюсь подвязать, ничего не выходит, пишет:
aiohttp.http_exceptions.BadStatusLine: 400, message="Bad status line 'Invalid method encountered'"
Вот мой код:
import os
from time import sleep
from aiogram.utils.executor import start_webhook
from src import config
from src.bot.initialization import bot, logger, TOKEN, dp
from src.bot.webhook.util import get_ip, generate_selfsigned_cert
WEBHOOK_PORT = 8443 # 443, 80, 88 или 8443 (порт должен быть открыт!)
ip = get_ip()
logger.debug(f'Текущий айпи - {ip}')
WEBHOOK_HOST = f'https://{ip}:{WEBHOOK_PORT}' # айпи сервера
WEBHOOK_PATH = f'/webhook/{TOKEN}'
WEBHOOK_URL = f'{WEBHOOK_HOST}{WEBHOOK_PATH}'
logger.debug(f'Вебхук урл - {WEBHOOK_URL}')
WEBAPP_HOST = '0.0.0.0'
WEBAPP_PORT = os.getenv('PORT', default=WEBHOOK_PORT)
WEBHOOK_SSL_CERT = config.CERTIFICATE_PEM_PATH # Путь к сертификату
WEBHOOK_SSL_PRIV = config.KEY_PEM_PATH # Путь к приватному ключу
generate_selfsigned_cert(hostname=ip)
async def on_startup(dp):
logger.info('Запускаюсь')
await bot.set_webhook(WEBHOOK_URL,
certificate=WEBHOOK_SSL_CERT,
drop_pending_updates=True)
async def on_shutdown(dp):
logger.info('Выключаюсь...')
await bot.delete_webhook()
await dp.storage.close()
await dp.storage.wait_closed()
logger.info('Пока!)')
def start_server():
start_webhook(
dispatcher=dp,
webhook_path=WEBHOOK_PATH,
skip_updates=True,
on_startup=on_startup,
on_shutdown=on_shutdown,
host=WEBAPP_HOST,
port=WEBAPP_PORT,
)
У меня нет домена на сервере, посему я обращаюсь к нему через апишник и порт, всё поднимаю через докер, порты открыты и путь есть, но консоль выдает надпись выше, а если пройти по getwebhookifo телеграмма, то там пишет что ссл неверный, но у меня работало и с этой ошибкой, да и если бы он действительно был неверный, оно бы не прокидывало каждое сообщение боту, а так консоль обычно вот такая, когда я пишу какое-то сообщение боту:
bot-cur_dir-1 | Traceback (most recent call last):
bot-cur_dir-1 | File "/usr/local/lib/python3.10/site-packages/aiohttp/web_protocol.py", line 334, in data_received
bot-cur_dir-1 | messages, upgraded, tail = self._request_parser.feed_data(data)
bot-cur_dir-1 | File "aiohttp/_http_parser.pyx", line 551, in aiohttp._http_parser.HttpParser.feed_data
bot-cur_dir-1 | aiohttp.http_exceptions.BadStatusLine: 400, message="Bad status line 'Invalid method encountered'"
Я не работал с AIOHTTP, и учитывая то, как просто без всяких проблем разворачивается подключение к вебхуку, думал что там под капотом всё окей, но как оказывается нет, посему прошу помощи у гуру данного форума и библиотек aiohttp и aiogram. Спасибо за внимание и будущую помощь
Ответы (1 шт):
import logging
from aiogram import Bot, types
from aiogram.contrib.middlewares.logging import LoggingMiddleware
from aiogram.dispatcher import Dispatcher
from aiogram.dispatcher.webhook import SendMessage
from aiogram.utils.executor import start_webhook
API_TOKEN = ''
# webhook settings
WEBHOOK_HOST = 'ngrok'
WEBHOOK_PATH = '' # тут оставь пустым
WEBHOOK_URL = f"{WEBHOOK_HOST}{WEBHOOK_PATH}"
# webserver settings
WEBAPP_HOST = 'localhost' # or ip
WEBAPP_PORT = 5000
logging.basicConfig(level=logging.INFO)
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
dp.middleware.setup(LoggingMiddleware())
@dp.message_handler(text='/start')
async def echo(message: types.Message):
# Regular request
# await bot.send_message(message.chat.id, message.text)
# or reply INTO webhook
await message.answer('Привет')
# return SendMessage(message.chat.id, 'Привет')
async def on_startup(dp):
await bot.set_webhook(WEBHOOK_URL)
# insert code here to run it after start
async def on_shutdown(dp):
logging.warning('Shutting down..')
# insert code here to run it before shutdown
# Remove webhook (not acceptable in some cases)
await bot.delete_webhook()
# Close DB connection (if used)
await dp.storage.close()
await dp.storage.wait_closed()
logging.warning('Bye!')
if __name__ == '__main__':
start_webhook(
dispatcher=dp,
webhook_path=WEBHOOK_PATH,
on_startup=on_startup,
on_shutdown=on_shutdown,
skip_updates=True,
host=WEBAPP_HOST,
port=WEBAPP_PORT,
)
Вот так у меня работает