Microsoft Teams Bot:如何存储HeroCard按钮点击后自动发送的值?
解决Microsoft Teams Bot按钮Value值存储问题
核心思路
利用Bot Framework的**用户状态(User State)**持久化存储用户选中的工作区ID,该状态会自动关联到每个用户,可在任意对话场景中调用。
步骤1:扩展用户状态类
在你的WelcomeUserState类中新增字段,用于存储选中的工作区ID:
class WelcomeUserState: def __init__(self): self.did_welcome_user = False self.selected_workspace_id = None # 新增:存储选中的工作区ID
步骤2:修改消息处理逻辑捕获并存储Value值
更新on_message_activity函数,识别按钮触发的消息并将Value值存入用户状态:
async def on_message_activity(self, turn_context: TurnContext): """ Respond to messages sent from the user. """ # 获取用户状态 welcome_user_state = await self.user_state_accessor.get( turn_context, WelcomeUserState ) list_items = [] list_items.append(self.__send_intro_card()) activity = MessageFactory.carousel(list_items) if not welcome_user_state.did_welcome_user: welcome_user_state.did_welcome_user = True name = turn_context.activity.from_property.name await turn_context.send_activity(f"Welcome {name}") else: received_text = turn_context.activity.text.lower() if received_text == "start": await turn_context.send_activity(activity) # 判断是否为工作区ID(可根据实际格式调整验证逻辑) elif len(received_text) == 36 and '-' in received_text: # 将选中的工作区ID存入用户状态 welcome_user_state.selected_workspace_id = received_text # 保存状态变更 await self.user_state.save_changes(turn_context) await turn_context.send_activity(f"已选中工作区ID: {received_text}") # 此处可直接调用需要使用该ID的业务逻辑 # await self.process_workspace_request(turn_context, received_text) else: await turn_context.send_activity(self.START_AGAIN)
步骤3:优化按钮类型(可选但推荐)
当前你使用的im_back类型会将Value值作为用户消息显示在对话中,体验不够友好。建议改为post_back类型,后台传递Value值且不显示为用户消息:
def __send_intro_card(self) -> Attachment: access_token = request_access_token() sel_workspace_id = [ {'id': '706c16bb-2295-41f5-af7b-530cbd643045', 'name': 'Aviation Solution'}, {'id': '9a1c080d-855e-46e9-ac06-73746afdd65e', 'name': 'AviationSolutions'} ] buttons = [ CardAction( type = ActionTypes.post_back, # 改为post_back title = workspace['name'], text = workspace['name'], display_text = workspace['name'], value = workspace['id'] ) for index, workspace in enumerate(sel_workspace_id) ] card = HeroCard( title="Select Your Workspace", text="You have access to the following workspaces:" "Please select the particular workspace on which you want get information.", buttons= buttons, ) return CardFactory.hero_card(card)
对应修改消息处理中获取Value的逻辑:
# 替换原有的ID判断分支 elif turn_context.activity.value is not None: workspace_id = turn_context.activity.value welcome_user_state.selected_workspace_id = workspace_id await self.user_state.save_changes(turn_context) await turn_context.send_activity(f"已选中工作区ID: {workspace_id}")
步骤4:在其他场景调用存储的Value值
在任意需要使用工作区ID的函数中,直接从用户状态获取即可:
async def process_workspace_request(self, turn_context: TurnContext): # 获取用户状态 welcome_user_state = await self.user_state_accessor.get(turn_context, WelcomeUserState) if welcome_user_state.selected_workspace_id: workspace_id = welcome_user_state.selected_workspace_id # 执行业务逻辑,比如调用API查询工作区数据 await turn_context.send_activity(f"正在处理工作区 {workspace_id} 的请求...") else: await turn_context.send_activity("请先通过start命令选择工作区")
注意事项
确保Bot初始化时正确配置了用户状态和中间件:
# 初始化存储(可使用MemoryStorage或其他持久化存储) storage = MemoryStorage() # 初始化用户状态 self.user_state = UserState(storage) # 创建状态访问器 self.user_state_accessor = self.user_state.create_property("WelcomeUserState") # 将用户状态中间件添加到适配器 adapter.use(UserStateMiddleware(self.user_state))
内容的提问来源于stack exchange,提问作者Sage_Code
相关产品推荐
相关产品推荐

