Api.ai Slack integration allows you to create Slack bots with natural language understanding based on Api.ai technology.
Source code location: https://github.com/xVir/api-ai-slack-bot
Docker image location: https://hub.docker.com/r/xvir/api-ai-slack-bot/
For fastest launching you can use Heroku service with the button below
To launch a bot, you’ll need the Linux OS. To launch it in other operating systems, use Docker Toolbox.
Api.ai documentation:
You’ll need 2 keys:
- client access token for Api.ai
- Slack bot API token
To obtain a Slack bot API token, create a new bot integration here: https://slack.com/apps/A0F7YS25R-bots.
To launch the bot, use one of the following commands:
For background launch mode (-d parameter):
docker run -d --name slack_bot \
-e accesstoken="api.ai access key" \
-e slackkey="slack bot key" \
xvir/api-ai-slack-bot
For interactive launch mode (-it parameter):
docker run -it --name slack_bot \
-e accesstoken="api.ai access key" \
-e slackkey="slack bot key" \
xvir/api-ai-slack-bot
To stop the bot from running in the interactive mode, press CTRL+C.
In the background mode, you can control the bot’s state via simple commands:
docker start slack_bot
docker stop slack_bot
,
where slack_bot
is the container name from the run
command.
If you want to customize your bot behavior, follow the steps below.
-
Clone the repository https://github.com/xVir/api-ai-slack-bot
-
Change the code to
index.js
-
In the Docker, use the
run
command specifying the full path to the directory containing theindex.js
file:
docker run -d --name slack_bot \
-e accesstoken="api.ai access key" \
-e slackkey="slack bot key" \
-v /full/path/to/your/src:/usr/app/src \
xvir/api-ai-slack-bot
Bot implementation is based on the Slack Botkit: https://github.com/howdyai/botkit.
Message processing is done by the following code:
controller.hears(['.*'],['direct_message','direct_mention','mention', 'ambient'], function(bot,message) {
console.log(message.text);
if (message.type == "message") {
if (message.user == bot.identity.id) {
// message from bot can be skipped
}
else {
var requestText = message.text;
var channel = message.channel;
if (!(channel in sessionIds)) {
sessionIds[channel] = uuid.v1();
}
var request = apiAiService.textRequest(requestText, { sessionId: sessionIds[channel] });
request.on('response', function (response) {
console.log(response);
if (response.result) {
var responseText = response.result.fulfillment.speech;
if (responseText) {
bot.reply(message, responseText);
}
}
});
request.on('error', function (error) {
console.log(error);
});
request.end();
}
}
});
This code extracts the text from each message:
var requestText = message.text;
And sends it to Api.ai:
var request = apiAiService.textRequest(requestText, { sessionId: sessionIds[channel] });
If a non-empty response is received from Api.ai, the bot will respond with the received text:
bot.reply(message, responseText);