Asynchronous context.job_queue.run_once不在Python电报机器人API中工作

Asynchronous context.job_queue.run_once不在Python电报机器人API中工作,asynchronous,telegram,telegram-bot,python-telegram-bot,Asynchronous,Telegram,Telegram Bot,Python Telegram Bot,这几天我就被这个电报机器人缠住了。我正在尝试设置一个机器人,它: 从TG组接收/search\u msgs userkey命令中的关键字 在数据库中搜索该userkey,并发回相应的文本 我有两个错误 无类型对象没有属性参数,在回调\u搜索\u msgs(上下文)中,请参阅代码段 AttributeError:“int”对象没有“job\u queue”属性,在search\u msgs(更新,上下文)中,请参阅代码段 电报的官方文件对我来说太难阅读和理解了。找不到更新程序、更新、Command

这几天我就被这个电报机器人缠住了。我正在尝试设置一个机器人,它:

  • 从TG组接收
    /search\u msgs userkey
    命令中的关键字
  • 在数据库中搜索该
    userkey
    ,并发回相应的文本
  • 我有两个错误

  • 无类型对象没有属性参数,在
    回调\u搜索\u msgs(上下文)
    中,请参阅代码段
  • AttributeError:“int”对象没有“job\u queue”属性,
    在search\u msgs(更新,上下文)
    中,请参阅代码段
  • 电报的官方文件对我来说太难阅读和理解了。找不到更新程序、更新、Commandhandler和上下文都与示例一起解释的地方

    我不是要你写一个完整的教程或做我的工作。但是对这段代码的简要解释和修复将非常感谢

    import telegram
    from telegram.ext import Updater,CommandHandler, JobQueue
    
    token = "Token"
    bot = telegram.Bot(token=token)
    
    # Search specific msgs on user request
    def search_msgs(update, context):
        context.job_queue.run_once(callback_search_msgs, context=update.message.chat_id)
    
    
    def callback_search_msgs(context):
        print('In TG, args', context.args)
        chat_id = context.job.context
        search_msgs(context, chat_id)
    
    
    
    def main():
        updater = Updater(token, use_context=True)
        dp = updater.dispatcher
        dp.add_handler(CommandHandler("search_msgs",search_msgs, pass_job_queue=True,
                                      pass_user_data=True))
        updater.start_polling()
        updater.idle()
    
    if __name__ == '__main__':
        main()
    

    让我先尝试澄清一些问题:

    电报的官方文件对我来说太难阅读和理解了。找不到更新程序、更新、Commandhandler和上下文都与示例一起解释的地方

    我猜你所说的“电报官方文件”是指。然而,
    Updater
    CommandHandler
    context
    python电报bot
    的概念,它是为bot api提供包装器的众多python库之一
    python电报bot
    提供了一个,其中对许多特性进行了解释和说明


    现在转到您的代码:

  • context.job\u queue.run\u一次(callback\u search\u msgs,context=update.message.chat\u id)
    您没有告诉
    job\u queue
    何时运行作业。必须将整数或
    datetime.(date)time
    对象作为第二个参数传递

  • def callback_search_msgs(context):
        print('In TG, args', context.args)
        chat_id = context.job.context
        search_msgs(context, chat_id)
    
    您正在将
    context
    chat\u id
    传递给
    search\u msgs
    。但是,该函数将
    context
    视为
    telegram.ext.CallbackContext
    的一个实例,而您将传递一个整数。而且,即使这样做有效,也只会在无限循环中安排另一个作业

  • 最后,我不明白调度作业与在数据库中查找密钥有什么关系。你所要做的就是

    def search_msgs(update, context):
        userkey = context.args[0]
        result = look_up_key_in_db(userkey)
        # this assumes that result is a string:
        update.effective_message.reply_text(result)
    
    要更好地理解
    context.args
    ,请看一下这个


    免责声明:我目前是
    python电报bot
    的维护者