Ошибка при попытке получить аватар пользователя 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 шт):
Я уверен, что делаю совсем неправильно, но я покажу, как это сделал я, не бейте тапками.
@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)
Как минимум, это работает.
Я доработал вариант пользователя @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() . Чтобы удалять сообщения с ошибкой через какое-то время.