Ошибка при попытке получить аватар пользователя telegram

Я хочу сделать команду вывода аватара пользователя в телеграм боте. Имеется следующий код:

@dp.message_handler(commands=['avatar', 'ава', 'аватар'])
async def avatar(message: types.Message):
    if message.reply_to_message:
        await bot.send_photo(message.chat.id, photo=message.reply_to_message.from_user.get_profile_photos)
        await bot.send_message(message.chat.id, f'Аватар пользователя {message.reply_to_message.from_user.first_name}')
    elif not message.reply_to_message:
        await bot.send_photo(message.chat.id, photo=message.from_user.get_profile_photos)
        await bot.send_message(message.chat.id, f'{message.from_user.first_name} вот ваш аватар')

В результате выполнения получаю ошибку:

TypeError: Can not serialize value type: <class 'method'>

 headers: {}

 value: <bound method User.get_profile_photos of <aiogram.types.user.User object at 0x000001E57C1404F0>>

Как можно решить данный вопрос? Как получать аватар указанного пользователя и свой?


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

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

Я уверен, что делаю совсем неправильно, но я покажу, как это сделал я, не бейте тапками.

@dp.message_handler(commands=["start"])
async def strt(m: types.Message):
    a = await m.from_user.get_profile_photos()
    foto = a.photos[0][1].file_id
    print(foto)
    cap = a.total_count
    await bot.send_photo(m.from_user.id, foto, cap)

Как минимум, это работает.

→ Ссылка
Автор решения: Alex

Я доработал вариант пользователя @GTapok, для своего бота. Теперь можно ответив на сообщение другого пользователя, получить его аватарку. А еще сделал отлавливание ошибки на случай если человек не позволяет смотреть его фото, либо когда в его профиле не имеется фотографий.

Вот доработанная версия кода:

async def ava(message: types.Message):
    try:

        if not message.reply_to_message:
            a = await message.from_user.get_profile_photos()
            foto = a.photos[0][1].file_id
            #print(foto)
            cap = str(a.total_count)
            await bot.send_photo(message.chat.id, foto, 'Аватар профиля. '+ 'Общее количество фотографий в профиле: ' + cap)
            await message.delete()

        elif message.reply_to_message and not message.reply_to_message.from_user.is_bot:
            a = await message.reply_to_message.from_user.get_profile_photos()
            foto = a.photos[0][1].file_id
            # print(foto)
            cap = str(a.total_count)
            await bot.send_photo(message.chat.id, foto,
                                 'Аватар профиля. ' + 'Общее количество фотографий в профиле: ' + cap)
            await message.delete()

        elif message.reply_to_message.from_user.is_bot:
            await message.delete()
            itsbot = await bot.send_message(message.chat.id, '❌ Вы не можете получить аватар бота! Ответьте на сообщение настоящего пользователя.')
            await asyncio.sleep(10)
            await itsbot.delete()


    except Exception as e:
        print('Ошибка при получении аватара' + '\n' + f'{e}')
        await message.delete()
        er = await bot.send_message(message.chat.id,
        '❌ Произошла ошибка при получении аватара пользователя!\nВозможно это случилось из-за настроек приватности пользователя.\nЛибо в профиле выбранного пользователя отсутствуют фотографии.')
        await asyncio.sleep(15)
        await er.delete()

Для чистоты чата использовал asyncio.sleep() . Чтобы удалять сообщения с ошибкой через какое-то время.

→ Ссылка