у меня есть бот на aiogram 2.25.2, мне нужно при старте бота получить json который присылает телеграм боту, важно то, что мне нужен именно исходный вебхук от телеги, а я могу получить лишь его часть, которую беру из объекта Message
1 2 3 |
@dp.message_handler(commands=['start'])
async def start(message: types.Message):
print(message)
|
@l_vinton_l В aiogram, начиная с версии 2.x, при использовании стандартных обработчиков, таких как @dp.message_handler, вы получаете обработанные данные, такие как объект Message. Однако, чтобы получить исходные данные вебхука в формате JSON (весь запрос от Telegram API), вам нужно самостоятельно обрабатывать запросы к вебхуку. Для этого можно использовать встроенные возможности aiohttp, который является основой aiogram, и перехватывать вебхуки на уровне HTTP-запросов. Вот пример, как это можно сделать:
Мой пример
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
from aiogram import Bot, Dispatcher, types from aiogram.utils.executor import start_webhook from aiohttp import web import json API_TOKEN = 'YOUR_BOT_API_TOKEN' WEBHOOK_HOST = 'https://site.ru' WEBHOOK_PATH = '/webhook' WEBHOOK_URL = f"{WEBHOOK_HOST}{WEBHOOK_PATH}" bot = Bot(token=API_TOKEN) dp = Dispatcher(bot) # Обработчик для команды start @dp.message_handler(commands=['start']) async def start(message: types.Message): await message.reply("Привет!!!") # Получаем сырой JSON запрос от Telegram и выводим его async def handle_webhook(request): raw_data = await request.text() # Получаем сырые данные запроса print("Полученный вебхук (сырой JSON):") print(raw_data) # Обработка JSON данных update = types.Update(**json.loads(raw_data)) # Передача обработанных данных в aiogram Dispatcher.set_current(dp) Bot.set_current(dp.bot) await dp.process_update(update) return web.Response() # Основная конфигурация для вебхуков async def on_startup(app): await bot.set_webhook(WEBHOOK_URL) async def on_shutdown(app): await bot.delete_webhook() # Настройка веб-приложения aiohttp app = web.Application() app.router.add_post(WEBHOOK_PATH, handle_webhook) if __name__ == '__main__': start_webhook( dispatcher=dp, webhook_path=WEBHOOK_PATH, on_startup=on_startup, on_shutdown=on_shutdown, skip_updates=True, host='localhost', # Укажите ваш хост port=3000 # Укажите ваш порт ) |
@l_vinton_l
Ваш код практически завершен, но есть несколько моментов, которые стоит уточнить и исправить:
Вот улучшенный и прокомментированный код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
from aiogram import Bot, Dispatcher, types
from aiogram.utils.executor import start_webhook
from aiohttp import web
import json
API_TOKEN = 'YOUR_BOT_API_TOKEN'
WEBHOOK_HOST = 'https://your-domain.com'
WEBHOOK_PATH = '/webhook'
WEBHOOK_URL = f"{WEBHOOK_HOST}{WEBHOOK_PATH}"
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
# Обработчик для команды start
@dp.message_handler(commands=['start'])
async def start(message: types.Message):
await message.reply("Привет!!!")
# Получаем сырой JSON запрос от Telegram и выводим его
async def handle_webhook(request):
raw_data = await request.text() # Получаем сырые данные запроса
print("Полученный вебхук (сырой JSON):")
print(raw_data)
# Обработка JSON данных
update = types.Update(**json.loads(raw_data))
# Передача обработанных данных в aiogram
Dispatcher.set_current(dp)
Bot.set_current(dp.bot)
await dp.process_update(update)
return web.Response(status=200) # Убедитесь вернуть 200
# Основная конфигурация для вебхуков
async def on_startup(app):
await bot.set_webhook(WEBHOOK_URL)
async def on_shutdown(app):
await bot.delete_webhook()
# Настройка веб-приложения aiohttp
app = web.Application()
app.router.add_post(WEBHOOK_PATH, handle_webhook)
if __name__ == '__main__':
start_webhook(
dispatcher=dp,
webhook_path=WEBHOOK_PATH,
on_startup=on_startup,
on_shutdown=on_shutdown,
skip_updates=True,
host='localhost', # Укажите ваш хост
port=3000 # Укажите ваш порт
)
|
Убедитесь, что работаете в среде, где сервер может принимать HTTP-запросы. Для локальной разработки вам может понадобиться туннелирование, например с помощью ngrok, чтобы открытый URL (WEBHOOK_HOST) указывал на ваш локальный сервер.