Исправить код для бота обратной связи

Пользователь пишет сообщение боту. Оно пересылается в группу. Я хочу ответить, но бот не отправляет сообщение пользователю, а просто дублирует мое и отправляет в группу.

123

import logging
import asyncio
from aiogram import Bot, Dispatcher, types
from aiogram.fsm.storage.memory import MemoryStorage
from aiogram.filters import Command

API_TOKEN = '...'
ADMIN_GROUP_ID = ... # ID чата

# Настройка логирования
logging.basicConfig(level=logging.INFO)

# Инициализация бота и диспетчера
bot = Bot(token=API_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(storage=storage)

# Словарь для хранения соответствия между ID сообщений и ID пользователей
user_ids = {}


async def send_welcome(message: types.Message):
    welcome_text = (
        "Этот бот создан для поддержки и общения. Если тебе плохо как морально, так и физически, "
        "или тебе просто не с кем пообщаться, то этот бот для тебя! Тут самые комфортные админы "
        "(и не бойтесь владельцев). Они помогут вам в трудную минуту разобраться со всем, поддержат "
        "и дадут хороший совет. Возможно, они будут подходить вам полностью по вкусу или по общению! "
        "В общем, не буду задерживать, удачного разговора!"
    )
    await message.answer(welcome_text)


async def handle_message(message: types.Message):
    # Сохраняем ID пользователя и пересылаем сообщение в группу админов
    user_ids[message.message_id] = message.from_user.id  # Сохраняем ID пользователя по ID сообщения
    await message.forward(ADMIN_GROUP_ID)


async def handle_admin_response(message: types.Message):
    # Проверяем, что сообщение пришло из группы админов и является ответом на сообщение пользователя
    if message.chat.id == ADMIN_GROUP_ID and message.reply_to_message:
        original_message_id = message.reply_to_message.message_id  # Получаем ID оригинального сообщения

        # Получаем ID пользователя из словаря user_ids
        user_id = user_ids.get(original_message_id)

        if user_id:
            await bot.send_message(user_id, f"Ответ от админа:\n\n{message.text}")
            await message.answer("Ваш ответ был отправлен пользователю.") # Подтверждение отправки ответа

            # Удаляем запись о пользователе после отправки ответа (по желанию)
            del user_ids[original_message_id]
        else:
            logging.warning("Не удалось найти ID пользователя для ответа.")

# Регистрация обработчиков сообщений
dp.message.register(send_welcome, Command("start"))
dp.message.register(handle_message, lambda message: not message.text.startswith('/'))
dp.message.register(handle_admin_response)

async def main():
    await dp.start_polling(bot)

if __name__ == '__main__':
    asyncio.run(main())

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

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

в общем, решение какое-то у меня корявое, но все же. я не понял как заставить бота воспринимать сообщения в группе, чтобы он ссылался на обработчик handle_admin_response, поэтому уместил все в handle_message

import logging
import asyncio
from aiogram import Bot, Dispatcher, types, F
from aiogram.fsm.storage.memory import MemoryStorage
from aiogram.filters import Command, and_f

API_TOKEN = ''
ADMIN_GROUP_ID = 

logging.basicConfig(level=logging.INFO)

bot = Bot(token=API_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(storage=storage)

user_ids = {}


async def send_welcome(message: types.Message):
    welcome_text = (
        "Этот бот создан для поддержки и общения. Если тебе плохо как морально, так и физически, "
        "или тебе просто не с кем пообщаться, то этот бот для тебя! Тут самые комфортные админы "
        "(и не бойтесь владельцев). Они помогут вам в трудную минуту разобраться со всем, поддержат "
        "и дадут хороший совет. Возможно, они будут подходить вам полностью по вкусу или по общению! "
        "В общем, не буду задерживать, удачного разговора!"
    )
    await message.answer(welcome_text)


async def handle_message(message: types.Message):
    if message.chat.id != ADMIN_GROUP_ID:
        # Сохраняем связь: ID сообщения пользователя -> user_id
        user_ids[message.message_id] = message.from_user.id

        # Пересылаем сообщение в группу
        forwarded = await message.forward(ADMIN_GROUP_ID)

        # Теперь связываем ID пересланного сообщения в группе с оригинальным message_id
        user_ids[forwarded.message_id] = message.from_user.id

    else:
        original_message = message.reply_to_message
        if original_message:
            original_message_id = original_message.message_id
            user_id = user_ids.get(original_message_id)

            if user_id:
                try:
                    await bot.send_message(user_id, f"Ответ от админа:\n\n{message.text}")
                    await message.answer("✅ Ответ успешно отправлен пользователю.")
                except Exception as e:
                    logging.error(f"Ошибка при отправке сообщения пользователю: {e}")
                    await message.answer("❌ Не удалось отправить сообщение пользователю.")

                # Удалить запись после использования
                user_ids.pop(original_message_id, None)
            else:
                await message.answer("⚠️ Не найден пользователь для этого сообщения.")


dp.message.register(send_welcome, Command("start"))
dp.message.register(handle_message, lambda m: not m.text.startswith('/'))

async def main():
    await dp.start_polling(bot)

if __name__ == '__main__':
    asyncio.run(main())

вот результат:

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка