使用作业队列时无法访问用户\u数据

2024-05-13 08:41:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数,我需要能够通过发送命令执行该函数,并使用job queue自动执行该函数。在这个函数中,我需要访问user_data来存储特定于每个用户的数据。现在的问题是,当我试图通过作业队列执行它时,user_dataNone,因此不可用。我怎样才能解决这个问题

以下是我目前的做法,简化了:

import datetime
from settings import TEST_TOKEN, BACKUP_USER
from telegram.ext import Updater, CommandHandler, CallbackContext
from pytz import timezone


def job_daily(context: CallbackContext):
    job(BACKUP_USER, context)


def job_command(update, context):
    job(update.message.chat_id, context)


def job(chat_id, context):
    print(context.user_data)


def main():
    updater = Updater(TEST_TOKEN, use_context=True)
    dispatcher = updater.dispatcher
    job_queue = updater.job_queue

    # To run it automatically
    tehran = timezone("Asia/Tehran")
    due = datetime.time(15, 3, tzinfo=tehran)
    job_queue.run_daily(job_daily, due)

    # To run it via command
    dispatcher.add_handler(CommandHandler("job", job_command))

    updater.start_polling()
    updater.idle()


if __name__ == "__main__":
    main()

现在,当我发送命令/job并执行job_command时,job函数将打印{},这意味着我可以访问user_data。但是当执行job_daily函数时,job函数会打印None,这意味着我没有访问user_data的权限。这同样适用于chat_data


Tags: 函数fromimportdataqueuemaindefcontext
1条回答
网友
1楼 · 发布于 2024-05-13 08:41:26

python-telegram-bot的回调函数中,context.user_datacontext.chat_data依赖于update。更准确地说,PTB接受update.effective_user/chat.id并提供相应的user/chat_data。作业回调不是由update触发的(而是由基于时间的触发器触发的),因此没有合理的方法来提供context.user_data

当从处理程序回调中调度作业时,user_data可用,可以做的是将其作为context参数传递给作业:

context.job_queue.run_*(..., context=context.user_data)

然后在作业回调中,可以将其作为user_data = context.job.context检索

在本例中,您将作业安排在main中,这不是处理程序回调,因此您没有context.user_data(甚至没有context)。如果您有一个特定的用户id,您希望为其传递user_data,那么可以将该user_data作为user_data = updater.dispatcher.user_data[user_id]获取,该对象与context.user_data相同(用于此特定用户的更新)


免责声明:我目前是python-telegram-bot的维护者

相关问题 更多 >