Learn how to build a Slack Bot using Node.js

Learn how to build a Slack Bot using Node.js
1and1 placeholder image
The logo for Slack!
The logo for Slack!

In this tutorial, we will be learning how to build a simple Slack bot that replies back a random greeting when you say "hi" or "hello". The bot will be written in JavaScript in conjunction with Node.js!

Here's a look at the bot in action:

A look at our finished Slack bot
A look at our finished Slack bot

Before we get started, please ensure you meet the prerequisites for this tutorial:

Prerequisites

  • Since the bot is written in JavaScript, basic knowledge of JavaScript would be helpful
  • A Slack account and active Slack instance to deploy your bot on

Installing Node and NPM

To install the necessary software for this project, we will first need Node.js, a JavaScript runtime.

  1. Visit the official Node.js website to get the installer.
  2. After it downloads, run the installer until the end.
  3. Restart your computer to ensure the changes can take effect.
The Node.js installer.
The Node.js installer.

The Node.js installer should have also installed NPM for you. To confirm that you have installed both properly, you'll need to open Windows Command Prompt if you're on Windows, or Terminal if you're on Mac or Linux.

To check if you installed node:

	
    node -v
	

To check if you installed NPM:

	
    npm -v
	

If both of these commands return a version number, you're good to go.

siteground placeholder image

Initializing our Project and Installing Slackbots.js

Create a folder anywhere you'd like to serve as the root directory for your bot. Navigate to that folder and initialize a new project by running

	
    npm init
	

Feel free to enter in whatever information you'd like. After that finishes running, you will be left with a file called package.json.

Now, to simplify our interactions with Slack's Real Time Messaging API, we will be using the Slackbots.js library. To install Slackbots.js for use in our project, run the installation command:

	
    npm install slackbots --save
	

We are now ready to use Slackbots.js in our code!

Creating a New Slack bot

Let's register a new bot on our slack instance. Head on over to:

	
    https://instance.slack.com/services/new/bot
	

Replace instance with the name of your Slack instance. Once here, give your bot a name. We'll call our bot Slacky.

Creating a new Slack bot.
Creating a new Slack bot.

After you hit Add bot integration, you'll be provided with your bot's API token. You'll need this later on so save this somewhere. Additionally, you can also change the name of your bot, upload an icon, and set what channels your bot will operate inside.

The Slack bot settings page.
The Slack bot settings page.

Building our Bot

In the same directory that your package.json lives in, create a new file called index.js. This file will serve as the code for your bot.

The project's folder structure.
The project's folder structure.

Let's create a bot using Slackbots.js:

	
    var SlackBot = require("slackbots");

    var bot = new SlackBot({
        token: "",
        name: "Slacky"
    });
	

That's all we need to have a functional bot. Fill in the token value with the API token you got earlier and you're good to go. To test that this all works, let's make the bot send us a message upon start-up:

	
    var SlackBot = require("slackbots");
    var channel = "general";

    var bot = new SlackBot({
        token: "",
        name: "Slacky"
    });

    bot.on("start", function() {
        bot.postMessageToChannel(channel, "Hello world!");
        console.log("Hello world!");
    });
	

Our new code has our bot listen on the start event which is fired when a connection to Slack is established. Once the event fires, it will run the provided function. In that function, we tell our bot to send the text Hello world! to the channel you defined in the channel variable. Finally, we threw in a console.log just for good measure.

Now it's time to run our bot. To do so, simply run your index.js file by running this command at the same directory:

	
    node index.js
	

If everything went well, not only should you see Hello world! printed on your console, but if you go to the designated channel on Slack, you should also see your bot having said Hello world!.

Console after running our Slack bot.
Console after running our Slack bot.
Our Slack bot saying hello world in chat.
Our Slack bot saying hello world in chat.
siteground placeholder image

Making Your Slack Bot Reply

Great so our bot works now, but let us make it do something more than simply say a single line of text upon start up. Let's make our friendly slack bot reply to use a random greeting when we say hi or hello in the same channel that the bot operates in.

To respond to messages we must first listen on the message event.

	
    bot.on("message", function(data) {

    });
	

However, a "message" according to the Slack API isn't necessarily a message of text sent. A "message" is more like a generic event that could be basically anything. The bottom of this page has a list of all events. Before of this, we must specifically look into events that are the type message, like so:

	
    bot.on("message", function(data) {
        if (data.type !== "message") {
            return;
        }

        // this event was a text message sent
    });
	

Because we are ignoring events that aren't messages by immediately returning, we can now safely continue on with events that are messages:

	
    bot.on("message", function(data) {
        if (data.type !== "message") {
            return;
        }

        handleMessage(data.text);
    });
	

We're passing in the text contained in the message event to a new function called handleMessage which we will now define. Again, this function should only reply back with a greeting if we said either hello or hi:

	
    function handleMessage(message) {
        switch(message) {
            case "hi":
            case "hello":
                sendGreeting();
                break;
            default:
                return;
        }
    }
	

Here we are using a switch case statement to precisely match the string sent. This makes it super easy to add more words to trigger a greeting since all you need to do is add another case for it. If the message matched, we call sendGreeting() to send the reply.

With that being said, let's now define sendGreeting():

	
    function sendGreeting() {
        var greeting = getGreeting();
        bot.postMessageToChannel(channel, greeting);
    }
	

The function is that simple. First you get the greeting via getGreeting(), set it to a new variable called greeting, and then you send the greeting to the designated channel like before.

The final step left for this bot is to define the getGreeting() function that randomly returns a greeting:

	
    function getGreeting() {
        var greetings = [
            "hello!",
            "hi there!",
            "cheerio!",
            "how do you do!",
            "¡hola!"
        ];
        return greetings[Math.floor(Math.random() * greetings.length)];
    }
	

We define a greetings array with five greetings, but feel free to add more if you'd like. Then we randomly select an element to return for our bot to reply back with. That's all the work that needs to be done for this!

Running your Slack bot

Let's put all these pieces together to get our friendly bot fully working. The final code for index.js should look something like this:

	
    var SlackBot = require("slackbots");
    var channel = "general";

    var bot = new SlackBot({
        token: "",
        name: "Slacky"
    });

    bot.on("start", function() {
        bot.postMessageToChannel(channel, "Hello world!");
    });

    bot.on("message", function(data) {
        if (data.type !== "message") {
            return;
        }

        handleMessage(data.text);
    });

    function handleMessage(message) {
        switch(message) {
            case "hi":
            case "hello":
                sendGreeting();
                break;
            default:
                return;
        }
    }

    function sendGreeting() {
        var greeting = getGreeting();
        bot.postMessageToChannel(channel, greeting);
    }

    function getGreeting() {
        var greetings = [
            "hello!",
            "hi there!",
            "cheerio!",
            "how do you do!",
            "¡hola!"
        ];
        return greetings[Math.floor(Math.random() * greetings.length)];
    }
	

Save your file and again run this command to run your bot:

	
    node index.js
	

Now when you try saying one of the two designated words to trigger a greeting, you should get a reply back from your Slack bot, like so:

Our finished Slack bot in action, Slacky!
Our finished Slack bot in action, Slacky!

Conclusion

In this tutorial, we have seen how we can use Node.js with Slackbots.js to create a very simple Slack bot that replies back a randomized greeting whenever we say hi or hello in chat. Of course, this functionality is just a very basic example intended to help you get started. The potential for your bot is limitless. Since we are using Node.js, you can do things like request data on the background or call other APIs and then have the bot return that information to you seamlessly.

For more information, we highly recommend that you read up on both the documentation for Slackbot.js and the Slack's Real Time Messaging API as well so that you can be even more familiar about just what you can create.

We hope that this tutorial has been helpful to you. If so, please consider sharing this so that others may also get the same benefit.

Thanks for reading!

1and1 placeholder image

Resources

If you learned from this tutorial, follow us on Facebook, Twitter and LinkedIn! 😊 Also, join the conversation over at our official forum!