#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
вы получите сообщение, которое вызвало событие.