Загрузка...

Python
Telegram feedback bot

Thread in Your projects created by ОпытныйПетросян Feb 18, 2026. 150 views

  1. ОпытныйПетросян
    ОпытныйПетросян Topic starter Feb 18, 2026 11 Dec 18, 2023
    бот обратной связи ( думаю кому-то понадобится )​
    Python
    """
    Telegram бот обратной связи
    Пользователи пишут боту -> сообщения приходят админу -> админ отвечает от имени бота
    """

    import asyncio
    import logging
    from aiogram import Bot, Dispatcher, types, F
    from aiogram.filters import Command
    from aiogram.types import Message

    # ==================== НАСТРОЙКИ ====================
    BOT_TOKEN = "ТОКЕН_БОТА" # Получить у @BotFather
    ADMIN_ID = ТВОЙ_ID # Ваш Telegram ID (узнать у @userinfobot)
    # ===================================================

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

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

    # Словарь для хранения связи: message_id в чате админа -> user_id отправителя
    message_to_user = {}


    @dp.message(Command("start"))
    async def cmd_start(message: Message):
    """Обработка команды /start"""
    if message.from_user.id == ADMIN_ID:
    await message.answer(
    " <b>Панель администратора</b>\n\n"
    "Вы будете получать сообщения от пользователей.\n"
    "Чтобы ответить - просто <b>ответьте (reply)</b> на пересланное сообщение.\n\n"
    "Команды:\n"
    "/stats - статистика бота",
    parse_mode="HTML"
    )
    else:
    await message.answer(
    " <b>Добро пожаловать!</b>\n\n"
    "Напишите ваше сообщение, и мы обязательно вам ответим.",
    parse_mode="HTML"
    )


    @dp.message(Command("stats"))
    async def cmd_stats(message: Message):
    """Статистика бота (только для админа)"""
    if message.from_user.id == ADMIN_ID:
    await message.answer(
    f" <b>Статистика</b>\n\n"
    f"Активных диалогов в памяти: {len(message_to_user)}",
    parse_mode="HTML"
    )


    @dp.message(F.reply_to_message, F.from_user.id == ADMIN_ID)
    async def admin_reply(message: Message):
    """Обработка ответа админа на сообщение пользователя"""

    replied_msg_id = message.reply_to_message.message_id

    # Проверяем, есть ли связь с пользователем
    if replied_msg_id not in message_to_user:
    await message.answer(" Не удалось найти пользователя для этого сообщения.")
    return

    user_id = message_to_user[replied_msg_id]

    try:
    # Отправляем ответ пользователю
    if message.text:
    await bot.send_message(user_id, message.text)
    elif message.photo:
    await bot.send_photo(user_id, message.photo[-1].file_id, caption=message.caption)
    elif message.video:
    await bot.send_video(user_id, message.video.file_id, caption=message.caption)
    elif message.document:
    await bot.send_document(user_id, message.document.file_id, caption=message.caption)
    elif message.voice:
    await bot.send_voice(user_id, message.voice.file_id)
    elif message.audio:
    await bot.send_audio(user_id, message.audio.file_id, caption=message.caption)
    elif message.sticker:
    await bot.send_sticker(user_id, message.sticker.file_id)
    elif message.video_note:
    await bot.send_video_note(user_id, message.video_note.file_id)
    else:
    await message.answer(" Этот тип сообщения не поддерживается.")
    return

    await message.answer(" Сообщение отправлено!")
    logger.info(f"Админ ответил пользователю {user_id}")

    except Exception as e:
    await message.answer(f" Ошибка отправки: {e}")
    logger.error(f"Ошибка отправки пользователю {user_id}: {e}")


    @dp.message(F.from_user.id == ADMIN_ID)
    async def admin_message(message: Message):
    """Сообщения админа без reply - игнорируем или показываем подсказку"""
    await message.answer(
    " Чтобы ответить пользователю, используйте <b>reply</b> на его сообщение.",
    parse_mode="HTML"
    )


    @dp.message()
    async def user_message(message: Message):
    """Обработка сообщений от пользователей"""

    user = message.from_user
    user_info = (
    f" <b>Сообщение от пользователя</b>\n"
    f"├ ID: <code>{user.id}</code>\n"
    f"├ Имя: {user.first_name or ''} {user.last_name or ''}\n"
    f"└ Username: @{user.username if user.username else 'нет'}\n"
    f"{'─' * 30}"
    )

    try:
    # Отправляем информацию о пользователе
    await bot.send_message(ADMIN_ID, user_info, parse_mode="HTML")

    # Пересылаем само сообщение и сохраняем связь
    if message.text:
    sent = await bot.send_message(ADMIN_ID, f" {message.text}")
    elif message.photo:
    sent = await bot.send_photo(
    ADMIN_ID,
    message.photo[-1].file_id,
    caption=f" Фото\n{message.caption or ''}"
    )
    elif message.video:
    sent = await bot.send_video(
    ADMIN_ID,
    message.video.file_id,
    caption=f" Видео\n{message.caption or ''}"
    )
    elif message.document:
    sent = await bot.send_document(
    ADMIN_ID,
    message.document.file_id,
    caption=f" Документ\n{message.caption or ''}"
    )
    elif message.voice:
    sent = await bot.send_voice(ADMIN_ID, message.voice.file_id, caption=" Голосовое")
    elif message.audio:
    sent = await bot.send_audio(
    ADMIN_ID,
    message.audio.file_id,
    caption=f" Аудио\n{message.caption or ''}"
    )
    elif message.sticker:
    sent = await bot.send_sticker(ADMIN_ID, message.sticker.file_id)
    elif message.video_note:
    sent = await bot.send_video_note(ADMIN_ID, message.video_note.file_id)
    else:
    sent = await bot.send_message(ADMIN_ID, " Получено сообщение неизвестного типа")

    # Сохраняем связь между сообщением и пользователем
    message_to_user[sent.message_id] = user.id

    # Подтверждение пользователю
    await message.answer(" Ваше сообщение отправлено! Мы скоро ответим.")
    logger.info(f"Сообщение от {user.id} переслано админу")

    except Exception as e:
    await message.answer(" Произошла ошибка. Попробуйте позже.")
    logger.error(f"Ошибка пересылки сообщения: {e}")


    async def main():
    """Запуск бота"""
    logger.info("Бот запускается...")

    # Удаляем webhook (если был) и запускаем polling
    await bot.delete_webhook(drop_pending_updates=True)
    await dp.start_polling(bot)


    if __name__ == "__main__":
    asyncio.run(main())
    Активация: py bot.py
    Важно если вы закроете командную строку то бот работать не будет​
     
  2. modafinil
    Мог бы скрины приложить хотя бы, ну по приколу даже
    И вырезать комментарии нейрослопа ботов таких уйма уже
     
Loading...