首页 > 解决方案 > 带有 python-telegram-bot 库的 Telegram 机器人

问题描述

我不同意可能是一个非常简单的问题,但我刚刚开始研究 Telegram API,特别是 python-telegram-bot 库,如果这是一个幼稚的问题,请原谅我。简而言之,我想制作一个非常简单的机器人,它允许组成员将“对象”(如通用的东西,而不是 python 对象)连同拥有该对象的成员的名称一起添加到列表中(这个是通过 /add 命令完成的)。我将对象存储为字典的键,其值是成员的名称。这是我到目前为止提出的代码:

import logging
from telegram.ext import Updater
from telegram.ext import CommandHandler
from telegram.ext import MessageHandler, Filters

list_of_stuff = {}

updater = Updater(token='698307431:AAG9kExmheQ5hLvBieJNtsTqV9M4U_GNFv0') 

dispatcher = updater.dispatcher


logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)

updater.start_polling()

def start(bot,update):
    bot.send_message(chat_id=update.message.chat_id, text="I'm a bot, please talk to me!")  

def obj(bot, update):
    list_of_stuff[update.message.text] = update.message.from_user.username

def unknown(bot, update):
    bot.send_message(chat_id=update.message.chat_id, text="Sorry, I didn't understand that command.")

def add(bot, update):
    bot.send_message(chat_id=update.message.chat_id, text="Choose an object.")
    dispatcher.add_handler(MessageHandler(Filters.text, obj))


dispatcher.add_handler(CommandHandler('start', start))

dispatcher.add_handler(CommandHandler('add',add))

dispatcher.add_handler(MessageHandler(Filters.command, unknown))

如您所见,有一个问题:在 obj 函数中,我将发送者的用户名设置为值,而键是我假设将由同一发送者输入的“对象”。问题是,我只想使用 /add 命令来添加“对象”作为键和用户名作为值,我希望组中的每个成员都可以这样做(所以应该是每个成员都可以为其他成员添加“对象”)。但我不知道是否可以以同步的方式在同一个函数(本例中为 /add 命令)中添加两个消息处理程序,即要求用户添加密钥,等待响应,然后then and only then ask to add the value,这意味着第二个send_message应该只在用户输入密钥后出现。

标签: pythontelegrampython-telegram-bot

解决方案


ConversationHandler 对您来说似乎是最合理的解决方案。您需要绘制出您的对话流程。您希望对话中的哪些状态(步骤)?

看一下 ConversationHandler 的 repo 简单示例:ConversationHandler 状态图

  • 灰色框是状态
  • 红框是给用户的消息
  • 绿色框是命令/键盘选择

您可以使用不同的过滤器类型来确保获得所需的对象类型,请参阅过滤器模块

我相信他们的示例代码有你想要的。


推荐阅读