如何在contactRelationUpdate事件中发送建议按钮?是否存在会话限制?
解决contactRelationUpdate事件中发送带建议按钮消息的问题
首先明确:这不属于功能限制,我们可以通过提取事件中的关键信息来手动构造并发送带附件(建议按钮)的消息,不需要依赖完整的session对象。以下是两种可行的实现方案:
方案1:从message参数提取核心字段构造消息
contactRelationUpdate事件传入的message参数里已经包含了发送消息所需的所有关键信息,比如serviceUrl、conversation.id、recipient.id等,我们可以直接用这些字段来构造带按钮的消息并发送。
以JavaScript为例(Bot Framework v4):
// 处理contactRelationUpdate事件 async onContactRelationUpdate(context) { if (context.activity.action === 'add') { // 从事件中提取必要信息 const { serviceUrl, conversation, recipient } = context.activity; // 构造带建议按钮的Hero卡片 const welcomeCard = { contentType: 'application/vnd.microsoft.card.hero', content: { text: '欢迎添加我!点击下方按钮开始互动吧', buttons: [ { type: 'imBack', title: '获取帮助', value: '帮助' }, { type: 'openUrl', title: '查看教程', value: 'https://example.com/tutorial' } ] } }; // 构造完整的消息对象 const replyMessage = { type: 'message', text: '欢迎加入!', attachments: [welcomeCard] }; // 使用适配器发送消息 await context.adapter.sendActivities( serviceUrl, conversation.id, recipient.id, [replyMessage] ); } }
方案2:利用Bot Framework上下文的createReply方法
如果你的Bot Framework版本支持,context对象本身提供了createReply()方法,即使没有完整session,也能直接创建带附件的回复消息,这种方式更简洁:
async onContactRelationUpdate(context) { if (context.activity.action === 'add') { // 创建基础回复 const reply = context.createReply('欢迎来到我的服务!'); // 添加建议按钮卡片 reply.attachments = [{ contentType: 'application/vnd.microsoft.card.hero', content: { buttons: [ { type: 'imBack', title: '开始对话', value: '开始' }, { type: 'openUrl', title: '了解更多', value: 'https://example.com' } ] } }]; // 发送消息 await context.sendActivity(reply); } }
注意事项
- 不同渠道(Skype/Messenger)对卡片元素的支持有细微差异,建议在目标渠道中测试按钮的显示和交互效果;
- 确保
serviceUrl是有效的,contactRelationUpdate事件中的serviceUrl是当前会话的有效端点,无需额外处理; - 如果使用的是Bot Framework的其他语言版本(比如C#),核心逻辑一致:从事件中提取会话和端点信息,构造带附件的消息后发送。
内容的提问来源于stack exchange,提问作者Aren Hovsepyan
相关产品推荐
相关产品推荐

