【问题标题】:How to select one message from others telebot?如何从其他远程机器人中选择一条消息?
【发布时间】:2020-11-11 17:17:42
【问题描述】:

我正在为一家房地产中介制作机器人。 Bot 发送包含有关公寓信息的消息。 Bot 可以一次发送多条消息供用户选择。如何实现选择其中一条消息的过程?当我在消息上创建内联按钮时,当用户单击它时,由于某种原因,最后一条消息的 id 会返回给机器人,也就是说,如果机器人已经发送了三个带有“选择”按钮的消息,然后当第一个被点击时,最后一个被返回。我想这样做,例如,用户可以回复一条消息,从而选择一个特定的消息,但我不明白如何将用户的消息与他回复的消息关联起来。我怎样才能做得更好?

【问题讨论】:

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


    【解决方案1】:

    当用户点击它时,由于某种原因,最后一个的 id 消息返回给机器人

    这不是预期的行为,如果您发送 3 条包含内联按钮键盘的不同消息,则单击任何按钮后,将创建一个新的 callbackquery 更新,其中包含用户单击其按钮的消息 ID好。您应该检查一下以确保。

    你需要的是callback_data:

    InlineKeyboardButtoncallback_data 字段。这是专门为您的目的而存在的,您可以将 apartment_id 放在 callback_data 中,然后当用户单击任何按钮时,您还将收到 callback_data 并且您将知道用户单击了哪个 apartment_id开。

    你没有提到你使用哪个库,但是在 python 中的一个库上查看这个example

    def start(update: Update, context: CallbackContext) -> None:
        keyboard = [
            [
                InlineKeyboardButton("Option 1", callback_data='1'),
                InlineKeyboardButton("Option 2", callback_data='2'),
            ],
            [InlineKeyboardButton("Option 3", callback_data='3')],
        ]
    
        reply_markup = InlineKeyboardMarkup(keyboard)
    
        update.message.reply_text('Please choose:', reply_markup=reply_markup)
    
    def button(update: Update, context: CallbackContext) -> None:
        query = update.callback_query
    
        # CallbackQueries need to be answered, even if no notification to the user is needed
        # Some clients may have trouble otherwise. See https://core.telegram.org/bots/api#callbackquery
        query.answer()
    
        query.edit_message_text(text="Selected option: {}".format(query.data))
    
    def main():
        # Create the Updater and pass it your bot's token.
        # Make sure to set use_context=True to use the new context based callbacks
        # Post version 12 this will no longer be necessary
        updater = Updater("TOKEN", use_context=True)
    
        updater.dispatcher.add_handler(CommandHandler('start', start))
        updater.dispatcher.add_handler(CallbackQueryHandler(button))
    

    在示例中,如果用户单击第一个按钮Option 1,则button 函数内的query 将为“1”。如果他们点击第二个按钮Option 2,那么您将收到2 作为query。现在,您可以存储每个公寓的 ID,而不是 12。如果您有多种用途的按钮,您可以使用以下短语来区分它们:apartment_id:1close_button。在处理更新时,您可以通过: 拆分查询,如果split[0]apartment_id,那么您将处理split[2],否则您将知道用户点击了其他按钮。

    所以callback_data 是一个有限的数据库作为此类问题的解决方案。

    【讨论】:

      猜你喜欢
      • 2019-01-31
      • 2019-12-23
      • 2022-01-19
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-23
      • 2020-12-06
      相关资源
      最近更新 更多