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

如何在Telegram Bot的ConversationHandler跨阶段函数间传递变量

解决方案

你使用的是python-telegram-bot库的ConversationHandler实现多步对话流转,跨步骤共享变量直接用框架内置的context.user_data即可:这是一个和当前用户会话绑定的字典,对话全流程的所有处理函数都可以读写其中的内容,不需要修改函数的返回值结构——ConversationHandler本身只会解析你返回的状态码,额外返回多值框架不会做处理,自然无法生效。

修改后的示例代码

from telegram.ext import ConversationHandler
STEP_1, STEP_2, STEP_3 = range(3)

def askforfile(update, context):
    chat_id = update.effective_chat.id
    context.bot.send_message(chat_id=chat_id, text="give a file!")
    return STEP_1

def getfile(update, context):
    chat_id = update.effective_chat.id
    filename = f'newfile{chat_id}.txt'
    with open(filename, 'wb') as f:
        context.bot.get_file(update.message.document.file_id).download(out=f)
    # 将跨步骤需要使用的文件名存入会话字典
    context.user_data['target_filename'] = filename
    return STEP_2

def get_info(update, context):
    info = update.message.text
    # 将用户输入的信息存入会话字典
    context.user_data['input_info'] = info
    return STEP_3

def end(update, context):
    chat_id = update.effective_chat.id
    # 直接从会话字典中读取之前步骤存储的变量
    filename = context.user_data['target_filename']
    info = context.user_data['input_info']
    
    with open(filename, 'rb') as f:
        writecsv1 = some_module.some_function(filename, info)
    with open(writecsv1, 'rb') as doc:
        context.bot.send_document(chat_id=chat_id, document=doc)
    
    # 流程结束后清理临时存储的会话数据,避免冗余
    context.user_data.clear()
    return ConversationHandler.END

注意事项

  • 不要用函数局部变量存储跨步骤数据:每个对话处理函数是独立触发调用的,函数执行结束后局部变量会直接被回收,无法跨函数读取。
  • 如果是群聊场景下需要存储群维度的共享数据,可以替换为context.chat_data,使用逻辑和context.user_data完全一致。
  • 禁止用全局变量存储这类会话数据:多用户同时和机器人交互时,全局变量会被不同用户的请求互相覆盖,直接导致数据错乱。

内容的提问来源于stack exchange,提问作者really_anxious

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 02:21:15