You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何存储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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 02:18:00