Using Socket Mode
With the introduction of Socket Mode, Bolt for Python introduced support in version 1.2.0
. With Socket Mode, instead of creating a server with endpoints that Slack sends payloads too, the app will instead connect to Slack via a WebSocket connection and receive data from Slack over the socket connection. Make sure to enable Socket Mode in your app configuration settings.
To use the Socket Mode, add SLACK_APP_TOKEN
as an environment variable. You can get your App Token in your app configuration settings under the Basic Information section.
While we recommend using the built-in Socket Mode adapter, there are a few other 3rd party library based implementations. Here is the list of available adapters.
PyPI Project | Bolt Adapter |
---|---|
slack_sdk | slack_bolt.adapter.socket_mode |
websocket_client | slack_bolt.adapter.socket_mode.websocket_client |
aiohttp (asyncio-based) | slack_bolt.adapter.socket_mode.aiohttp |
websockets (asyncio-based) | slack_bolt.adapter.socket_mode.websockets |
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"])
# Add middleware / listeners here
if __name__ == "__main__":
# export SLACK_APP_TOKEN=xapp-***
# export SLACK_BOT_TOKEN=xoxb-***
handler = SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"])
handler.start()
Using Async (asyncio)
To use the asyncio-based adapters such as aiohttp, your whole app needs to be compatible with asyncio's async/await programming model. AsyncSocketModeHandler
is available for running AsyncApp
and its async middleware and listeners.
To learn how to use AsyncApp
, checkout the using Async document and relevant examples.
from slack_bolt.app.async_app import AsyncApp
# The default is the aiohttp based implementation
from slack_bolt.adapter.socket_mode.async_handler import AsyncSocketModeHandler
app = AsyncApp(token=os.environ["SLACK_BOT_TOKEN"])
# Add middleware / listeners here
async def main():
handler = AsyncSocketModeHandler(app, os.environ["SLACK_APP_TOKEN"])
await handler.start_async()
if __name__ == "__main__":
import asyncio
asyncio.run(main())