読者です 読者をやめる 読者になる 読者になる

量産型エンジニアの憂鬱

きっと僕は何物にもなれない。

botkit使って定期的につぶやくslackbot作る

Slack便利ですね。

他のチャットツールとの違いとして、連携できるアプリの豊富さがあげられると思います。
さらに、BotkitHUBOTなどを使って簡単にbotが作れてしまいます。
今回はBotkitを使ってSlackのbotを作成してみます。

SlackでBotを登録する

Botの管理ページからAdd Configurationをクリックします。
f:id:duck8823:20160519213830p:plain

botのユーザ名でを入力しAdd bot integrationをクリックします。
f:id:duck8823:20160519213948p:plain

作成したbotの管理画面が開くので、表示されるAPIトークンを覚えておきます。 f:id:duck8823:20160519214046p:plain

Botを作成する

nodejs のインストール

公式のページからインストーラか、ソースコードをダウンロードしてインストールしましょう。

botの作成

botを作成します。本当に簡単。
まずはnpmで初期化。

npm init

いろいろ聞かれるので答えていきます。そうするとpackage.jsonができます。
公式の通り、シンプル。

npm install --save botkit

すると、node_modulesというディレクトリができ、そのなかにbotkitディレクトリができます。
--saveオプションをつけてインストールすることで、package.jsondependenciesにもbotkitを追加してくれます。
package.jsondependenciesに記述することで、次回からはnpm installだけで依存関係がすべてインストールされます。

botの本体を書きます。

vi index.js
var Botkit = require('botkit');
var controller = Botkit.slackbot();
var bot = controller.spawn({
  token: process.env.token
}).startRTM(function(err,bot,payload) {
  // 初期処理
  if (err) {
    throw new Error('Could not connect to Slack');
  }
});
controller.hears(["進捗どうですか"],["direct_message","direct_mention","mention"],function(bot,message) {
  // キーワードに反応した処理
  bot.reply(message, '進捗ダメです');
});

botの起動

botのトークンは、

  token: process.env.token

で指定しています。process.env.tokenは実行時に指定して渡せます。

以下で実行。

token=<確認したtoken> node index.js

するとチーム内のbotがログイン中になります。
f:id:duck8823:20160519220627p:plain

これだけです。簡単。

controller.hears(["進捗どうですか"],["direct_message","direct_mention","mention"],function(bot,message) {
  bot.reply(message, '進捗ダメです');
});

は、進捗どうですかというキーワードがダイレクトメッセージあるいは@付きのメンションでつぶやかれれば、function()内の処理を実行します。
bot.reply(message, 'メッセージ')で返事してくれます。

早速botを適当なチャンネルに招待して、つぶやいてみましょう。
f:id:duck8823:20160519221103p:plain

@hoge進捗どうですかとつぶやいたので、進捗ダメですと返信されました。

定期的につぶやくbotをつくる

定期的な処理を実行するにはnode-cronを利用すると簡単に作ることができます。

npm install --save cron

上記のスクリプトを少し書き換えます。

var Botkit = require('botkit');
var CronJob = require('cron').CronJob;
var controller = Botkit.slackbot();
var bot = controller.spawn({
  token: process.env.token
}).startRTM(function(err,bot,payload) {
  // 初期処理
  if (err) {
    throw new Error('Could not connect to Slack');
  }
  new CronJob({
        cronTime: '* * * * 1-5',
        onTick: function() {
                bot.say({
                        channel: 'general',
                        text: '進捗どうですか',
                        username: 'hoge',
                        icon_url: ''
                });
        },
        start: true,
        timeZone: 'Asia/Tokyo'
  });
});
controller.hears(["進捗どうですか"],["direct_message","direct_mention","mention"],function(bot,message) {
  // キーワードに反応した処理
  bot.reply(message, '進捗ダメです');
});

startRTM()内に初期処理を記述することができます。
その中でCronJonを生成しています。上記例ではcronTime: '* * * * 1-5',を指定してるので平日に毎分ジョブを実行します。
onTickで処理を記述していますが、bot.say()でつぶやくことができます。

  • channel : Slackのチャンネル
  • text : つぶやく文字
  • username : Slackに表示されるユーザ名
  • icon_url : Slackに表示されるアイコンのURL

を指定します。

f:id:duck8823:20160520004902p:plain
とてもうざいボットができました。

作成も実行もお手軽ですね。