Hur man skapar en Slack Bot

Slack-applikationer har full tillgång till sin plattform. Det är verkligen det bästa sättet att gå om du vill skapa en mycket anpassad och kraftfull Slack-upplevelse. Slack erbjuder ett stort utbud av API:er som ger tillgång till att läsa, skriva och uppdatera alla typer av data i Slack.

Idag kommer vi att skapa en Slack Bot för att skicka meddelanden till alla typer av konversationer med hjälp av webb-API:er och webhooks som drivs av serverlösa funktioner byggda med Next.js.

En liten anteckning om Vercel och Next.js

Det fantastiska med att arbeta med webb-API:er och webhooks är att du kan välja din egen Tech Stack för att bygga din Slack Bot. Next.js har stöd för API Routes, vilket låter dig enkelt skapa en API-slutpunkt som en Node.js-serverlös funktion. Med Vercel kan du distribuera serverlösa funktioner som hanterar en mängd saker som användarautentisering, databasfrågor, anpassade kommandon och mer.

Skapa en Slack-app

Först måste vi skapa en Slack-app. Du kan följa med hela vägen tills vi får vår Slack-bot igång. Klicka här för att skapa din ansökan. Därifrån kan vi välja hur vi vill konfigurera vår app omfattning och inställningar. Gör gärna någon av dem, om du vill påskynda processen, här är ett appmanifest för att få dig igång snabbt.

Jag skulle rekommendera att experimentera med en utvecklingsarbetsyta först! Välj din arbetsyta och kanaler klokt! För mer om Skapa en Slack Workspace se här.

Skicka ditt första meddelande

Det första vi ska försöka idag är att lägga upp ditt första Slack Bot-meddelande. Innan vi kan testa detta måste vi (1) konfigurera vår applikations Scopes och vi måste (2) installera vår applikation i vår arbetsyta. Vi kan göra båda från vår app OAuth och behörigheter .

För att avgöra vilka omfattningar vi behöver, låt oss först granska API-metoden. Denna metod kallas chat.postMessage , här en länk till dess dokument. Referensdokumenten deklarerar följande:

  • HTTP-metod:POST
  • Slutpunkt:https://slack.com/api/chat.postMessage
  • Obligatoriska omfattningar:chat:write

Varje gång vi väljer att använda en specifik API-metod måste vi se till att vår app har de nödvändiga omfattningarna aktiverade. Låt oss lägga till chat:write för nu och chat:write.public till vår applikation Omfattningar och installera vår applikation på vår arbetsyta.

chat:write.public kommer att vara praktiskt även om det inte krävs av dokumenten att tillåta vår Slack-bot att skicka meddelanden till kanaler där han/hon inte är medlem.

När vi har gjort dessa två steg (definiering av omfattningar och installation), bör vi få en Bot User OAuth Token (tillgänglig från vår app OAuth- och behörighetssida och börjar med xoxb- ). Vi måste skicka denna token för att autentisera vårt meddelande innan Slack kan lägga upp det på vår arbetsyta.

En anteckning om att använda tokens

Det bästa sättet att kommunicera dina åtkomsttokens till Slack är att skicka dem i vår begärans Authorization HTTP-huvud där hela värdet, inklusive "Bearer", är skiftlägeskänsligt och bör se ut ungefär så här:

POST /api/chat.postMessage
Authorization: Bearer xoxb-1234-abcdefgh

Obligatoriska argument

När vi fortsätter att granska dokumentationen för vår API-metod ser vi också att för att vår Slack-bot ska kunna skicka ett meddelande måste vi också åtminstone deklarera en channel och en text . Använd detta cURL-kodavsnitt (kom ihåg att använda din Bots token) och Postman för att prova:

curl --request POST 'https://slack.com/api/chat.postMessage' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer xoxb-1234-abcdefgh' \
--data-raw '{
  "channel": "general",
  "text": "Hello world :tada:"
}'

Obs :passerar general eftersom kanalen inte anses vara en bra praxis. Detta är endast för teständamål. Helst vill vi deklarera en channel_id istället för en channel_name för channel . Här är mer om hur du kan se till att du väljer rätt konversation (kom ihåg att tänka på ytterligare omfattningar som du kan behöva).

Svara på snedstreckkommandon

Snedstreckkommandon tillåt användare att anropa din bot genom att skriva en sträng i meddelanderutan (dvs. /greet ). De innehåller också en nyttolast av data som din Slack-bot kan använda för att svara på vilket sätt de än bearbetar den nyttolasten. Här är en lista över Slack inbyggda snedstreck-kommandon om du vill granska vad som är möjligt.

Från Snedstreckkommandon du kan klicka på Skapa ett nytt kommando och här är vad du behöver (här är ett exempel på mig):

  • Kommando:/greet
  • Begärans webbadress:https://{...}.vercel.app/api/greet
  • Kort beskrivning:Greet Mr. Meeseeks!

Vad händer när ditt kommando anropas?

Slack skickar en HTTP POST till den Request URL som du anger i ditt kommando. Denna begäran innehåller en datanyttolast som beskriver källkommandot, här är ett exempel på vad du kan förvänta dig (med vår /greet exempelkommando, mer om varje fält här):

{
    "token":"{...}",
    "team_id":"{...}",
    "team_domain":"{...}",
    "channel_id":"{...}",
    "channel_name":"{...}",
    "user_id":"{...}",
    "user_name":"{...}",
    "command":"/greet",
    "text":"",
    "api_app_id":"{...}",
    "is_enterprise_install":"{...}",
    "response_url":"https://hooks.slack.com/commands/{...}",
    "trigger_id":"{...}"
}

Svara till användare

Det finns flera alternativ att välja mellan när du svarar en användare (se alla alternativ här). Låt oss skriva ett vanligt meddelandesvar . För att skriva en, från vår Slash Command-nyttolast, använder vi följande fält för att skriva ett meddelande:user_id , user_name , response_url . Slack låter dig skriva meddelanden i innehållsblock och i vanlig text. För innehållsblock, låt oss utforma vårt budskap med deras Block Kit Builder, med hjälp av följande nyttolast:

{
    "blocks": [
        {
            "type": "section",
            "text": {
                "type": "mrkdwn",
                "text": "Hello, <@${user_id}>! I'm Mr. Meeseeks! Look at me!"
            }
        }
    ]
}

Experimentera gärna med att använda det när du bygger en bättre interaktivitet för dina användare. Här är också en bra guide om hur du formaterar din text för din ansökan.

Next.js API-hanterare

Så, hur bygger vi vårt svar? För det måste vi starta ett Next.js-projekt. Om du behöver hjälp med att starta en, rekommenderar jag att du använder den här resursen. Väl där, låt oss skapa en API-fil med namnet greet , ställ in vår Bot User OAuth Token miljövariabel med en .env.local fil (läs mer om miljövariabler här). Det här är vad jag slutade skriva:

export default async function handler() {
    const { response_url, user_id } = req.body;

    try {
        const headers = {
            Authorization: `Bearer ${process.env.BOT_TOKEN}`,
            "Content-type": "application/json",
        };

        let raw = `{
            response_type: "in_channel",
            blocks: [
                {
                    type: "section",
                    text: {
                        type: "mrkdwn",
                        text: "Hello, <@${user_id}>! I'm Mr. Meeseeks! Look at me!",
                    },
                },
            ],
            text: "Hello, I'm Mr. Meeseeks! Look at me!",
        }`;

        const requestOptions = {
            method: "POST",
            headers,
            body: raw,
        };

        await fetch(`${response_url}`, requestOptions);
        res.status(200).end();
    } catch (error) {
        console.log(error);
    }
}

Här är vad jag har gjort genom att lägga till flera Slash-kommandon:

Utforska omnämnanden med din Bot

Låt oss utforska ett annat mycket vanligt användningsfall för din bot:Hantera omnämnanden . Slacks möjliggör omnämnanden via prenumeration av evenemang. Events API är ett strömlinjeformat, enkelt sätt att bygga bots som svarar på aktiviteter i Slack.

För att börja arbeta med Events, hitta konfigurationssidan "Evenemangsprenumerationer" och använd reglaget för att aktivera dem. En Request URL kommer att krävas där Slack skickar HTTP POST begär när händelsen utlöses.

Digitalt handslag

Händelserna som skickas till din Request URL kan innehålla känslig information kopplad till de arbetsytor som har godkänt din Slack-app. För att säkerställa att händelser levereras till en server under din direkta kontroll måste vi verifiera ditt ägande genom att skicka en begäran om utmaning.

Det första som din applikation kommer att kräva är en Request URL där Slack skickar en HTTP Post-begäran som inte kräver autentisering men du måste ha en serversvarskod på HTTP 200 OK och lämna tillbaka utmaningen också. Så här implementerade jag min:

const { challenge } = req.body;
res.status(200).json({ challenge: `${challenge}` });

När din webbadress har verifierats, fortsätt och välj ett evenemang som du vill registrera dig till. Jag ska gå med app_mention . Kontrollera också att din bot har de nödvändiga omfattningarna för evenemanget du registrerade. I det här fallet app_mentions:read krävs. Här är den grundläggande händelsestrukturens nyttolast du kan förvänta dig:

{
  token: '{..}',
  team_id: '{..}',
  api_app_id: '{..}',
  event: {
    client_msg_id: '{..}',
    type: 'app_mention',
    text: '<@U03JZTCSEC8>',
    user: '{..}',
    ts: '{..}',
    team: '{..}',
    blocks: [ [Object] ],
    channel: '{..}',
    event_ts: '{..}'
  },
  type: 'event_callback',
  event_id: '{..}',
  event_time: 1654874099,
  authorizations: [
    {
      enterprise_id: null,
      team_id: '{..}',
      user_id: '{..}',
      is_bot: true,
      is_enterprise_install: false
    }
  ],
  is_ext_shared_channel: false,
  event_context: '{..}'
}

Sedan, när jag identifierar hur jag skulle vilja hantera händelsen. Jag bearbetar min hanterarfunktion därefter. Observera att Event API inte har en response_url som Slash-kommandot gör, så ta hänsyn till det. Även app_mentions typhändelser gäller endast för omnämnanden i kanaler oavsett om det är inbjudningsomnämnandet eller efterföljande omnämnanden av din Slack Bot.

Slutsats

Om du har en Slack Workspace med dina vänner eller på jobbet kan du definitivt prova Meeseeks. Denna Slack Bot är öppen källkod och distribueras offentligt (såvida inte Slack tar bort den efter granskning). För mer detaljer och information kan du referera till Meeseeks GitHub-förvaret eftersom det är öppen källkod.