发布消息,使用Firebase Cloud功能和Slack API触发模式
#node #firebase #slack #slackbot

Slack API提供了与工作空间互动的各种方法,为您提供了很多选择。

要创建一个Slack应用程序,请按照以下步骤:

  1. 访问https://api.slack.com/apps开始创建您的应用。
  2. 命名您的应用程序并选择工作区。
  3. 创建应用程序后,您将被带到应用程序的环境。
  4. 在左侧菜单中,选择“基本信息”以访问您的应用程序凭据。 就是这样!你们都准备开始构建您的Slack应用程序。

要获得发布消息的机器人令牌,请按照以下步骤:

  • 单击左侧的“ OAuth&Permissions”选项
  • 向上滚动到OAuth&Permissions页面的顶部,然后单击“安装应用程序到工作区”按钮。
  • 单击“允许”,然后返回页面oauth&permissions菜单向下滚动以滚动示波器并添加范围。
  • 要生成一个机器人令牌,您需要指定机器人范围。对于我们的实现,选择以下范围:“ chat:写”,“用户:读”,“频道:读”,和“命令”。

添加bot示波器后会自动生成bot令牌。

项目:

使用Firebase设置(React-Firebase)或您的愿望创建任何项目
将firebase配置到项目中,然后添加firebase云功能设置。

在终端中,运行命令npm i @slack/web-api以安装软件包。此软件包允许您与Slack Workspace进行交互并执行诸如发送消息,触发模式之类的操作!

const { WebClient } = require("@slack/web-api");
const botToken="xoxb-565644"//paste your bot token
const web = new WebClient(botToken);

已配置的Web,现在我们可以使用它来发布消息,触发模式,获取用户/频道等。

获取Slack Workspace的所有频道

exports.channelsList = functions.https.onCall(async (data, context) => {
  try {
    const response = await web.conversations.list();
    const channels = response.channels;
    return channels; //return channel list & info
  } catch (error) {
    console.error("Error:", error);
    return error.message;
  }
});

运行firebase emulators:start --only functions获取本地URL,您可以在Postman上运行本地URL并检查响应
不要忘记在体内添加{data:{}}

获取Slack Workspace的所有用户:

exports.usersList = functions.https.onCall(async (data, context) => {
  try {
    const response = await web.users.list();
    const users = response.members;
    return users;//returns users of workspace with user related info
  } catch (error) {
    console.error("Error:", error);
  }
});

向您的Slack Workspace频道发布消息:

exports.sendMessageToChannel = functions.https.onCall(
  async (data, context) => {
    try {
    //we can get channelid in two ways
    //1. go to slack click on channel now on top click on channel name now scroll down you can see id
    //2.run the above channelsList endpoint copy the channelid from response
      await web.chat.postMessage({
        channel: channelId, //paste channel id
        text: message,
      });
      return "Message sent successfully.";
    } catch (error) {
      console.error("Error:", error);
      return "Error while posting message to channel";
    }
  }
);

您可以通过映射获得的列表

向所有用户和频道发布消息

要触发使用“ Slack上的快捷方式”的模态,请按照以下步骤:

请记住需要创建HTTPS终点URL
这触发了Slack上任何互动的请求有效载荷! 在这里,我们利用Firebase云功能部署和检索已部署的URL。

  • 从左侧菜单中,选择“互动和快捷方式”并启用互动性。
  • 在“快捷方式”下,单击“创建新快捷方式”,然后填写所需的详细信息以创建全局快捷方式。完成后,创建快捷方式。
  • 在任何Slack通道中,导航到消息输入区域并输入斜线('/')字符。现在,您将看到您创建的快捷方式的名称。
  • 要接收包含有效载荷的请求,请在“互动请求URL”下添加您已部署的端点的URL。
  • 通过完成这些步骤,您可以启用交互性,创建全局快捷方式并配置端点URL以接收有效载荷的请求。
  • 在这里,我们正在创建一个端点来触发模态并从模态回响应

Example

设计了一种模态,该模态显示了两个带有评分选择选项的会议

从用户中获取选定的会议评级,然后将消息发布到频道

Modal Preview

exports.handleMeetingsShortcut = functions.https.onRequest(async (req, res) => {
  try {
    const payload = JSON.parse(req.body.payload);
    const trigger_id = payload?.trigger_id;

    const view = { //to design custom blocks to show on modal
      type: "modal",
      callback_id: "meetings_rating",//created shortcut id
      title: {
        type: "plain_text",
        text: "Modal Title",
      },
      blocks: [
        {
          type: "section",
          text: {
            type: "mrkdwn",
            text: "*Meeting 1*\nTopic: Project Updates\nTime: 10:00 AM - 11:00 AM",
          },
          accessory: {
            type: "static_select",
            action_id: "meeting1_rating_select",
            placeholder: {
              type: "plain_text",
              text: "Rate this meeting",
            },
            options: [
              {
                text: {
                  type: "plain_text",
                  text: "⭐️⭐️⭐️⭐️⭐️",
                },
                value: "5",
              },
              {
                text: {
                  type: "plain_text",
                  text: "⭐️⭐️⭐️⭐️",
                },
                value: "4",
              },
              {
                text: {
                  type: "plain_text",
                  text: "⭐️⭐️⭐️",
                },
                value: "3",
              },
              {
                text: {
                  type: "plain_text",
                  text: "⭐️⭐️",
                },
                value: "2",
              },
              {
                text: {
                  type: "plain_text",
                  text: "⭐️",
                },
                value: "1",
              },
            ],
          },
        },
        {
          type: "section",
          text: {
            type: "mrkdwn",
            text: "*Meeting 2*\nTopic: Sales Strategy\nTime: 2:00 PM - 3:00 PM",
          },
          accessory: {
            type: "static_select",
            action_id: "meeting2_rating_select",
            placeholder: {
              type: "plain_text",
              text: "Rate this meeting",
            },
            options: [
              {
                text: {
                  type: "plain_text",
                  text: "⭐️⭐️⭐️⭐️⭐️",
                },
                value: "5",
              },
              {
                text: {
                  type: "plain_text",
                  text: "⭐️⭐️⭐️⭐️",
                },
                value: "4",
              },
              {
                text: {
                  type: "plain_text",
                  text: "⭐️⭐️⭐️",
                },
                value: "3",
              },
              {
                text: {
                  type: "plain_text",
                  text: "⭐️⭐️",
                },
                value: "2",
              },
              {
                text: {
                  type: "plain_text",
                  text: "⭐️",
                },
                value: "1",
              },
            ],
          },
        },
      ],
      submit: {
        type: "plain_text",
        text: "Submit",
      },
    };
    if (payload.type === "shortcut") {//triggered shortcut
      const response = await web.views.open({
        trigger_id,
        view,
      });
      if (response.ok) {
        res.sendStatus(200);
      } else {
        throw new Error(response.error || "Failed to open modal.");
      }
    } else if (
      //on click submit aftr selecting rating
      payload.type === "view_submission" && 
      payload.view.callback_id === "meetings_rating"
    ) {
      const user = payload.user.username;
      const values = payload.view.state.values;
      let meeting1Rating, meeting2Rating;
     //get the selected ratings, based on action_id
      for (const key of Object.keys(values)) {
        const obj = values[key];
        if (obj && obj.meeting1_rating_select) {
          meeting1Rating = obj.meeting1_rating_select.selected_option.value;
          break;
        }
      }

      for (const key of Object.keys(values)) {
        const obj = values[key];
        if (obj && obj.meeting2_rating_select) {
          meeting2Rating = obj.meeting2_rating_select.selected_option.value;
          break;
        }
      }

      const messageText = `*Meeting Ratings*\n\n${user} has rated the meetings:\n\nMeeting 1: ${meeting1Rating}\nMeeting 2: ${meeting2Rating}`;
//post message to channel with username & selected ratings
      const result = await web.chat.postMessage({
        channel: "C05788W6A",
        text: messageText,
      });

      if (result.ok) {
        res.send();
      } else {
        console.error(result.error || "Failed to post message to channel.");
        res.status(500).send("Failed to post message to channel.");
      }
    } else {
      console.error("Failed load payload");
      res.sendStatus(200);
    }
  } catch (err) {
    console.error(err, "error");
    res.sendStatus(500);
  }
});
  • 使用firebase deploy function:handleMeetingsShortcut部署功能3
  • 检查您的firebase项目上已部署的URL
  • 粘贴URL在互动性的url

在这里有效载荷保留一切

  • 如果触发快捷方式,它将返回有效载荷中的类型快捷方式
  • 如果您单击“模态触发器有效载荷”,则使用类型 查看提交。 此外,您可以利用块来创建自定义设计并增强Slack应用程序中的用户体验。

文档:
https://api.slack.com/block-kit/interactivity-设计区块
https://firebase.google.com/docs/functions/get-started?gen=1st-设置Firebase

结论:

作为初学者,试图探索Slack API。我们如何通过“兴奋我”与Slack互动.....
Slack API文档提供了有关
的更多信息 将消息发布到Slack作为文本,阻止和触发模式。

感谢您的阅读希望,它会有所帮助...ð