In this tutorial, you'll see how you can use Socket Mode to receive events anytime your app is mentioned. We'll show you how apps can respond to these events with a helpful message.
Quickly create an app with the correct configuration of scopes and features for this tutorial by clicking below.
Bolt is the swiftest way to start building on the Slack Platform. Before you proceed with this tutorial, follow our Getting Started with Bolt for JavaScript, Python, and Java guides to get setup and ready to build.
Socket Mode allows your app to use the Events API and interactive features—without exposing a public HTTP Request URL.
Instead of sending payloads to a public endpoint, Slack will use a WebSocket URL to communicate with your app. WebSockets use a bidirectional stateful protocol with low latency to communicate between two parties—in this case, Slack and your app.
Unlike a public HTTP endpoint, the WebSocket URL you listen to is not static. The URL is created at runtime by calling the apps.connections.open
method, and it refreshes regularly.
Socket Mode helps developers working behind a corporate firewall, or who have other security concerns that don't allow exposing a static HTTP endpoint.
You can still switch between a direct HTTP endpoint and Socket Mode at any time in the app config.
We recommend using our Bolt frameworks or SDKs for Java, Javascript, or Python to handle the details of Socket Mode. The process is streamlined, and you get access to all the other pleasant features of our SDKs.
Using Socket Mode when you're using the Bolt framework is extremely simple.
First, grab your app-level token from the Basic Information section of your app's config and set it as an environmental variable:
export SLACK_APP_TOKEN='xapp-***'
Next make a simple change to your basic Bolt initialisation code:
package hello;
import com.slack.api.bolt.App;
import com.slack.api.bolt.AppConfig;
import com.slack.api.bolt.socket_mode.SocketModeApp;
import com.slack.api.model.event.AppMentionEvent;
// Required dependencies:
// implementation("com.slack.api:bolt-socket-mode:(latest version)")
// implementation("org.glassfish.tyrus.bundles:tyrus-standalone-client:1.17")
public class MyApp {
public static void main(String[] args) throws Exception {
String botToken = System.getenv("SLACK_BOT_TOKEN");
App app = new App(AppConfig.builder().singleTeamBotToken(botToken).build());
String appToken = System.getenv("SLACK_APP_TOKEN");
SocketModeApp socketModeApp = new SocketModeApp(appToken, app);
socketModeApp.start();
}
}
Code to initialize Bolt app// Require the Node Slack SDK package (github.com/slackapi/node-slack-sdk) const { WebClient, LogLevel } = require("@slack/web-api"); // WebClient instantiates a client that can call API methods // When using Bolt, you can use either `app.client` or the `client` passed to listeners. const client = new WebClient("xoxb-your-token", { // LogLevel can be imported and used to make debugging simpler logLevel: LogLevel.DEBUG });
const { App } = require('@slack/bolt'); const app = new App({ token: process.env.BOT_TOKEN, appToken: process.env.SLACK_APP_TOKEN, socketMode: true, }); (async () => { await app.start(); console.log('⚡️ Bolt app started'); })();
import os
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
# Install the Slack app and get xoxb- token in advance
app = App(token=os.environ["SLACK_BOT_TOKEN"])
if __name__ == "__main__":
SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"]).start()
Using Bolt, you can quickly build an event listener for the Events API.
Here we'll listen for the app_mention
event type, which is sent whenever your app is @mentioned in a Slack channel. After we receive it, we'll send a brief message in response, to the same channel the mention was posted in:
package hello;
import com.slack.api.bolt.App;
import com.slack.api.bolt.AppConfig;
import com.slack.api.bolt.socket_mode.SocketModeApp;
import com.slack.api.model.event.AppMentionEvent;
// Required dependencies:
// implementation("com.slack.api:bolt-socket-mode:(latest version)")
// implementation("org.glassfish.tyrus.bundles:tyrus-standalone-client:1.17")
public class MyApp {
public static void main(String[] args) throws Exception {
String botToken = System.getenv("SLACK_BOT_TOKEN");
App app = new App(AppConfig.builder().singleTeamBotToken(botToken).build());
app.event(AppMentionEvent.class, (req, ctx) -> {
ctx.say("Hi there!");
return ctx.ack();
});
String appToken = System.getenv("SLACK_APP_TOKEN");
SocketModeApp socketModeApp = new SocketModeApp(appToken, app);
socketModeApp.start();
}
}
Code to initialize Bolt app// Require the Node Slack SDK package (github.com/slackapi/node-slack-sdk) const { WebClient, LogLevel } = require("@slack/web-api"); // WebClient instantiates a client that can call API methods // When using Bolt, you can use either `app.client` or the `client` passed to listeners. const client = new WebClient("xoxb-your-token", { // LogLevel can be imported and used to make debugging simpler logLevel: LogLevel.DEBUG });
const { App } = require('@slack/bolt'); const app = new App({ token: process.env.BOT_TOKEN, appToken: process.env.SLACK_APP_TOKEN, socketMode: true, }); (async () => { await app.start(); console.log('⚡️ Bolt app started'); })(); // subscribe to 'app_mention' event in your App config // need app_mentions:read and chat:write scopes app.event('app_mention', async ({ event, context, client, say }) => { try { await say({"blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": `Thanks for the mention <@${event.user}>! Here's a button` }, "accessory": { "type": "button", "text": { "type": "plain_text", "text": "Button", "emoji": true }, "value": "click_me_123", "action_id": "first_button" } } ]}); } catch (error) { console.error(error); } });
import os
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
# Install the Slack app and get xoxb- token in advance
app = App(token=os.environ["SLACK_BOT_TOKEN"])
@app.command("/hello-socket-mode")
def hello_command(ack, body):
user_id = body["user_id"]
ack(f"Hi, <@{user_id}>!")
@app.event("app_mention")
def event_test(say):
say("Hi there!")
if __name__ == "__main__":
SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"]).start()
Now that you've built a simple event handling app, you can take things a step further by adding other platform features. For example, your response message could be interactive, allowing the app_mention
to trigger a longer-running work flow.
Check out our tutorial on Publishing Interactive Notifications to see how you could proceed.