Aiogram 3, как Получить целиком запрос от бота в json

Други, прошу простить за столь **** вопрос, но быстро в лоб не смог найти ответ.

Как можно получить целиком ответ от бота телеграмм в виде json, используя aiogram 3.xx.

В частности, искал, способ получить текущий update_id в процедуре cmd_start, но не смог найти как это сделать методами aiogram, хотел спарсить в лоб из json ответа.

from aiogram import Bot, Dispatcher
from aiogram.types import Message
import asyncio
from aiogram.methods import DeleteWebhook

bot = Bot('12345678:AaBbCcDdEeFfGgHh', parse_mode="HTML")
dp = Dispatcher()

@dp.message()
async def cmd_start(message: Message, bot: Bot):
    if message.text == 'exit':
        print("exit - ", str(message.chat.username))
        await message.answer("exiting...")
        await dp.stop_polling()
        await bot.session.close()

    await bot.send_message(message.from_user.id, f"Hello! {message.from_user.first_name} {message.from_user.id}!")
    await message.answer("<tg-spoiler>test spoiler!</tg-spoiler>")
    await message.reply("test reply")


# Запуск процесса поллинга новых апдейтов
async def main():
    await bot(DeleteWebhook(drop_pending_updates=True))  # отключаем обновления
    await dp.start_polling(bot, skip_updates=True)
if __name__ == "__main__":
    asyncio.run(main())

Ответы (2 шт):

Автор решения: CausonQ

Можно использовать метод model_dump_json()

Например:

@dp.message()
async def cmd_start(message: Message, bot: Bot):
    if message.text == 'exit':
        print("exit - ", str(message.chat.username))
        print (message.model_dump_json())               #тут
        await message.answer("exiting...")
        await dp.stop_polling()
        await bot.session.close()
→ Ссылка
Автор решения: de za

PS а до самого update_id обновления, так и не докопался :( Покурив интернет, и используя подсказку уважаемого @CausonQ наваял такую функцию - get_data_message, которая конвертит json 2 dict. возможно кому-то пригодится

from aiogram.methods import DeleteWebhook
import asyncio
import logging
from aiogram.types import Message
from aiogram import Bot, Dispatcher, F
from typing import Dict
# BOT_TOKEN='' # - заменить значение переменной на свое, а этот импорт удалить: from core.settings import BOT_TOKEN
from core.settings import BOT_TOKEN
bot = Bot(BOT_TOKEN,
          parse_mode="HTML")
dp = Dispatcher()
logging.basicConfig(level=logging.INFO,
                    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
                    "(%(filename)s:%(lineno)d - %(message)s)")

# функция для конвертации json в словарь, key - value
async def get_data_message(data_message: Dict, prefix: str = '', sep: str = '.'):
    correct_dict = {}
    for key, value in data_message.items():
        if value != None:
            if isinstance(value, Dict):
                correct_dict.update(await get_data_message(data_message=value, prefix=f'{prefix}{key}{sep}'))
            else:
                correct_dict[f'{prefix}{key}'] = value
    return correct_dict


@dp.message(F.text)
async def get_text(message: Message):
    await message.answer(message.text) # эхо сообщение
    for key, value in (await get_data_message(data_message=message.model_dump())).items(): # выводим json на экран
        print(f'{key} - {value}')
    


async def main():

    # dp.message.register(get_text, F.text)
    await bot(DeleteWebhook(drop_pending_updates=True))  # отключаем обновления
    try:
        await dp.start_polling(bot, skip_updates=True)
    finally:
        await bot.session.close()


if __name__ == "__main__":
    asyncio.run(main())
   
→ Ссылка