【问题标题】:How to find which part of text message has a nested link/and open it?如何找到文本消息的哪一部分有嵌套链接/并打开它?
【发布时间】:2022-01-13 18:49:07
【问题描述】:

我在电报上收到的示例短信:

听最好的音乐: Ava Max - My Head & My Heart

我的问题是,我的脚本如何检查消息并最终通过嵌套链接打开站点? 我试过了:

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

但没有运气 - 脚本无法打开链接。

//编辑 实施 watzon 的解决方案:

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'

我一定是错过了这里的错误,我应该在 msg 中更改什么?

//编辑2

msg = event.message

修复了错误,但我仍然没有得到链接作为输出。

【问题讨论】:

  • 这里的entity 是什么?你能打印出来分享一下吗?因为如果 .text 如果是一个字符串,那么它只有一个字符
  • 在您实现@watzon 的答案时,只需将msg 定义为msg = event.messageevent.message.message 是消息的字符串表示,这就是它没有属性'get_entities_text' 的原因。
  • @druskacik 非常感谢,错误不再出现但下一个问题是 inner_text 实际上是嵌套链接 visible text ,而不是我可以打开的链接。所以看看上面的 Ava Max 歌曲示例,我的输出是:"Ava Max - My Head & My Heart" 但应该是 youtube.com/....我怎样才能做到这一点? MessageEntityTextUrl 在这里的使用方式是否正确?
  • 请检查变量_是否包含url?你可以像for url, inner_text in msg.get_entities_text(MessageEntityTextUrl): open_url(url) 一样重写它
  • @druskacik 如此简单却又如此出色,谢谢! '_' 包含消息实体的偏移量、长度、url 等,所以我使用了 openURL(_.url) 现在它确实打开了一个嵌套链接。就我检查了一些案例而言,还有其他问题,但我认为我们已经解决了这个问题。非常感谢。

标签: python telegram telegram-bot telethon


【解决方案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)
    

    或者,您可以省略 filter 参数并遍历所有提供的实体,但鉴于您的示例代码,这应该可以正常工作。

    【讨论】:

    • 感谢您的快速回答。我实现了您的解决方案并收到“无属性”错误,您能否告诉我定义消息变量的正确方法是什么? (在我的情况下是味精)。
    • @RektLeft 错误是什么?您应该能够从事件中获取消息。通常你会使用@client.on(events.NewMessage) 来装饰一个方法,并且那个方法会有一个event 参数。在这种情况下,event.message 会为您提供触发事件的消息。
    猜你喜欢
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    相关资源
    最近更新 更多