如何存储Telegram Bot用户数据并在对应回调中正确展示
Python Telegram Bot 定时器绑定独立数据解决方案
问题根源
你当前的问题是因为使用了全局变量存储item和chat_id,全局变量为程序全局共享,每次新的/set命令执行都会覆盖原有值,导致所有待触发的定时器回调都只会读取到最新的全局值。
解决方法
python-telegram-bot的job_queue.run_once()方法原生支持传入自定义context参数,你可以将每个定时器对应的独立数据绑定到该参数上,回调函数直接从CallbackContext.job.context属性读取对应数据即可,完全不需要依赖全局变量。
修改后完整代码
from telegram import * from telegram.ext import * import telegram, telegram.ext u = Updater('TOKEN', use_context=True) j = u.job_queue def set(update: Update, context: CallbackContext): user_says = ' '.join(context.args) user_says = user_says.split(' ') # 把当前请求对应的数据打包传入context参数 timer_context = { 'chat_id': update.effective_chat.id, 'item': user_says[1:] } j.run_once(callback, int(user_says[0]), context=timer_context) def callback(context: telegram.ext.CallbackContext): # 从当前job的context属性读取绑定的独立数据 timer_context = context.job.context context.bot.send_message( chat_id=timer_context['chat_id'], text=f'Great you won {timer_context["item"]}' ) if __name__ == '__main__': dp = u.dispatcher dp.add_handler(CommandHandler('set', set)) u.start_polling() u.idle()
核心修改点
- 移除了全局变量
item、chat_id的声明与使用,避免数据相互覆盖 - 调用
run_once时将每个定时器对应的用户、奖励数据打包传入context参数,实现每个定时器数据独立绑定 - 回调函数直接从当前触发的job对象中读取专属数据,保证每个回调读取的都是创建定时器时传入的对应值
内容的提问来源于stack exchange,提问作者Clot
相关产品推荐
相关产品推荐

