Botkit开发Slack机器人:交互式消息生成待编辑未发送新消息可行性问询
可以实现!这里是具体的实现思路和代码示例
完全没问题,这个需求在Botkit + Slack的组合下是可以实现的,核心是结合交互式事件监听和**Slack模态框(Modal)**来完成“提取信息→编辑内容→确认发送”的流程。我给你拆解一下具体步骤,附上代码示例:
核心流程
- 捕获用户的按钮点击事件,从原消息中提取需要的信息
- 弹出Slack模态框,将提取的信息填充为默认内容,让用户编辑
- 处理模态框的提交,要么直接发送,要么再加一层确认让用户选择是否发送
1. 监听按钮点击并提取原消息信息
首先,你需要用Botkit监听Slack的interactive_message_callback事件,这个事件会在用户点击交互式按钮时触发。在回调里,你可以从message.original_message中拿到原消息的所有内容,然后根据你的需求提取关键信息:
controller.on('interactive_message_callback', async (bot, message) => { // 示例:从原消息文本中提取特定内容,你需要根据自己的消息结构调整 const originalText = message.original_message.text; const extractedInfo = originalText.split('【关键词】')[1]?.trim() || '默认内容'; // 构建模态框视图,把提取的信息作为输入框默认值 const editModal = { type: 'modal', callback_id: 'edit_message_modal', title: { type: 'plain_text', text: '编辑待发送消息' }, blocks: [ { type: 'input', block_id: 'message_block', label: { type: 'plain_text', text: '编辑消息内容' }, element: { type: 'plain_text_input', action_id: 'message_input', initial_value: extractedInfo, // 填充提取的信息 multiline: true // 支持多行编辑 } } ], submit: { type: 'plain_text', text: '下一步:确认发送' }, close: { type: 'plain_text', text: '取消' } }; // 调用Slack API打开模态框 await bot.api.views.open({ trigger_id: message.trigger_id, view: editModal, private_metadata: message.channel // 把目标频道ID存在私有元数据里,后续发送用 }); });
2. 处理模态框提交,添加发送确认
当用户编辑完内容点击“下一步”,Slack会触发view_submission事件。这里我们可以给用户发一条确认消息,让用户最终决定是否发送:
controller.on('view_submission', async (bot, message) => { // 获取用户编辑后的内容 const editedContent = message.view.state.values.message_block.message_input.value; // 从私有元数据里拿到目标频道ID const targetChannel = message.view.private_metadata; // 给用户发送确认消息 await bot.say({ channel: message.user, text: `你编辑的消息内容如下:\n>${editedContent}\n\n是否确认发送到目标频道?`, attachments: [ { actions: [ { type: 'button', text: { type: 'plain_text', text: '✅ 确认发送' }, action_id: 'confirm_send', value: JSON.stringify({ content: editedContent, channel: targetChannel }) }, { type: 'button', text: { type: 'plain_text', text: '❌ 取消' }, action_id: 'cancel_send' } ] } ] }); // 返回空对象告诉Slack模态框处理完成 return {}; });
3. 处理最终的发送/取消操作
最后,监听确认按钮的点击事件,完成发送或取消的逻辑:
controller.on('interactive_message_callback', async (bot, message) => { const actionId = message.actions[0].action_id; if (actionId === 'confirm_send') { // 解析按钮携带的消息内容和频道信息 const { content, channel } = JSON.parse(message.actions[0].value); // 发送消息到目标频道 await bot.say({ channel, text: content }); // 给用户反馈 await bot.reply(message, `消息已成功发送到 <#${channel}>!`); } else if (actionId === 'cancel_send') { await bot.reply(message, '发送已取消,消息不会被发出。'); } });
一些注意事项
- 确保你的Slack Bot已经申请了
chat:write、commands和views:open这些必要的权限,否则模态框和消息发送会失败。 - 提取原消息信息的逻辑要根据你实际的消息结构调整——如果原消息是带附件的交互式消息,就从
message.original_message.attachments里取对应字段。 - 模态框的
private_metadata是个很实用的字段,可以用来传递频道ID、用户ID这类上下文信息,避免硬编码。
内容的提问来源于stack exchange,提问作者Henrik
相关产品推荐
相关产品推荐

