Загрузка...

Как отправить любой тип сообщения от имени бота aiogram v3.7?

Тема в разделе Python создана пользователем appi_developer 7 дек 2024. 273 просмотра

  1. appi_developer
    appi_developer Автор темы 7 дек 2024 92 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")
     
    7 дек 2024 Изменено
  2. INACTIV_US_125
    INACTIV_US_125 7 дек 2024 BARABAN 269 4 дек 2024
    Тебе нужно сохранить форматирование пользователя?
     
    1. Посмотреть предыдущие комментарии (1)
    2. appi_developer Автор темы
      INACTIV_US_125, нужно как-то копировать введенное сообщение, а потом отсылать его по ID. При этом это может быть и фото, и текст, и стикер
      7 дек 2024 Изменено
    3. INACTIV_US_125
      appi_developer, В обработчике ответа сделай получение сообщения в парс моде (В твоем случае markdown) и отправляй полученный текст в формате parse_mode='MarkdownV2'
      7 дек 2024 Изменено
  3. id534089641
    чат гпт все проблемы решит, я через него с 0 знаний питона написал код который открывает бота в тг с 4 разных акков
     
    1. Посмотреть предыдущие комментарии (1)
    2. id534089641
      appi_developer, я просто отправлял ему ошибки, и ждал пока код не заработает с его фиксами, ахах
      7 дек 2024 Изменено
    3. appi_developer Автор темы
      id534089641, тут машине не объяснить чё ты хочешь, гпт тупой до жути
    4. appi_developer Автор темы
      id534089641, он мне делает обработчик для каждого типа данных, хотя я прошу от него другое
  4. INACTIV_US_125
    INACTIV_US_125 7 дек 2024 BARABAN 269 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. Посмотреть предыдущие комментарии (5)
    2. INACTIV_US_125
      appi_developer, Так интересно кнш почему не работает если это базовая фигня, напиши мне утром помогу
    3. appi_developer Автор темы
      INACTIV_US_125, могу тебе в тг видос скинуть как должно работать, может мысли появятся :peperain:
  5. appi_developer
    appi_developer Автор темы 7 дек 2024 92 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
Загрузка...