Advertisement
  1. Code
  2. Node.js

Erstellen eines Slack Bot mit Node.js.

by
Read Time:14 minsLanguages:

German (Deutsch) translation by Katharina Grigorovich-Nevolina (you can also view the original English article)

Slack wird schnell zum neuen Industriestandard für die Kommunikation zwischen Teams. Tatsächlich ist es so beliebt, dass das erste Ergebnis, als ich erwartungsgemäß Slack in Google eingab, die Definition des Wortes aus dem Wörterbuch war. Es folgte sofort die Website von Slack!

Dies ist für die meisten gebräuchlichen Wörter im englischen Wörterbuch fast unbekannt. In der Regel folgen auf die Definition von Google mehrere Links zu den wichtigsten Wörterbuch-Websites.

Was ist Slack?

Im einfachsten Fall ist Slack ein Messaging-System. Es ermöglicht direkte Nachrichten an Teammitglieder und die Erstellung von Kanälen (privat oder öffentlich), die eine einfache Teamkommunikation und -zusammenarbeit in Echtzeit ermöglichen. Weitere Informationen zu Slack finden Sie in den Funktionen von Slack.

An diesem Punkt wundern Sie sich vielleicht, wo Node.js hereinkommt. Wie ich bereits erwähnt habe, ist Slack im Grunde genommen ein Nachrichtensystem. Es kann jedoch unendlich erweitert und angepasst werden. Slack bietet ein unglaublich flexibles System zur Anpassung der Integration Ihres Teams, einschließlich:

  • Erstellen von benutzerdefinierten Begrüßungsnachrichten
  • Erstellen von benutzerdefinierten Emojis
  • Installieren von Anwendungen von Drittanbietern
  • Erstellen Sie Ihre eigenen Anwendungen
  • Erstellen von benutzerdefinierten Slack Bots

In diesem Artikel werde ich zeigen, wie Sie mit Node.js einen Slack Bot erstellen, der zur Slack-Konfiguration Ihres Teams hinzugefügt werden kann.

Slack Bots definiert

Die Aufgabe eines Slack-Bots besteht darin, von Slack gesendete Ereignisse zu empfangen und zu verarbeiten. Es gibt eine Vielzahl von Ereignissen, die an Ihren Bot gesendet werden, und hier kommt Node.js ins Spiel. Wir müssen nicht nur entscheiden, welche Ereignisse behandelt werden sollen, sondern auch, wie mit jedem einzelnen Ereignis umgegangen werden soll.

Einige häufige Ereignisse, mit denen ein Bot umgehen würde, sind beispielsweise:

  • member_joined_channel
  • member_left_channel
  • message

In diesem Artikel werde ich eine Node.js-Anwendung und einen Slack Bot erstellen, die Ihrem Teamprojekt hinzugefügt werden können, um bestimmte Aktionen basierend auf den empfangenen Ereignissen auszuführen.

Zu Beginn muss ich einen Bot auf Slack erstellen. Es können zwei Arten von Bots erstellt werden:

  • ein benutzerdefinierter Bot
  • erstellen einer Anwendung und Hinzufügen eines Bot-Benutzers

In diesem Artikel wird ein benutzerdefinierter Bot erstellt, da ein Anwendungsbot-Benutzer besser geeignet wäre, wenn Sie eine Anwendung auf Slack schreiben und veröffentlichen möchten. Da ich möchte, dass dieser Bot für mein Team privat ist, reicht ein benutzerdefinierter Bot aus.

Erstellen eines benutzerdefinierten Slack-Bots

Hier kann ein benutzerdefinierter Bot erstellt werden: https://my.slack.com/apps/A0F7YS25R-bots. Wenn Sie bereits bei Ihrem Slack-Konto angemeldet sind, klicken Sie links auf die Schaltfläche Konfiguration hinzufügen. Andernfalls melden Sie sich bei Ihrem Slack-Konto an, bevor Sie fortfahren. Wenn Sie kein Slack-Konto haben, können Sie sich kostenlos anmelden.

Dadurch gelangen Sie zu einer neuen Seite, auf der Sie einen Benutzernamen für Ihren Bot angeben müssen. Geben Sie jetzt Ihren Benutzernamen ein und achten Sie darauf, dass Sie die Namensrichtlinien von Slack befolgen. Wenn Sie einen fantastischen Bot-Namen ausgewählt haben, klicken Sie auf Bot-Konfiguration hinzufügen.

Nachdem Sie Ihren Bot erfolgreich erstellt haben, leitet Slack Sie zu einer Seite weiter, auf der Sie Ihren Bot weiter anpassen können. Ich überlasse diesen Teil deinem kreativen Selbst. Das einzige, was auf dieser Seite benötigt wird, ist das API-Token, das mit xoxb- beginnt. Ich würde dieses Token entweder zur späteren Verwendung an einen sicheren Ort kopieren oder diese Seite einfach offen lassen, bis wir das Token für die Anwendung Node.js benötigen.

Konfigurationen

Bevor Sie mit dem Code fortfahren, sind zwei weitere Slack-Konfigurationen erforderlich:

  1. Erstellen oder wählen Sie einen vorhandenen Kanal, mit dem Ihr Bot interagieren wird. Während ich meinen neuen Bot teste, habe ich mich entschieden, einen neuen Kanal zu erstellen. Denken Sie daran, den Kanalnamen zu speichern, da Sie ihn in Kürze in Ihrer Anwendung benötigen.
  2. Fügen Sie Ihren Bot zum Kanal hinzu / laden Sie ihn ein, damit er mit ihm interagieren kann.

Nachdem ich meinen Slack Bot konfiguriert habe, ist es Zeit, mit der Anwendung Node.js fortzufahren. Wenn Sie Node.js bereits installiert haben, können Sie mit dem nächsten Schritt fortfahren. Wenn Sie Node.js nicht installiert haben, empfehlen wir Ihnen, zunächst die Download-Seite von Node.js zu besuchen und das Installationsprogramm für Ihr System auszuwählen.

Für meinen Slack Bot werde ich eine neue Node.js-Anwendung erstellen, indem ich den npm init-Prozess durchlaufe. Mit einer Eingabeaufforderung, die auf die Stelle eingestellt ist, an der Ihre Anwendung installiert werden soll, können Sie die folgenden Befehle ausführen:

Wenn Sie mit npm init nicht vertraut sind, wird ein Dienstprogramm gestartet, mit dem Sie Ihr neues Projekt konfigurieren können. Das erste, was es fragt, ist der Name. Mein Standard war slackbot, mit dem ich mich wohl fühle. Wenn Sie Ihren Anwendungsnamen ändern möchten, besteht jetzt die Möglichkeit. Andernfalls drücken Sie die Eingabetaste, um mit dem nächsten Konfigurationsschritt fortzufahren. Die nächsten Optionen sind Version und Beschreibung. Ich habe beide als Standard beibehalten und einfach durch Drücken der Eingabetaste für beide Optionen fortgefahren.

Einstiegspunkte

Das nächste, was gefragt wird, ist der Einstiegspunkt. Der Standardwert ist index.js. Viele Leute verwenden jedoch gerne app.js. Ich möchte nicht an dieser Debatte teilnehmen, und da meine Bewerbung keine intensive Projektstruktur erfordert, werde ich meine als Standard von index.js belassen.

Nachdem Sie sich von einer Debatte erholt haben, die wahrscheinlich so stark ist wie Tabulatoren oder Leerzeichen, wird die Konfiguration fortgesetzt und es werden mehrere weitere Fragen gestellt:

  • Testbefehl
  • Git-Repository
  • Schlüsselwörter
  • Autor
  • Lizenz

Für die Zwecke dieses Artikels habe ich alle Optionen als Standard beibehalten. Nachdem alle Optionen konfiguriert wurden, wird vor dem Erstellen eine Bestätigung der Datei package.json angezeigt. Drücken Sie die Eingabetaste, um die Konfiguration abzuschließen.

Geben Sie das SDK ein

Um die Interaktion mit Slack zu vereinfachen, werde ich das Slack Developer Kit-Paket auch wie folgt installieren:

Bist du endlich bereit für Code? Ich bin sicher. Zunächst verwende ich den Beispielcode von der Slack Developer Kit-Website, auf dem eine Slack-Nachricht mithilfe der Real-Time Messaging API (RTM) mit einigen Änderungen veröffentlicht wird.

Da der von mir gewählte Einstiegspunkt index.js war, ist es Zeit, diese Datei zu erstellen. Das Beispiel auf der Website des Slack Developer Kit enthält ungefähr 20 Codezeilen. Ich werde es mehrere Zeilen gleichzeitig aufteilen, nur um zu erklären, was diese Zeilen tun. Beachten Sie jedoch, dass alle diese Zeilen in Ihrer Datei index.js enthalten sein sollten.

Der Code enthält zunächst zwei Module aus dem Slack Developer Kit:

Der instanziierte RtmClient ist unser Bot-Objekt, das auf die RTM-API verweist. Die CLIENT_EVENTS sind die Ereignisse, auf die der Bot wartet.

Sobald diese Module enthalten sind, ist es Zeit, den Bot zu instanziieren und zu starten:

Stellen Sie sicher, dass Sie das oben verschleierte API-Token durch Ihr Token ersetzen, das Sie während der Slack Bot-Erstellung erhalten haben.

Durch Aufrufen der start-Funktion auf meinem RtmClient wird die Sitzung des Bots initialisiert. Dadurch wird versucht, meinen Bot zu authentifizieren. Wenn mein Bot erfolgreich eine Verbindung zu Slack hergestellt hat, werden Ereignisse gesendet, mit denen meine Anwendung fortgesetzt werden kann. Diese Ereignisse werden kurz angezeigt.

Wenn der Client instanziiert ist, wird eine channel-Variable erstellt, die vorübergehend in eines der CLIENT_EVENTS-Ereignisse eingefügt wird.

Die channel-Variable wird verwendet, um bestimmte Aktionen auszuführen, z. B. das Senden einer Nachricht an den Kanal, mit dem der Bot verbunden ist.

Wenn die RTM-Sitzung gestartet wird (rtm.start();) und ein gültiges API-Token für den Bot angegeben wird, wird eine RTM.AUTHENTICATED-Nachricht gesendet. Die nächsten Zeilen warten auf dieses Ereignis:

Wenn das Ereignis RTM.AUTHENTICATED empfangen wird, führt der vorhergehende Code eine for-Schleife durch die Liste der Slack-Teamkanäle durch. In meinem Fall suche ich speziell nach jamiestestchannel und stelle sicher, dass mein Bot Mitglied dieses Kanals ist. Wenn diese Bedingung erfüllt ist, wird die Kanal-ID in der channel-Variablen gespeichert.

Debuggen

Um das Debuggen zu erleichtern, wird eine Konsolennachricht protokolliert, die eine Meldung anzeigt, dass der Bot erfolgreich authentifiziert wurde, indem sein Name (${rtmStartData.self.name}) und der Teamname (${rtmStartData.team.name}) angezeigt werden gehört.

Nachdem sich der Bot authentifiziert hat, wird ein anderes Ereignis ausgelöst (RTM.RTM_CONNECTION_OPENED), das anzeigt, dass der Bot vollständig verbunden ist und mit Slack interagieren kann. Die nächsten Codezeilen erstellen den Ereignis-Listener. nach erfolg ein Hallo! Nachricht wird an den Kanal gesendet (in meinem Fall jamiestestchannel).

Zu diesem Zeitpunkt kann ich jetzt meine Knotenanwendung ausführen und beobachten, wie mein Bot automatisch eine neue Nachricht auf meinem Kanal veröffentlicht:

Das Ausführen dieses Befehls (bei Erfolg) hat zwei Ergebnisse:

  1. Ich erhalte meine Debug-Nachricht, die angibt, dass sich mein Bot erfolgreich angemeldet hat. Dies ist darauf zurückzuführen, dass RTM.AUTHENTICATED nach dem Start des RTM-Clients ausgelöst wurde.
  2. Ich erhalte ein Hallo! Nachricht in meinem Slack-Kanal. Dies trat auf, als die Ereignismeldung RTM.RTM_CONNECTION_OPENED von der Anwendung empfangen und verarbeitet wurde.

Bevor Sie fortfahren und meine Bewerbung weiter verbessern, ist jetzt ein guter Zeitpunkt, um noch einmal zusammenzufassen, was ich getan habe, um so weit zu kommen:

  1. Erstellt einen benutzerdefinierten Slack Bot.
  2. Erstellt einen benutzerdefinierten Slack Channel und lädt meinen Bot dazu ein.
  3. Erstellt eine neue Node.js-Anwendung namens slackbot.
  4. Installierte das Slack Developer Kit-Paket in meiner Anwendung.
  5. Erstellt meine index.js-Datei, die einen RtmClient mithilfe meines API-Tokens von meinem benutzerdefinierten Bot erstellt.
  6. Erstellt einen Ereignis-Listener für RTM.AUTHENTICATED, der den Slack Channel findet, bei dem mein Bot Mitglied ist.
  7. Erstellt einen Ereignis-Listener für RTM.RTM_CONNECTION_OPENED, der ein Hello! Nachricht an meinen Slack Channel.
  8. Rief die RTM-Startsitzungsmethode auf, um den Authentifizierungsprozess zu starten, der von meinen Ereignis-Listenern ausgeführt wird.

Den Bot bauen

Jetzt ist es Zeit, dass der wahre Spaß beginnt. Slack bietet (ich habe nicht gezählt) mindestens 50 verschiedene Ereignisse an, die meinem benutzerdefinierten Bot zum Abhören und optionalen Behandeln zur Verfügung stehen. Wie Sie der Liste der Slack-Ereignisse entnehmen können, sind einige Ereignisse für die RTM-API (die wir verwenden) benutzerdefiniert, während andere Ereignisse für die Ereignis-API benutzerdefiniert sind. Zum Zeitpunkt des Schreibens dieses Artikels habe ich das Verständnis, dass das Node.js SDK nur RTM unterstützt.

Um meinen Bot zu beenden, werde ich das message-Ereignis behandeln. Natürlich ist dies wahrscheinlich eines der kompliziertesten Ereignisse, da es eine große Anzahl von Untertypen unterstützt, die ich gleich untersuchen werde.

Hier ist ein Beispiel dafür, wie das grundlegendste message-Ereignis von Slack aussieht:

In diesem Grundobjekt sind die drei wichtigsten Dinge, die mir wichtig sind:

  1. Der channel. Ich möchte sicherstellen, dass diese Nachricht zu dem Kanal gehört, zu dem mein Bot gehört.
  2. Der user. Auf diese Weise kann ich direkt mit dem Benutzer interagieren oder eine bestimmte Aktion ausführen, je nachdem, wer der Benutzer ist.
  3. Der text. Dies ist wahrscheinlich das wichtigste Stück, da es den Inhalt der Nachricht enthält. Mein Bot möchte nur auf bestimmte Arten von Nachrichten antworten.

Einige Nachrichten sind komplizierter. Sie können viele Untereigenschaften enthalten, wie z.B.

  • edited: Ein untergeordnetes Objekt, das beschreibt, welcher Benutzer die Nachricht bearbeitet hat und wann sie aufgetreten ist.
  • subtype: Eine Zeichenfolge, die eine der vielen verschiedenen Arten definiert, z. B. channel_join, channel_leave usw.
  • is_starred: Ein Boolescher Wert, der angibt, ob diese Nachricht markiert wurde.
  • pinned_to: Ein Array von Kanälen, in denen diese Nachricht angeheftet wurde.
  • reaktions: Eine Reihe von Reaktionsobjekten, die definieren, wie die Reaktion war (z. B. Gesichtspalme), wie oft sie aufgetreten ist, und eine Reihe von Benutzern, die auf diese Weise auf die Nachricht reagiert haben.

Ich werde meine zuvor erstellten index.js erweitern, um auf message-Ereignisse zu warten. Um die Redundanz des Codes zu verringern, enthalten die folgenden Beispiele nur den Teil des Codes, der sich auf die Verbesserungen des message-Ereignisses bezieht.

Als erstes muss ein neues Modul für die RTM_EVENTS hinzugefügt werden, die ich anhören werde. Ich habe dies unter meinen beiden vorherigen Modulen platziert:

Der Code für die Behandlung des message-Ereignisses, den ich am Ende meiner Datei platzieren werde. Um zu testen, ob das message-Ereignis ordnungsgemäß funktioniert, habe ich einen neuen Ereignis-Listener erstellt, der das message-Objekt wie folgt in der Konsole protokolliert:

Ich kann jetzt meine Knotenanwendung (node index.js) erneut ausführen. Wenn ich eine Nachricht in meinen Kanal eingebe, wird Folgendes an meiner Konsole protokolliert:

So weit, ist es gut. Mein Bot empfängt erfolgreich Nachrichten. Der nächste inkrementelle Schritt besteht darin, sicherzustellen, dass die Nachricht zu dem Kanal gehört, in dem sich mein Bot befindet:

Wenn ich jetzt meine Anwendung ausführe, wird meine Debug-Nachricht nur angezeigt, wenn das message-Ereignis für den channel war, zu dem mein Bot gehört.

Ich werde jetzt die Anwendung erweitern, um eine benutzerdefinierte Nachricht an den Kanal zu senden, die zeigt, wie ein Benutzer in einer Nachricht markiert werden kann:

Wenn nun jemand eine Nachricht in den Kanal eingibt, sendet mein Bot eine eigene Nachricht, die ungefähr so aussieht: "Hör auf, alle hören zu, @endyourif hat etwas Wichtiges zu sagen!"

Ok, nicht sehr nützlich. Stattdessen beende ich meinen Bot, indem ich den Listener für message-Ereignisse so verbessere, dass er auf bestimmte Befehle reagiert. Dies wird wie folgt erreicht:

  1. Teilen Sie den text-Teil einer message basierend auf einem Leerzeichen in ein Array auf.
  2. Überprüfen Sie, ob der erste Index mit dem Benutzernamen meines Bots übereinstimmt.
  3. Wenn dies der Fall ist, werde ich den zweiten Index (falls vorhanden) betrachten und diesen als Befehl behandeln, den mein Bot ausführen soll.

Um leicht erkennen zu können, ob mein Bot erwähnt wurde, muss ich eine neue Variable erstellen, in der meine Bot-Benutzer-ID gespeichert wird. Unten finden Sie einen aktualisierten Codeabschnitt, in dem ich zuvor die channel-Variable festgelegt habe. Es speichert jetzt auch die Benutzer-ID meines Bots in einer Variablen namens bot.

Mit meinem bot-Variablensatz habe ich meinen Bot fertiggestellt, indem ich den zuvor erstellten Listener für message-Ereignisse wie folgt ausgearbeitet habe:

Der folgende Code teilt die text-Eigenschaft des message-Objekts in einem Array basierend auf einem Leerzeichen auf. Als nächstes stelle ich sicher, dass ich mindestens zwei Elemente im Array habe, idealerweise meinen Bot und den Befehl zum Ausführen.

Wenn das erste Element im Array mit meinem Bot übereinstimmt, führe ich eine switch-Anweisung für das zweite Element im Array aus: den Befehl. Die aktuell unterstützten Befehle sind jump und help. Wenn eine Nachricht an den Kanal gesendet wird, die wie "@jamiestest jump" aussieht, antwortet mein Bot mit einer speziellen Nachricht an den ursprünglichen Benutzer.

Wenn der Befehl nicht erkannt wird, fällt er in meine Standard-case-Anweisung für meinen switch und antwortet mit einem generischen Befehl, der folgendermaßen aussieht: "@endyourif, sorry, ich verstehe den Befehl" hi "nicht. Eine Liste der unterstützten Befehle Befehle, geben Sie Folgendes ein: @jamiestest help ".

Schlussfolgerung

Zu diesem Zeitpunkt ist mein Bot fertig! Wenn Sie daran interessiert sind, Ihren Bot weiter zu verbessern, finden Sie hier eine Liste mit Ideen:

  • Behandeln Sie ein neues Teammitglied, indem Sie das Ereignis team_join abhören. Wenn ein neues Teammitglied beitritt, ist es eine gute Idee, ihm eine Vielzahl von Onboarding-Informationen und / oder -Dokumentationen zu senden, um es in Ihrem Team willkommen zu heißen.
  • Erweitern Sie die Liste der unterstützten Befehle, die ich gestartet habe.
  • Machen Sie die Befehle interaktiv, indem Sie eine Datenbank, Google, YouTube usw. durchsuchen.
  • Erstellen Sie einen Bot-Benutzer in einer Anwendung und erstellen Sie Ihre eigenen benutzerdefinierten Slash-Befehle.
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.