我有一个函数,我需要能够通过发送命令执行该函数,并使用job queue自动执行该函数。在这个函数中,我需要访问user_data
来存储特定于每个用户的数据。现在的问题是,当我试图通过作业队列执行它时,user_data
是None
,因此不可用。我怎样才能解决这个问题
以下是我目前的做法,简化了:
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
在
python-telegram-bot
的回调函数中,context.user_data
和context.chat_data
依赖于update
。更准确地说,PTB接受update.effective_user/chat.id
并提供相应的user/chat_data
。作业回调不是由update
触发的(而是由基于时间的触发器触发的),因此没有合理的方法来提供context.user_data
当从处理程序回调中调度作业时,
user_data
可用,可以做的是将其作为context
参数传递给作业:然后在作业回调中,可以将其作为
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
的维护者相关问题 更多 >
编程相关推荐