2016/05/25

Wikipedia APIを使って情報を取得してくれるSlack botの作り方

「彼女ができないなら創ればいい」をモットーに、botや人工知能について勉強をはじめた。
そこで試しに「@bot: ○○を教えて」と聞いたらWikipediaの情報を取得してくれるSlack botをつくってみた。

開発環境は以下のとおり
  • Mac OSX Yosemite
  • Node.js v5.3.0
  • botkit v0.0.15
  • superagent v1.8.3


ライブラリのインストール


$ npm init
$ npm i -S botkit
$ npm i -S superagent


botkitはSlackが提供する公式フレームワーク。簡単にBotをつくることができる。

POSTやGETするときには、requestというライブラリがよく使われているのだが、今回はsuperagentというライブラリが気になったのでつかってみた。
requestもsuperagentもどちらもさほど変わらないので、使うライブラリにあわせて読み替えてほしい。



Wikipediaの情報を取得するbot


var botkit = require('botkit'),
    request = require('superagent');

var WIKIPEDIA_URL = 'https://ja.wikipedia.org/wiki/';

var controller = botkit.slackbot({
  debug: false
});

controller.spawn({
  token: process.env.token
}).startRTM();

// [xxxを教えて] or [wiki xxx]で命令
controller.hears('(.*)を[教えて|おしえて]|wiki (.*)', ['direct_message','direct_mention','mention'], function(bot, msg) {
  var word = msg.match[1] || msg.match[2];
  
  request
    .get('https://ja.wikipedia.org/w/api.php')
    .query({
      format : 'json',
      action : 'query',
      prop   : 'extracts',
      exintro: '',
      explaintext: '',
      titles : word
    })
    .end(function (err, res) {
      var query = res.body.query;

      if (query && query.pages) {
        for (var p in query.pages) {
          var content = query.pages[p].extract;

          if (content) {
            // slackで引用スタイルを適用するために`>` をつける
            content = '> ' + content.replace(/\n/g, '\n> ');
          }
          else {
            content = '見つからなかった';
          }

          bot.reply(msg, [
              content,
              WIKIPEDIA_URL + word
          ].join('\r\n'));
          return;
        }
      }
    });
});


実行するのは、以下のコマンドを叩く
$ token={YOUR_SLACK_API_TOKEN} node bot.js

今回はnodeを実行するときにtokenという環境変数をつかっているが、もちろんjsonで管理して「var settings = require('settings.json')」のように読み込んでもよい。
というか、パラメータが多くなるようだったらjsonとかyamlとかでsettingsファイルを作るほうが楽だろう。


処理の内容は以下のとおりで、いたって単純なことしかしていない。

  1. 話しかけられた内容を取得する(タイミングは以下のとおり)
    • direct_message: ダイレクトメッセージを受け取った時
    • direct_mention: メンション(@bot: ほげほげ)を受け取ったとき
    • mention: メンション(ほげ @bot: ふが)を受け取った時
  2. 単語をもとにWikipedia APIを叩く
  3. 返ってきた内容を整形してポストする



Slack上で話しかけてみる


@bot: ○○を教えて」や「@bot: wiki ○○」のように話しかけることで、Wikipediaの見出し部分を表示してくれる。(画像はDirectMessage)



WikipediaAPIを呼び出し方


基本形は以下のとおり。
http://ja.wikipedia.org/w/api.php?パラメータ1=値1&パラメータ2=値2&...&パラメータn=値n

いろんなパラメータがあるが、今回使っているのは下表の4つのみ。
パラメータ用途
format取得するフォーマットjson
action操作query
prop記事の各構成要素extracts
titles記事のタイトル{調べたい単語}

他のパラメータなど、Wikipedia APIについては、[MediaWiki APIを使ってWikipediaの情報を取得]の記事がわかりやすいので、さらに詳しく知りたい方は参照ください。



以上

written by @bc_rikko

0 件のコメント :

コメントを投稿