Как получить исходный вебхук от телеграма?

L

Пользователь

от l_vinton_l , в категории: Python , 2 месяца назад

у меня есть бот на aiogram 2.25.2, мне нужно при старте бота получить json который присылает телеграм боту, важно то, что мне нужен именно исходный вебхук от телеги, а я могу получить лишь его часть, которую беру из объекта Message

1
2
3
@dp.message_handler(commands=['start'])
async def start(message: types.Message):
     print(message)


Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от jaren , 2 месяца назад

@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          # Укажите ваш порт
    )