Node.jsでSlack botを作る

去年9月頃から、開発陣だけでSlackを使っていたのですが、5月より正式な社内コミュニケーションツールとして採用されました!

Slackと言ったらbot。

という訳で、取り急ぎ勤怠管理botを作りました!

勤怠管理

前提

弊社では自社開発のAirpo(エアポ)という社内システムで勤怠管理を行っています。

会社の入り口にはAndroidタブレットが置かれていて、そこには勤怠管理用のapkが常時起動しています。

朝出社したら自分の名前をタップすると出勤。帰る時に、自分の名前をタップすると退勤になる仕組みです。

Webからも出退勤ができる様になっているので、自宅作業や外出の時でもタイムカードが押せるようになっています。

問題点

  • 直行や直帰、自宅作業の時はついつい打刻を忘れがち
  • 自宅作業など社外で仕事をしていると誰が仕事中かわかりにくい

作るbotの仕様

やれる事

  • botが監視するのは #0_status というチャンネル
  • 「おはようございます」と投稿すると出勤を打刻する
  • 「おつかれさまでした」と投稿すると退勤を打刻する
  • 「誰がいる?」と投稿すると、出勤中の社員を確認できる

使うもの

では早速作り始めましょう。

botの準備

Slack Botsの設定

SlackのIntegrationメニューを開き、DIY Integrations & Customizationsの項目にあるBotsをAddします。

http://mechanic.pilotz.jp/wp-content/uploads/2015/05/bots01.png

Username入力フォームが出てきたので、botの名前を入力。
API Tokenが発行されるので、メモっときます。

チャンネルへの招待

Botsの設定が完了すると、#generalに自動的に参加してくれます。

Slackでは、botも1人のユーザーとして扱うようなので、#0_statusにInviteしました。

bot用プロジェクトの作成

airpo-botというディレクトリでbotを作っていこうと思います。
中身はこんな感じ。

airpo-bot
├ libs
│ └ slack-bot
│   └ (Node.js Slack Client Libraryの中身)
├ package.json
└ airpo.js(bot本体)

Node.js Slack Client Libraryの準備

Node.js Slack Client Library をzipで落として解凍。

package.jsonが同梱されているので、npm installします。

cd /path/to/airpo-bot/libs/slack-bot
npm install

依存しているライブラリのダウンロードと、coffeeスクリプトのコンパイルをやってくれます。

bot本体の作成

準備が整ったので、bot本体を作っていきます。

まずは最小限。

Node.js Slack Client Libraryを読み込みんで、Token、autoReconnect、autoMarkの設定を渡します。
autoReconnect、autoMarkはどっちもtrueでいいっぽいです。

var Slack = require('./libs/slack-bot/');

// slack setting
var token = '*************'; //ここにメモったSlack BotsのAPI Tokenをいれる
var autoReconnect = true;
var autoMark = true;

var slack = new Slack(token, autoReconnect, autoMark);

slack.on('login') でログイン認証が行われ、認証が通るとslack.on('open')が呼び出されます。

メッセージが投稿されるとslack.on('message')が呼び出されるので、callbackで受け取ってゴニョゴニョすればOKです。

/**
 * 起動した時
 */
slack.on('open', function() {
    console.log('open');
});

/**
 * 投稿された時
 */
slack.on('message', function(message) {
    console.log(message);
});

/**
 * エラー
 */
slack.on('error', function(error) {
    console.error('Error: %s', error);
});

/**
 * ログイン
 */
slack.login();

投稿メッセージを受け取る

slack.on('message') で受け取れるmessageオブジェクトには、投稿したチャンネル・投稿したユーザー・投稿した内容など、様々な情報が含まれています。

チャンネル、投稿ユーザーはSlack内部のIDで管理されているので、名称は別途取得が必要です。

slack.on("message", function (message) {
    // message.channelに入っているチャンネルIDからチャンネル情報の取得
    var channel = slack.getChannelGroupOrDMByID(message.channel);
    // message.userに入っているユーザーIDからユーザー情報の取得
    var user = slack.getUserByID(message.user);

    // メッセージ本文
    var text = message.text;
});

投稿メッセージに応じて反応させる

メッセージが受け取れたのであとは正規表現でマッチングして処理します。

    if (/おはようございます/.test(text)) {
        // ここでAirpoの出勤APIを叩く
        req.post({ ... },function(){
            channel.send( "<@" + user.id + ">さん、出勤スタンプを押しました!" );
        });
    }

    if (/おつかれさまでした/.test(text)) {
        // ここでAirpoの退勤APIを叩く
        req.post({ ... },function(){
            channel.send( "<@" + user.id + ">さん、退勤スタンプを押しました!" );
        });
    }

    if (/誰がいる/.test(text)) {
        // ここでAirpoの出勤状況確認APIを叩く
        req.post({ ... },function(){
            channel.send( "◯◯さん,✕✕さんがお仕事中みたいですよ!" );
        });
    }

channel.sendで、チャンネルに対してメッセージを投稿できます。

投稿にリプライを付けたい場合は、 <@user.id>の形式にします。
@hogeとしただけではリプライになりませんので要注意!

ここまで出来たら、あとは作りこんでいきます。

botの常駐

botが完成したら、サーバーに常駐させる必要があります。

Node.jsが動いて、npmが使えるサーバーであればどこでも大丈夫です。

foreverの導入

foreverはNode.jsのdaemon化、死活監視をしてくれます。

  • Node.jsアプリのdaemon化
  • 終了した時に再起動
  • Node.jsアプリのプロセス管理
  • ログの出力

インストール

常駐させたいサーバーにログインして、npmでインストールします。

# npm install forever -g

daemon化とlog出力先の設定

# forever start /path/to/airpo-bot/airpo.js  -l /path/to/airpo-bot/airpo-bot.log

動作チェック

Slackの#0_statusに投稿してみます。

投稿テスト


今回、初めてに近いNode.jsアプリ開発でしたがサンプルがあったおかげで簡単に実装ができました。

まずは勤怠管理という事でAirpoのbotを作りましたが、Slackをもっと楽しく使えるように、他のbotも作ってみたいと思います。

それではまた次回!

…あ、Dockerの方もがんばってます。

Codeigniter,Laravelを利用してサーバーサイドプログラミングを担当してます。マンガとゲームとアニメとやきとんが大好きです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です