Telegram python 检查来自 JSON 的键值
Telegram python check key value from JSON
我正在使用 pyhton 创建一个电报机器人,特别是以下模块
我想做的是:
- 向机器人发送输入
- 读取更新对象分析各个字段
- 检查 'text' 密钥是否存在
- 如果是就做点什么
我当前的 python 实现:
def echo(update: Update, context: CallbackContext) -> None:
if 'text' in update.message:
update.message.reply_text('I found your key value you are looking for')
else:
update.message.reply_text('Key not found')
def main():
"""Start the bot."""
# Create the Updater and pass it your bot's token.
updater = Updater(MY_TOKEN)
# Get the dispatcher to register handlers
dispatcher = updater.dispatcher
dispatcher.add_handler(MessageHandler(Filters.text & ~Filters.command, echo))
updater.start_polling()
updater.idle()
if __name__ == '__main__':
main()
update
对象的结构:
{
"update_id":id_update,
"message":{
"message_id":1579,
"date":1615193338,
"chat":{
"id":id_chat,
"type":"private",
"username":"XXX",
"first_name":"XXX"
},
"text":"Hello Bot",
"entities":[
],
"caption_entities":[
],
"photo":[
],
"new_chat_members":[
],
"new_chat_photo":[
],
"delete_chat_photo":false,
"group_chat_created":false,
"supergroup_chat_created":false,
"channel_chat_created":false,
"from":{
"id":id_chat,
"first_name":"xxx",
"is_bot":false,
"username":"xxx",
"language_code":"it"
}
}
}
当我测试它时,我没有从机器人那里得到任何输出,它似乎忽略了 if/else 条件。
如果我打印 update.message.text
,我会正确地看到发送到机器人的输入。
谢谢大家
EDIT
我找到了解决方案,我不得不以这种方式更改传递给 MessageHandler 的过滤器
dispatcher.add_handler(MessageHandler(Filters.all, echo))
谢谢你的帮助
您的编辑很可能不是实际的解决方案。使用 Filters.all
而不是 Filters.text & ~Filters.command
只是说 MessageHandler
将捕获 any 消息,而不仅仅是包含文本且不以 a 开头的消息机器人命令。
问题在于 'text' in update.message
无法工作,因为 update.message
是一个 telegram.Message
对象并且不可迭代。因此 'text' in update.message
可能会抛出一个错误,您看不到这个错误,因为您既没有启用日志记录也没有注册错误处理程序(有关日志记录和错误处理程序的信息,请分别参见 PTB 自述文件和 wiki)。
我的猜测是更改为 'text' in update.message.text
应该可以解决问题。
我正在使用 pyhton 创建一个电报机器人,特别是以下模块
我想做的是:
- 向机器人发送输入
- 读取更新对象分析各个字段
- 检查 'text' 密钥是否存在
- 如果是就做点什么
我当前的 python 实现:
def echo(update: Update, context: CallbackContext) -> None:
if 'text' in update.message:
update.message.reply_text('I found your key value you are looking for')
else:
update.message.reply_text('Key not found')
def main():
"""Start the bot."""
# Create the Updater and pass it your bot's token.
updater = Updater(MY_TOKEN)
# Get the dispatcher to register handlers
dispatcher = updater.dispatcher
dispatcher.add_handler(MessageHandler(Filters.text & ~Filters.command, echo))
updater.start_polling()
updater.idle()
if __name__ == '__main__':
main()
update
对象的结构:
{
"update_id":id_update,
"message":{
"message_id":1579,
"date":1615193338,
"chat":{
"id":id_chat,
"type":"private",
"username":"XXX",
"first_name":"XXX"
},
"text":"Hello Bot",
"entities":[
],
"caption_entities":[
],
"photo":[
],
"new_chat_members":[
],
"new_chat_photo":[
],
"delete_chat_photo":false,
"group_chat_created":false,
"supergroup_chat_created":false,
"channel_chat_created":false,
"from":{
"id":id_chat,
"first_name":"xxx",
"is_bot":false,
"username":"xxx",
"language_code":"it"
}
}
}
当我测试它时,我没有从机器人那里得到任何输出,它似乎忽略了 if/else 条件。
如果我打印 update.message.text
,我会正确地看到发送到机器人的输入。
谢谢大家
EDIT
我找到了解决方案,我不得不以这种方式更改传递给 MessageHandler 的过滤器
dispatcher.add_handler(MessageHandler(Filters.all, echo))
谢谢你的帮助
您的编辑很可能不是实际的解决方案。使用 Filters.all
而不是 Filters.text & ~Filters.command
只是说 MessageHandler
将捕获 any 消息,而不仅仅是包含文本且不以 a 开头的消息机器人命令。
问题在于 'text' in update.message
无法工作,因为 update.message
是一个 telegram.Message
对象并且不可迭代。因此 'text' in update.message
可能会抛出一个错误,您看不到这个错误,因为您既没有启用日志记录也没有注册错误处理程序(有关日志记录和错误处理程序的信息,请分别参见 PTB 自述文件和 wiki)。
我的猜测是更改为 'text' in update.message.text
应该可以解决问题。