A bot that can search your slack message history. Makes it possible to search further back than 10,000 messages.
- Permission to install new apps to your Slack workspace.
- python3
- A publicly accessible URL to serve the bot from. (Slack recommends using ngrok to get around this.)
-
Clone this repo.
-
Install the requirements:
pip install -r requirements.txt
-
If you want to include your existing slack messages, export your team's slack history. Download the archive and export it to a directory. Then run
import.py
on the directory. For example:python import.py export
This will create a file
slack.sqlite
. -
Create a new Slack app.
-
Add the following bot token oauth scopes and install it to your workspace:
channels:history
channels:read
chat:write
groups:history
(if you want to archive/search private channels)groups:read
(if you want to archive/search private channels)im:history
users:read
-
Start slack-archive-bot with:
SLACK_BOT_TOKEN=<BOT_TOKEN> SLACK_SIGNING_SECRET=<SIGNING_SECRET> python archivebot.py
Where SIGNING_SECRET
is the "Signing Secret" from your app's "Basic Information" page and BOT_TOKEN
is the
"Bot User OAuth Access Token" from the app's "OAuth & Permissions" page.
Use python archivebot.py -h
for a list of all command line options.
- Go to the app's "Event Subscriptions" page and add the url to where slack-archive-bot is being served. The default port is
3333
. (i.e.http://<ip>:3333/slack/events
)
-
Then add the following bot events:
channel_rename
group_rename
(if you want to archive/search private channels)member_joined_channel
member_left_channel
message.channels
message.groups
(if you want to archive/search private channels)message.im
user_change
By default when you run python archivebot.py
it will launch a development server. But they don't recommend using it in production. The following is an example of using
Flask and Gunicorn to deploy slack-archive-bot, but it should work equally well with any other WSGI server.
pip install flask gunicorn
SLACK_BOT_TOKEN=<BOT_TOKEN> SLACK_SIGNING_SECRET=<SIGNING_SECRET> gunicorn flask_app:flask_app -c gunicorn_conf.py <other gunicorn args>
flask_app.py
provides a thin wrapper aroundarchivebot.app
usingslack_bolt.adapter.flask.SlackRequestHandler
. There are many other adapters provided by bolt. To use them, simplyfrom archivebot import app
and wrapapp
.gunicorn_conf.py
ensures that the local database is updated when the server is started, but that it's not run for each worker.- You can use
ARCHIVE_BOT_LOG_LEVEL
andARCHIVE_BOT_DATABASE_PATH
to configure slack-archive-bot while running it via gunicorn.
When running, ArchiveBot will continue to archive new messages for any channel it is invited to. To add the bot to your channels:
/invite @ArchiveBot
If @ArchiveBot is the name you gave your bot user.
To search the archive, direct message (DM) @ArchiveBot with the search query. For example, sending the word "pizza" will return the first 10 messages that contain the word "pizza". There are a number of parameters that can be provided to the query. The full usage is:
<query> from:<user> in:<channel> sort:asc|desc limit:<number>
query: The text to search for.
user: If you want to limit the search to one user, the username.
channel: If you want to limit the search to one channel, the channel name.
sort: Either asc if you want to search starting with the oldest messages,
or desc if you want to start from the newest. Default asc.
limit: The number of responses to return. Default 10.
slack-archive-bot
v0.1 used the legacy Slack API which Slack ended support for in February 2021. To migrate to the new version:
- Follow the installation steps above to create a new slack app with all of the required permissions and event subscriptions.
- The biggest change in requirements with the new version is the move from the Real Time Messaging API to the Events API which necessitates having a publicly-accessible url that Slack can send events to. If you are unable to serve a public endpoint, you can use ngrok.
Contributions are more than welcome. From bugs to new features. I threw this together to meet my team's needs, but there's plenty I've overlooked.
Code released under the MIT license.