我正在尝试创建一个电报机器人,该机器人使用触发词(例如“ / bot store this”或类似内容)来存储引用的消息。我的机器人的设置方式是包含4个文件。
我得到启发,用于从散装的代码this repo 并为数据库我把灵感来自this blog post
我创建命令的方式在第三个文件中。我先用if语句尝试了2种方法:
> if msg == '/bot add':
> try:
> db.add_item(db_entry)
> items = db.get_items()
> msg = "\n".join(items)
> bot.send_message(botresponse, chat_id)
> bot.send_message(msg, groupid)
> except KeyError:
> pass
> return items
> if msg == '/bot read':
> try:
> items = db.get_items()
> bot.send_message(items, chat_id)
> except KeyError:
> pass
这里的目标是采取在命令“/机器人加载”和具有机器人添加引述消息到数据库。这是伟大的,我居然能得到这个部分的工作!但是不幸的是,if语句不能真正正常工作,因为如果命令说“ / bot read”,则bot不会将任何内容返回给群聊。在第一个if语句中将其传递给“ bot.send_message”调用时会出现某种问题,但无论命令是什么,它都不会在第二个if语句中引起。
所以我再次尝试,但是这次使用了开关功能:
def botadd(update_id, botresponse, chat_id, db_entry):
db.add_item(db_entry)
items = db.get_items()
msg = "\n".join(items)
bot.send_message(botresponse, chat_id)
bot.send_message(msg, chat_id)
bot.get_updates(offset=update_id)
def botread(chat_id):
items = db.get_items()
msg = "\n".join(items)
bot.send_message(msg, chat_id)
def botswitch(update_id, msg, quoted_message, user, date, botresponse, chat_id, from_):
db_entry = user + " on " + date + ": " + '"{}"'.format(quoted_message)
switcher = {
"/bot add": botadd(update_id, botresponse, chat_id, db_entry),
"/bot read": botread(chat_id)
}
func = switcher.get(msg, lambda:"invalid command: {}".format(msg))
print(func())
这看起来具有类似的行为。该机器人会将加引号的消息添加到数据库中,但是现在它陷入了一个循环,然后在该循环中它引用了原始被引号的消息并将其也添加到了数据库中。它将无限地继续引用报价并将其添加到数据库中。最后,如果命令是“ / bot read”,则它永远不会返回数据库中的值。
我不知所措我真的在这里,因为我不知道在哪里我已经错了。真的可以使用一些建议。
谢谢