AWS Lambdaで簡易チャットワークボットを作って雑談部屋を活性化する

弊社はチャットツールとしてチャットワークを使っています。

メンバー間のやりとりだけじゃなく、お客様との連絡やちょっとしたタスク管理にも便利に使っています。

また、仕事に関係のない話題もできるように雑談部屋も用意されています。
しかし、改めて様子を見てみると…

週に数件しか投稿がない!

これはいかんのでは…。

弊社は基本的にリモートワークをしているので、チャットで会話しない場合、会議前後のちょっとした時間しか雑談の時間がなくなってしまいます。

別に仲良くなくても一緒に働けますが、人となりを知ってる方がいろいろスムーズなはずです。
例えば、冗談が好きな人かによってコミュニケーションの取り方が変わるかもしれません。

活性化案1

「僕が積極的に話題を投稿する。」

無視されると心が折れるので没になりました。

活性化案2

「ボットに定期的にお題を提供してもらう。」

特にデメリットはなさそうなのでこちらの方法で進めます。
邪魔になれば止めればいいだけです。

実装

サーバーの管理などをしなくてもよいように、AWS Lambdaを使います。

この程度の処理なら無料枠で運用できるのも魅力です。

関数の作成とスケジューリング

Lambdaの関数を一から作成します。
名前はodaibot(お題ボット)にしました。
※ 間違ってoを小文字にしてしまいましたが、関数名の変更はできないため諦めました…。

トリガーとしてはCloudWatch Eventsを使います。
平日の10時と15時に動くようにスケジュール式にcron(0 1,6 ? * MON-FRI *)を設定します。

環境変数と権限

3つの環境変数を設定します。

  • TOKEN:チャットワークAPIトークン
  • ROOM_ID:雑談部屋のルームID
  • URL:お題一覧を書いたURL

お題一覧にはKibelaの外部共有URLを使っています。

Wikiに置いておけばみんなでカジュアルに編集できるので便利です。

権限はテンプレートから基本的なエッジ Lambda のアクセス権限を選択しておきます。AWSのリソースにはアクセスしないので他の権限は不要です。

ソースコード

最後に関数本体を書けば完成です。
Kilabeのページからお題を取ってきて、ランダムにチャットワークに投稿する、という単純な処理をしています。

var https = require ('https');

function sendMessage(message) {
  var body = 'body=' + encodeURIComponent(message);

  var options = {
    host: 'api.chatwork.com',
    path: '/v2/rooms/'+ process.env.ROOM_ID +'/messages',
    method: 'POST',
    headers: {
      'X-ChatWorkToken': process.env.TOKEN,
      'Content-Type': 'application/x-www-form-urlencoded',
      'Content-Length': body.length
    }
  };

  var req = https.request(options, function (res) {
    res.on('data', function (chunk) {
    }).on('error', function (e) {
    });
  });

  req.write(body);
  req.end();
}

exports.handler = function(event, context) {
  https.get(process.env.URL, (res) => {
    var body = '';
    res.setEncoding('utf8');

    res.on('data', (chunk) => {
      body += chunk;
    });

    res.on('end', (res) => {
      var messages = /```([\s\S]*)```/.exec(body)[1]
        .split('\n')
        .filter(function(s) { return s.length });
      var message = messages[Math.floor(Math.random() * messages.length)];
      sendMessage('雑談のネタにお困りですか?お題を出してみますね。\n' + message);
    });
  }).on('error', (e) => {
  });
};

動作確認

テストして問題なければトリガーを有効化すれば完成です。

動作サンプル

問題なさそうです。

まとめ

運用を始めてみると、最初のうちは面白がってみんな反応してくれました。しかし、ネタ切れとなった今は、もう少しで止められてしまいそうな雰囲気です。
お題を増やしたり返信に反応したりするなど、さらなる活性化ができないか検討していきたいと思います。

次回予告

次回からTimeCrowdのElectronアプリを(会社のプロダクトとは関係なく勝手に)作っていこうかなと思っています。

https://timecrowd.net/blog/image-differ/

次回こそはこれをやろうと思います!

参考

TimeCrowdに戻る