Как админу отвечать на присланную фотографию от пользователя из бота aiogram

Бот нужен для поддержки. Пользователь пишет что-либо боту, а тот пересылает все админу. С обычными сообщениями я разобрался, а как это сделать с фото?

from aiogram import Bot, Dispatcher, executor, types
from aiogram import *
from aiogram.types import *


TOKEN = ""
admin_id = xxxx


bot = Bot(token=TOKEN)
dp = Dispatcher(bot)


@dp.message_handler(commands=['start'])
async def process_start_command(message: types.Message):
    if message['from'].id == admin_id:
        await message.answer(f"Hi, admin")
    else:
        await message.answer(f"✋Здравствуйте, {message['from'].first_name}, напишите нам ваш вопрос и мы ответим вам в ближайшее время!")

        
@dp.message_handler()
async def process_start_command(message: types.Message):
    if message.reply_to_message == None:
        if '/start' not in message.text:
            await bot.forward_message(admin_id, message.from_user.id, message.message_id)
            f = open('users.txt', "a")
            sms = message.text + ":" + str(message.from_user.id)
            f.write(sms + '\n')
    else:
        
        if message.from_user.id == admin_id:
            f = open('users.txt', 'r')
            for i in f.readlines():
                if message.photo is not None:
                    print(message.photo)
                    if message.photo[-1].file_id in i:
                        u_id = i.split(':')[1]
                    else:
                        print('non')
                elif message.reply_to_message.text in i:
                    u_id = i.split(':')[1]
                    print(u_id)
            await bot.send_message(u_id, message.text)
        else:
            await message.answer('Нельзя отвечать на сообщения.')
       

            
@dp.message_handler(content_types=['photo'])
async def handle_docs_photo(message):
    photo_id = message.photo[-1].file_id
    print(photo_id)

    f = open('users.txt', "a")
    sms = photo_id + ":" + str(message.from_user.id)
    f.write(sms + '\n')
    await bot.forward_message(admin_id, message.from_user.id, message.message_id)

    
@dp.message_handler(content_types=['document'])
async def handle_docs_photo(message):

    await bot.forward_message(admin_id, message.from_user.id, message.message_id)

    
if __name__ == '__main__':
    print("starting")
    executor.start_polling(dp)

В handle_docs_photo сохраняется id фотографии и записывается в txt вместе с id пользователя, то есть задумка такая, как и с сообщениями, я сохраняю id и через двоеточие id юзера, который это написал, и потом, после if message.from_user.id == admin_id: я открываю txt файл и ищу там это фото с нужынм id, чтоб как раз узнать id пользователя, который мне это фото отправил, но в итоге я получаю

if message.photo[-1].file_id in i:
AttributeError: 'list' object has no attribute 'file_id'

то есть message.photo[-1].file_id почему то пустой Есть идеи, как это исправить? или реализовать по другому

  • важно, чтоб админ мог отвечать именно кнопкой reply

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

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

У тебя второй обработчик не имеет условий, поэтому скорее всего считает вообще все сообщения, поэтому дальше него ничего не идёт.

Обработчики не выполняются последовательно, а лишь до первого совпадения. В данном случае, у тебя всё залетает в @dp.message_handler(), а дальше не идёт.

→ Ссылка