Build a “Serverless” Slack Bot in 9 Minutes with Node.js and Standard Library
Slack bots — they’re fun, they’re useful, and people are building new businesses around bot interaction models on a daily basis. A few weeks ago we launched a quick guide to building an Alexa Skill in 7 Minutes with Standard Library to a great response, and we’re excited to show off more of the capabilities of the platform we’re building at Standard Library alongside with Slack (who, as of July 11th 2017, is officially an investor)!
If you’re not familiar with Standard Library, we’re a Function as a Service software library. The easiest way to think of us is to imagine if AWS Lambda and GitHub had a child, then asked NPM and Twilio to be the godparents — scalable microservices with no server administration, easy command line management, version immutability, service discovery, and the ability to charge customers for premium services you’ve built on a per-request basis.
We’re confident you’ll find Standard Library to be the fastest way to get a Slack Bot up and running in production, so without further ado, let’s get started building!
Once you’ve created your Standard Library service in Minute 5, you’ll get a
README.md file you can follow along with as well.
What You’ll Need Beforehand
- 1x Slack Team
- 1x Command Line Terminal
- 9x Minutes (or 540x Seconds)
Minute 1: Preparing Your New Slack App
First, make sure you’re signed in to Slack. Next, visit your Slack Apps page at https://api.slack.com/apps. You’ll see a screen that looks like the following, though you may not have any existing apps yet.
Simply click Create New App to create your app. You’ll be presented with a modal to enter in your App Name (I recommend “Test App” for the purposes of this tutorial) and the Development Slack Team you’d like to add it to.
From here, click Create App and you’ll find yourself on a Basic Information page. Keep this page open in your browser, we’ll be using it in a second.
Minute 2: Add a Bot to Your Slack App
Any interaction models that involve conversation, uploading files, etc. will rely on a bot, so let’s make sure we add one. Find the Bot Users option on the left sidebar, under the Features heading.
Click Add a Bot User to create your bot. You’ll be given an option to enter in the bot username — @test_app should work just fine. Click Add Bot User to complete the process, and that’s it! Your bot user is now added and ready to be used.
Minute 3: Standard Library Account Setup
Next, you’ll need a Standard Library Account to deploy your Slack App (bot) as a “serverless” scalable web service, as well as use your Standard Library credentials to access the utils.kv service. This handles simple data persistence for your Slack App — like team data for when others install your app. Visit https://stdlib.com and click Start Building Free to create your account.
Minute 4: Create a Standard Library Workspace
To use Standard Library, you’ll want Node.js version 6.9.x or higher installed from the Official Node.js Website. Once complete, open up your Terminal or Command Line and install the Standard Library Command Line Tools with the following:
$ npm install lib.cli -g
This gives you access to the
lib command for service management and execution. Next, create a
stdlib directory for your Standard Library services.
$ mkdir stdlib
$ cd stdlib
$ lib init
You’ll be asked to log in using the credentials you created your account with. That’s it!
Minute 5: Standard Library Service Creation
You’ll now want to create a Standard Library service for your Slack App. Slack has provided a
@slack/app source (template) for you to use to get a bot up and running with very little effort. In the
stdlib directory you just created, type:
$ lib create -s @slack/app
You’ll be asked to enter a
Service Name, we recommend
slack-app for the purposes of this tutorial.
This will fetch the
@slack/app source from Slack’s sourcecode repository on Standard Library. You can view the source (template) in your browser by visiting the specific @slack/app sourcecode page. It will run an npm installation locally for necessary files. Once complete, you will be instructed to enter the project directory.
$ cd <username>/slack-app
To make sure your slack-app is ready, let’s run a test “Slash” command — for example, this would respond to
/hello hey there when run in your team in the channel “general” by the user “test”.
$ lib .commands.hello --user test --channel general --text "hey there"
You’ll get a result that looks like this:
Great! To see what’s happening behind the scenes, run the exact same command with a
-d flag (debug mode on):
$ lib .commands.hello --user test --channel general --text "hey there" -d
This will show what’s going on in the background, using a local version of the Standard Library gateway for testing purposes.
We can test events as well. For example, this as a “message” event that will be triggered any time a message is posted to a public channel (somebody writes “hey”):
$ lib .events.message --user test --channel general --text "hey"
Finally, deploy your service live to Standard Library — your app won’t quite be ready to use yet, but we need it to talk to Slack to verify that it’s working.
$ lib up dev
Minute 6: Enable Commands, OAuth and Events
We’ll want to enable some Slack features for our App to make sure we can interact with our bot successfully. Make sure you’re in your Slack App settings before continuing.
Enable Slash Commands
Slash Commands are how Slack Apps respond to
/command style queries. You can read more about them on the Slack Slash Commands API Reference. We know from the last step that our service has a pre-built response to
/hello, so let’s add that first. Click Slash Commands on the sidebar.
After clicking Create New Command, you’ll be asked to enter some command details, make sure you enter the following:
- Request URL:
- Short Description:
The “:bg” indicator at the end of the URL indicates we’re running this as a background function. This means the Standard Library gateway will immediately return an HTTP 202 Accepted status, but continue execution in the background (this tells Slack the service is working ASAP). When you’re finished, hit Save in the bottom right corner of your screen. If you encounter a warning about app permissions, you can ignore it for now.
Next, we’ll enable OAuth. On the sidebar menu, click OAuth & Permissions. Once there, you’ll want to enter in a Redirect URL as follows:
Hit Add and then click Save URLs. You should get a success message, and OAuth is ready!
Enable Event Subscriptions
Finally, we want to enable Event Subscriptions. Events are anything that can happen in your public channels, groups and messages. You can read more about the Slack Events API here. To enable them, click on Event Subscriptions option on the left sidebar. Toggle events to On in the top right, and then put in your Request URL:
Slack sends a
challenge parameter to this endpoint, which is why we had to make sure we deployed our service earlier. This endpoint should get automatically verified, if not, make sure you go back to Minute 5 to ensure you deployed your service.
Finally, scroll down a bit to Subscribe to Team Events and add
message.channels. Make sure to hit Save Changes in the bottom right corner!
Minute 7: Adding Your Slack App Credentials
You should now make sure your Slack App Credentials are properly assigned to your Standard Library service. It’s time to switch back to your command line — you’ll want to open your
env.json (environment variables) file in your main service directory, open the file in your text editor of choice. We’ll be making modifications to the
"dev" environment variables — make sure you’re modifying the right set!
First, fetch your Standard Library Token from the Standard Library Dashboard. You’ll be asked to log in again — once you’ve done so, click on Library Tokens on the left and you’ll see this page:
This is your Standard Library auth token, click Show token to see its value and copy and paste it to your
env.json file under
STDLIB_TOKEN. Please note that
dev values are for your dev environment and
release values should only be populated when you’re ready to release your app.
Next, fill out
SLACK_APP_NAME. You should differentiate between your dev / release apps — make sure this is unique for every app you build, as it sets a unique identifier for data storage / retrieval. For the
dev environment you can set this to
Finally, go back to your Slack App, and scroll down on the Basic Information panel:
Copy each of these values to
dev section of
As a last step, modify
<username> is your Standard Library username.
Minute 8: Deploying Your Slack App
Now that we’ve set added our commands, subscribed to events, and set the appropriate environment variables in our Standard Library Slack service, we’re ready to push our app live! Simply redeploy with:
$ lib up dev
Once complete, visit
https://<username>.api.stdlib.com/slack-app@dev/ in your web browser — it should be available to be copy-and-pasted from your command line output. You’ll see a very simple “Add to Slack” button.
Click this button, and accept the requested permissions (we set them up previously), you’ll have to scroll down and click Authorize.
You’ll be returned to your specified auth callback, which should give a success message:
Please note, your bot is now “production-ready,” by authorizing access above and setting up commands and events, your bot is all ready to go — though you can invite your bot to specific channels, it is not necessary for the basic interaction model.
Minute 9: Playing With Your New Slack App
You’re all done. Try it out! Your Slack App is now available for use in the Slack Team you authorized it for. By default, “Test App” should respond to a
/hello command and to the regex pattern
/hi|hello|sup|hey/ in normal channel messages. It will also welcome members when they join channels.
You can modify these behaviors in your Standard Library service directory at
functions/events/message/channel_join.js. You can even create your own event responses and commands — just make sure for Slash Commands that you enable them via the Slack App management portal and your app has the correct permissions.
You can also Enable Distribution for this app and share it with other people by linking them to
https://<username>.api.stdlib.com/slack-app@dev/, but we recommend creating a separate Slack App for this purpose and using
lib release (so you don’t need the
@dev qualifier). Full documentation for the Standard Library command line tools is available on GitHub.
That’s it! Your Slack App is live!
Thanks for reading, and we hope we’ve been helpful showing you how easy it is to create a Slack App using Standard Library! Feel free to dig around in the template-generated codebase and make modifications or add new features. If there’s something you think the
@slack/app source is missing, it’s available as a Standard Library sourcecode at https://stdlib.com/@slack/src/app. On behalf of both ourselves and the Slack team, we welcome contributions and bugfixes!
We would love for you to comment here or e-mail me at keith [at] stdlib [dot] com, or follow us on Twitter, @StdLibHQ. Please let us know if you’ve built anything exciting that you would like us to feature or share!