背景

slackから投稿したものをbotに記憶させて、任意のタイミングで取り出したい。
それにより例えば、slackからbotを設置したサーバ管理ができるようになる(たぶん

botkit

bot作る際のフレームワークでデファクトスタンダードだったりするのかな。
とにかく簡単にbotが作れるみたいです。

今回用意するbotさんのお仕事内容

  • slackからsetの問い合わせがあればデータをjsonに保存する
  • slackからgetの問い合わせがあれば指定されたデータを返す

実装の流れ

① Slackにてbotを新規追加
② botアプリをbotkitでコーディング
③ ①のアクセストークンを②に付与する

① Slackにてbotを新規追加

これはSlackの管理画面(/apps/manage)で設定できます
こちら参考にさせていただきました

② botアプリをbotkitでコーディング

※nodejs、npmがインストール済みの環境で

  • 作業ディレクトリに移動
  • npm initでpakage.jsonを作成
  • npm i -S botkitでbotkitをインストール
  • touch index.jsでindex.jsを作成しと実行コードをコーディング(別にファイル名はなんでもいいです)

ソースコード

package.json

{
  "name": "google_analytics_api",
  "version": "1.0.0",
  "description": "",
  "dependencies": {
    "botkit": "^0.6.12"
  }
}

botkitだけです。

index.js

if (!process.env.token) {
    console.log('Error: Specify token in environment.');
    process.exit(1);
}
var Botkit = require('botkit');
var controller = Botkit.slackbot({
    json_file_store: 'storage_bot_db'
});
var bot = controller.spawn({
    token: process.env.token
}).startRTM(function(err, bot, payload) {
    if (err) {
        process.exit(1);
        console.log('Error: Cannot to Slack');
    }
});

var strage_file_name = "setting";

controller.hears(['set (.*)'], 'ambient', function(bot, message) {
    controller.storage.channels.get(strage_file_name, function(err, data) {
        var argument = message.match[1];
        var argument_split = argument.split(" ");
        if (!data) {
            data = {id: strage_file_name};
        }
        data[argument_split[0]] = argument_split[1];

        controller.storage.channels.save(data, function(err, id) {
            bot.reply(message, 'Got it. I set key "' + argument_split[0] + '" to ' + argument_split[1]);
        });
    });
});

controller.hears(['get (.*)'], 'ambient ', function(bot, message) {
    var argument = message.match[1];
    var argument_split = argument.split(" ");
    controller.storage.channels.get(strage_file_name, function(err, data) {
        if (data && data[argument_split[0]]) {
            bot.reply(message, argument_split[0] + ' is ' + data[argument_split[0]]);
        } else {
            bot.reply(message, 'ummm...."' + argument_split[0] + '" is undefined');
        }
    });
});

botの監視対象をambient(全投稿)にしておくとメンションつけなくていいから楽

botの起動方法

token=${your-api-token} node index.js

${your-api-token}はSlackでbot作成したときに表示されたものをセットしてください
これで、botが起動し、Slack上でも在籍になります。

上記コードによるbotの動き

set

  • 「set name John」と投稿
    • setting.jsonに{"name":"John"}をセットする
  • 「set birthday 0327」と投稿
    • setting.jsonに{"birthday":"0327"}をセットする
  • 「set name Jamas」と投稿
    • setting.jsonの{"name":"John"}に上書きで{"name":"Jamas"}をセットする

get

  • 「get name」と投稿
    • "name is Jamas"が返ってくる
  • 「get birthday 」と投稿
    • "birthday is 0327"が返ってくる

総評

設定ファイルなどに対してのアクションを紐づけておけば(良いか悪いかはおいておいて)
サーバ管理をslack経由でやることも簡単そうですね。
基本的には運用上支障の出ないデータ集計や、調査系のコマンドに紐づけておいてもいいかも。

参考サイト

さすがBotkit……!Slack botにデータを持たせる方法 – Storage –

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.