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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 05:54:58