如预期的Python电报博特没有响应。如何使用sqllite库工作?

时间:2019-02-01 17:22:53

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

我正在尝试创建一个电报机器人,该机器人使用触发词(例如“ / bot store this”或类似内容)来存储引用的消息。我的机器人的设置方式是包含4个文件。

  1. 包含bot的api密钥,get_updates方法和send_message方法的bot文件
  2. 系统服务器的文件,确定所有我的变量调用 文件1中的get_updates方法
  3. 一个调用的操作文件(这是我的麻烦所在) 使用文件2中的变量的send_message方法。
  4. 系统数据库文件运行sqllite,设置了,添加项目,删除 项,并得到从该数据库的项目。

我得到启发,用于从散装的代码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”,则它永远不会返回数据库中的值。

我不知所措我真的在这里,因为我不知道在哪里我已经错了。真的可以使用一些建议。

谢谢

0 个答案:

没有答案