Как найти, какая часть текстового сообщения имеет вложенную ссылку / и открыть ее?

#python #telegram #telegram-bot #telethon

#python #telegram #telegram-бот #телемарафон

Вопрос:

Пример текстового сообщения, которое я получил в telegram:

Слушайте лучшую музыку: Ava Max — My Head amp; My Heart

Мой вопрос в том, как мой скрипт может проверить сообщение и в конечном итоге открыть сайт по вложенной ссылке? Я попытался:

       for entity in event.message.text:
            if isinstance(entity, MessageEntityTextUrl):
                open_url(entity.url)
 

но не повезло — скрипт не открывает ссылку.

// Редактировать реализованное решение Ватзона:

 async def my_event_handler(event):
            msg = event.message.message
            for _, inner_text in msg.get_entities_text(MessageEntityTextUrl):
                    open_url(inner_text)
 

и теперь ошибка:

 ...in my_event_handler
    for _, inner_text in msg.get_entities_text(MessageEntityTextUrl):
AttributeError: 'str' object has no attribute 'get_entities_text'
 

Должно быть, я пропустил свою ошибку здесь, что я должен изменить в сообщении?

// Edit2

 msg = event.message
 

исправлена ошибка, но я все еще не получаю ссылку в качестве вывода.

Комментарии:

1. что такое entity здесь? Можете ли вы распечатать его и поделиться им? Потому что if .text если строка, то это только один символ

2. В вашей реализации ответа @watzon просто определите msg как msg = event.message . event.message.message это строковое представление сообщения, поэтому у него нет атрибута 'get_entities_text' .

3. @druskacik большое вам спасибо, ошибка больше не появляется, но следующая проблема заключается в том, что inner_text на самом деле является видимым текстом вложенной ссылки, а не ссылкой, которую я могу открыть. Итак, глядя на пример с песней Ava Max выше, мой вывод: «Ava Max — моя голова и мое сердце» , НО должен быть youtube.com /…. Как я могу этого добиться? правильно ли здесь используется MessageEntityTextUrl ?

4. Пожалуйста, проверьте _ , содержит ли переменная URL-адрес? Вы могли бы переписать это как for url, inner_text in msg.get_entities_text(MessageEntityTextUrl): open_url(url)

5. @druskacik так просто, но так хорошо, спасибо! ‘_’ содержал смещение, длину, URL и т. Д. Объекта сообщения, Поэтому я использовал openURL( _.url ), и теперь он действительно открывает вложенную ссылку. Насколько я проверил некоторые случаи, есть и другие проблемы, но я думаю, что мы закончили с этой проблемой. Большое вам спасибо.

Ответ №1:

Правильная реализация ответа @watzon будет выглядеть примерно так:

 from telethon.tl.types import MessageEntityTextUrl

async def my_event_handler(event):
    msg = event.message
    for url_entity, inner_text in msg.get_entities_text(MessageEntityTextUrl):
        url = url_entity.url
        open_url(url)
        ...
 

Ответ №2:

Вы должны использовать message.get_entities_text() .

Пример:

 for _, inner_text in message.get_entities_text(MessageEntityTextUrl):
  open_url(inner_text)
 

В качестве альтернативы вы можете не указывать аргумент фильтра и перебирать все предоставленные объекты, но, учитывая ваш пример кода, это должно работать на месте.

Комментарии:

1. Спасибо за действительно быстрый ответ. Я реализовал ваше решение и получил ошибку «Нет атрибута», не могли бы вы сказать мне, как правильно определить переменную сообщения? (сообщение в моем случае).

2. @RektLeft в чем была ошибка? Вы должны быть в состоянии получить сообщение от события. Обычно вы используете @client.on(events.NewMessage) для оформления метода, и у этого метода будет event аргумент. В этом случае event.message вы получите сообщение, которое вызвало событие.