【问题标题】:Parsing entities of text message in telegram bot sent BY the user解析用户发送的电报机器人中的文本消息实体
【发布时间】:2022-01-13 21:35:10
【问题描述】:

我正在编写一个电报机器人,它需要知道用户如何对文本进行风格化(粗体、斜体、删除线、剧透等)。但我不清楚如何做到这一点,甚至是否可能。我正在使用 python 和 python-telegram-bot 包。我已经弄清楚了如何通过让 Dispatcher 解析在 markdown 中发送给用户的消息来发送风格化的消息。但是我怎样才能做同样的事情来接收消息呢?

举一个非常简单的例子,让我们以这个只有“启动”命令的机器人为例。

def start_command(update, context):
    update.message.reply_text(context.args) # reply message back to the user

def main():
    defaults = Defaults(parse_mode='MarkdownV2')

    updater = Updater(API_KEY, use_context=True, defaults=defaults)
    dp = updater.dispatcher

    dp.add_handler(CommandHandler("start", start_command))

    updater.start_polling(0)
    updater.idle()

我怎样才能让它知道用户的参数是粗体、斜体等?

为了清楚起见,我希望能够区分:

  • /开始你好
  • /start 你好
  • /开始你好
  • ...

【问题讨论】:

    标签: python telegram telegram-bot python-telegram-bot


    【解决方案1】:

    根据您的用例,您可以使用以下几种方法之一:

    • Message.entitiesMessageEntity 对象的列表,告诉您文本的格式。但是,由于 MessageEntity 仅包含有关偏移量和长度的信息,因此获取实体格式化的文本有点棘手。
    • PTB 提供方便的方法Message.parse_entityMessage.parse_entities。第一个接受Message.entities 的一个元素并返回该实体覆盖的文本。第二个返回一个字典,其中键是Message.enities 的元素,值是Message.parse_entity 对应的返回值。
    • 最后,Message.text_htmlMessage.text_markdown_v2 是方便的属性,可以为您提供插入了相应标记的文本。例如。 message.reply_html(message.text_html) 将发送格式与 message 完全相同的消息。

    免责声明:我目前是python-telegram-bot 的维护者。

    【讨论】:

      【解决方案2】:

      用于检索用户发送的消息的方法getUpdates 允许您在用户消息中收集所有提到的实体。

      每个 Update 对象包含一个 Message 对象,您可以轻松找到相关实体努力去做。

      按照官方Telegram's Message object representation,每个Message对象都有一个名为entities的字段,它是一个MessageEntity的数组。 p>

      假设我发送了这样一条短信: "纯文本粗体文本 斜体文本"

      Update 对象的结构如下:

      {
      "message": {
          "message_id": 181,
          "from": {
              "id": user_id,
              "is_bot": false,
              "first_name": "first_name",
              "username": "username",
              "language_code": "en"
          },
          "chat": {
              "id": user_id,
              "first_name": "first_name",
              "username": "username",
              "type": "private"
          },
          "date": 1642080625,
          "text": "plain text bold text italic text",
          "entities": [{
              "offset": 11,
              "length": 10,
              "type": "bold"
          },  {
              "offset": 21,
              "length": 11,
              "type": "italic"
          }]
      }
      

      由于偏移量、该实体的长度及其类型,您可以很容易地将每个文本片段关联到它自己的实体。

      在我们的例子中,我们可以理解我们有一个 10 个字符粗体实体,从整个消息的第 11 个字符开始。

      【讨论】:

        猜你喜欢
        • 2017-03-19
        • 1970-01-01
        • 2017-09-01
        • 2016-03-11
        • 2019-12-31
        • 2021-01-29
        • 1970-01-01
        • 2016-06-02
        • 1970-01-01
        相关资源
        最近更新 更多