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

Botkit开发Slack机器人:交互式消息生成待编辑未发送新消息可行性问询

可以实现!这里是具体的实现思路和代码示例

完全没问题,这个需求在Botkit + Slack的组合下是可以实现的,核心是结合交互式事件监听和**Slack模态框(Modal)**来完成“提取信息→编辑内容→确认发送”的流程。我给你拆解一下具体步骤,附上代码示例:

核心流程

  1. 捕获用户的按钮点击事件,从原消息中提取需要的信息
  2. 弹出Slack模态框,将提取的信息填充为默认内容,让用户编辑
  3. 处理模态框的提交,要么直接发送,要么再加一层确认让用户选择是否发送

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:03:55