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

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())
вот результат:

