python - 带有 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应该只在用户输入密钥后出现。
解决方案
ConversationHandler 对您来说似乎是最合理的解决方案。您需要绘制出您的对话流程。您希望对话中的哪些状态(步骤)?
看一下 ConversationHandler 的 repo 简单示例:ConversationHandler 状态图
- 灰色框是状态
- 红框是给用户的消息
- 绿色框是命令/键盘选择
您可以使用不同的过滤器类型来确保获得所需的对象类型,请参阅过滤器模块
我相信他们的示例代码有你想要的。
推荐阅读
- flutter - Flutter 错误 - 找不到 Material 祖先的特定小部件是:
- python - 无限蟒蛇生成器
- multithreading - Dask 如何在线程调度程序中利用多线程?
- kubernetes - 当我尝试使用 helm 部署 kube-batch 时出现以下错误是什么?
- android - 使用 ChildEventListener 和 limitToLast 查询时如何从 RecyclerView 中删除
- r - 如何抓取NBA数据?
- java - 如何在视图上绘制画布
- go - 如何通过变量间接访问 const 枚举的成员?
- go - 在 golang 中读取 yaml 配置文件,我总是需要结构吗?
- java - 读入一个字符串并打印一个字符