そこで試しに「@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
// bot.js
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ファイルを作るほうが楽だろう。
処理の内容は以下のとおりで、いたって単純なことしかしていない。
- 話しかけられた内容を取得する(タイミングは以下のとおり)
- direct_message: ダイレクトメッセージを受け取った時
- direct_mention: メンション(@bot: ほげほげ)を受け取ったとき
- mention: メンション(ほげ @bot: ふが)を受け取った時
- 単語をもとにWikipedia APIを叩く
- 返ってきた内容を整形してポストする
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 件のコメント :
コメントを投稿