Загрузка...

How to send any type of message on behalf of the aiogram v3.7 bot?

Thread in Python created by appi_developer Dec 7, 2024. 272 views

  1. appi_developer
    appi_developer Topic starter Dec 7, 2024 92 Jan 12, 2023
    Привет :hi:
    Не могу придумать как реализовать мою идею: Всё происходит в топике. Админ отвечает на сообщение формата
    Клиент: @sdfsdfsdcsdfsfssdfsd
    ID: 832484284
    Из этого сообщения мы получаем user_id, куда слать ответ. Дальше мне нужно чтобы по заданному user_id отправлялся любой тип данных - текст, фото, всё что угодно, с учётом форматирования. Мне нужно отправить полную копию сообщения от имени бота, помогите реализовать пж.
    Вот это не работает, везде тип сообщения: ContentType.TEXT. Как использовать copy для моей задачи я не разобрался :meow2:

    Python

    @router.message(F.reply_to_message)
    async def handle_operator_reply(message: types.Message, state: FSMContext):
    if message.chat.id == int(TP_CHAT_ID):
    if " Клиент:" in message.reply_to_message.text and " ID:" in message.reply_to_message.text:
    client_id = int(message.reply_to_message.text.split("\n")[1].split(": ")[1])

    # Определяем тип сообщения в оригинальном сообщении (reply_to_message)
    reply_message = message.reply_to_message
    print(f"Тип сообщения: {reply_message.content_type}")

    # Обработка разных типов медиа-контента
    if reply_message.photo:
    # Отправка фото
    await bot.send_photo(chat_id=client_id, photo=reply_message.photo[-1].file_id, caption=message.caption)
    elif reply_message.video:
    # Отправка видео
    await bot.send_video(chat_id=client_id, video=reply_message.video.file_id, caption=message.caption)
    elif reply_message.document:
    # Отправка документов
    await bot.send_document(chat_id=client_id, document=reply_message.document.file_id, caption=message.caption)
    elif reply_message.audio:
    # Отправка аудио
    await bot.send_audio(chat_id=client_id, audio=reply_message.audio.file_id, caption=message.caption)
    elif reply_message.sticker:
    # Отправка стикеров
    await bot.send_sticker(chat_id=client_id, sticker=reply_message.sticker.file_id)
    elif reply_message.text:
    # Отправка текстового сообщения
    await bot.send_message(chat_id=client_id, text=message.text)

    else:
    print("ID чата не совпадает с TP_CHAT_ID")
     
  2. INACTIV_US_125
    INACTIV_US_125 Dec 7, 2024 BARABAN 269 Dec 4, 2024
    Тебе нужно сохранить форматирование пользователя?
     
    1. appi_developer Topic starter
      INACTIV_US_125, мне приходит сообщение от пользователя (bot.forward_message) в топик -> под ним приходит сообщение формата
      Клиент: @sdfsdfsdcsdfsfssdfsd
      ID: 832484284
      -> Админ отвечает на сообщение с ID -> Бот отправляет ответ админа по заданному ID

      Мне нужно чтобы форматирование сообщения админа осталось в исходном виде.
    2. appi_developer Topic starter
      INACTIV_US_125, нужно как-то копировать введенное сообщение, а потом отсылать его по ID. При этом это может быть и фото, и текст, и стикер
    3. INACTIV_US_125
      appi_developer, В обработчике ответа сделай получение сообщения в парс моде (В твоем случае markdown) и отправляй полученный текст в формате parse_mode='MarkdownV2'
  3. id534089641
    чат гпт все проблемы решит, я через него с 0 знаний питона написал код который открывает бота в тг с 4 разных акков
     
    1. View previous comments (1)
    2. id534089641
      appi_developer, я просто отправлял ему ошибки, и ждал пока код не заработает с его фиксами, ахах
    3. appi_developer Topic starter
      id534089641, тут машине не объяснить чё ты хочешь, гпт тупой до жути
    4. appi_developer Topic starter
      id534089641, он мне делает обработчик для каждого типа данных, хотя я прошу от него другое
  4. INACTIV_US_125
    INACTIV_US_125 Dec 7, 2024 BARABAN 269 Dec 4, 2024
    Python
    # В твоем случае в aiogram нет прямого конвертации из markdown -> html для отправки конкретно твоей задачи
    # Я не помню точно будет работать ли такой вариант
    # Так что тестируй

    # Первый варик

    ...
    text=message.text_html,
    parse_mode="HTML"
    ...

    # Второй варик

    def markdown_to_html(markdown_text: str) -> str:
    html_text = markdown_text
    html_text = html_text.replace('*', '<b>').replace('_', '<i>')
    html_text = html_text.replace('<b>', '<b>').replace('</b>', '</b>')
    html_text = html_text.replace('<i>', '<i>').replace('</i>', '</i>')
    return html_text


    # Преобразуем Markdown в HTML
    html_text = markdown_to_html(message.text)

    # Отправляем HTML текст обратно
    ...
    html_text,
    parse_mode='HTML'
    ...
     
    1. View previous comments (5)
    2. INACTIV_US_125
      appi_developer, Так интересно кнш почему не работает если это базовая фигня, напиши мне утром помогу
    3. appi_developer Topic starter
      INACTIV_US_125, могу тебе в тг видос скинуть как должно работать, может мысли появятся :peperain:
  5. appi_developer
    appi_developer Topic starter Dec 7, 2024 92 Jan 12, 2023
    Финальное решение проблемы:
    Python
    @router.message(F.reply_to_message)
    async def handle_operator_reply(message: types.Message, state: FSMContext):
    try:
    if message.chat.id == int(TP_CHAT_ID):
    if message.reply_to_message and " Воркер:" in message.reply_to_message.text and " ID:" in message.reply_to_message.text:
    client_id = int(message.reply_to_message.text.split("\n")[1].split(": ")[1])

    reply_markup = message.reply_markup # Получаем inline клавиатуру (если она есть)

    await message.bot.copy_message(
    chat_id=client_id,
    from_chat_id=message.chat.id,
    message_id=message.message_id,
    reply_markup=reply_markup
    )

    await message.answer(text=f'<b>Сообщение успешно отправлено воркеру <code>{client_id}</code></b>')
     
Top
Loading...