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())