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

如何在Node.js中捕获Bot Framework的messageBack按钮点击动作?

Handling messageBack Button Clicks in Bot Framework for Microsoft Teams

Let's break down how to properly use messageBack in Bot Framework for Teams and capture button clicks, since you're running into issues with imBack (system messages visible to users) and postBack not being supported in Teams.

First: Correctly Constructing a messageBack Button

When creating your button, make sure to define both the text (for bot matching) and value (for custom payload data) properties. The text won't be visible to the user—this is key to avoiding the system message issue you saw with imBack.

// Example of building a messageBack button
const timeSlotButton = new builder.CardAction(
  session,
  'messageBack', // Action type
  'Select This Time', // Button text shown to user
  null, // Image URL (optional)
  null, // Display text (optional)
  {
    text: 'choose-time-card123-456', // Bot-facing text for matching
    value: {
      action: 'selectTime',
      cardId: '123',
      timeSlot: '456'
    } // Custom payload with your data
  }
);

Capturing the Button Click

There are two reliable ways to handle the messageBack response:

1. Use a Dialog with triggerAction (Matching the text Property)

This works similarly to how you handled imBack, but the user won't see the text value you defined.

bot.dialog('handleTimeSelection', [
  function(session, args, next) {
    // Access the custom payload from the message
    const payload = session.message.value;
    
    if (payload && payload.action === 'selectTime') {
      session.send(`Got it! You selected time slot ${payload.timeSlot} for card ${payload.cardId}`);
    } else {
      session.send('Thanks for your selection!');
    }
    
    session.endDialog();
  }
]).triggerAction({
  matches: /choose-time-card[0-9]+-[0-9]+/i // Match the bot-facing text
});

2. Listen for Messages with a value Payload

Since messageBack sends the custom value directly in the message object, you can listen for all incoming messages and check for this payload:

bot.on('message', function(event) {
  // Check if the message has a custom value from messageBack
  if (event.message && event.message.value) {
    const payload = event.message.value;
    
    if (payload.action === 'selectTime') {
      const responseMsg = new builder.Message().address(event.address);
      responseMsg.text(`You picked time slot ${payload.timeSlot} (Card ID: ${payload.cardId})`);
      bot.send(responseMsg);
    }
  }
});

Why Your Previous invoke Code Didn't Work

The invoke event in Bot Framework is reserved for specific Teams scenarios (like task modules or adaptive card submit actions via Action.Submit), not for standard messageBack clicks. Teams sends messageBack responses through the regular message channel, so on('invoke') won't pick them up.

Key Notes

  • messageBack is Teams' supported alternative to postBack—it keeps the user experience clean (no visible system messages) while letting you pass structured data.
  • Always use the value property for carrying custom data instead of relying solely on the text field—it's more flexible and less error-prone than regex matching.

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:14:12