如何在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
相关产品推荐
相关产品推荐

