JobQueue.run_repeating 在 Telegram 中运行没有命令处理程序的函数

问题描述

我需要开始向 TG 组发送通知,在此之前我想连续运行一个函数,该函数查询 API 并将数据存储在数据库中。在此功能运行时,如果通知数据库中可用,我希望能够发送通知

这是我的代码

import telegram
from telegram.ext import Updater,CommandHandler,JobQueue

token = "tokenno:token"

bot = telegram.Bot(token=token)

def start(update,context):
    context.bot.send_message(chat_id=update.message.chat_id,text="You will Now receive msgs!")


def callback_minute(context):
    chat_id = context.job.context

    # Check in DB and send if new msgs exist
    send_msgs_tg(context,chat_id)


def callback_msgs():
    fetch_msgs()


def main():
    JobQueue.run_repeating(callback_msgs,interval=5,first=1,context=None)
    
    updater = Updater(token,use_context=True)
    dp = updater.dispatcher
    dp.add_handler(CommandHandler("start",start,pass_job_queue=True))

    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main()

这段代码给了我错误: 类型错误:run_repeating() 缺少 1 个必需的位置参数:'回调'

任何帮助将不胜感激

解决方法

您的代码存在一些问题,让我尝试指出:

1. def callback_msgs(): fetch_msgs() 您使用 callback_msgs 作为您工作的回调。但是作业回调只接受一个 telegram.ext.CallbackContext 类型的参数。

  1.  JobQueue.run_repeating(callback_msgs,interval=5,first=1,context=None)
    

    JobQueue 是一个类。要使用 run_repeating,这是一个实例方法,您需要该类的一个实例。事实上,Updater 已经为您构建了一个实例,在您的情况下它可以作为 updater.job_queue 使用。所以调用应该是这样的:

    updater.job_queue.run_repating(callback_msgs,context=None)
    
  2. CommandHandler("start",start,pass_job_queue=True)
    

    严格来说这不是问题,bot pass_job_queue=True 根本没有效果,因为您使用了 use_context=True

请注意,ptb-wiki 上有关于 JobQueue 的精彩教程。还有一个关于如何使用它的example


免责声明:我目前是 python-telegram-bot

的维护者

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...