Slack上でbotにwikiの情報を調べさせる方法を紹介します。
情報を取得する手段として、MediaWiki APIでリクエストを送りその結果をJSON形式で受け取ります。
MediaWikiの公式ドキュメントはこちら
https://www.mediawiki.org/wiki/API:Main_page
#MediaWiki APIの仕様
APIを使用する上で必要最低限の仕様を簡単にまとめておきます。
##URLフォーマット
日本語版のWikipediaを利用するには、以下のURLにリクエストを送ります。
http://ja.wikipedia.org/w/api.php?パラメータ1=値1&パラメータ2=値2&...&パラメータn=値n
##パラメータの種類
今回は以下のパラメータを利用します。
パラメータ | 意味 | 値 |
---|---|---|
action | 操作 | query, edit,... |
format | 出力フォーマット | json, xml, ... |
prop | 記事の各構成要素を取得 | info, extracts, revisions,... |
redirects | 転送設定 | 1(あり),0(なし) |
exchars | 文字数 | 整数 |
explaintext | 文字の修飾を外す | 1(あり),0(なし) |
titles | 記事タイトル | URLエンコードされてた文字列 |
#ソースコード
はじめに全体のソースを貼ります。コピペで動作します。
requestクライアントが入っていない場合はインストールしてください。
npm install request
以下、ソースコード
request = require('request');
module.exports = (robot) ->
robot.hear /wiki (.*)/i, (msg) ->
keyword = encodeURIComponent msg.match[1]
request.get("https://ja.wikipedia.org/w/api.php?action=query&format=json&prop=extracts&redirects=1&exchars=300&explaintext=1&titles=#{keyword}", (err, res, body) ->
if err or res.statusCode != 200
return msg.send "アクセスできなかったよ"
data = JSON.parse(body)
for id, value of data.query.pages
msg.send "#{value.extract}"
)
それでは各処理の説明をします。
keyword = encodeURIComponent msg.match[1]
APIでリクエストする際に日本語はURLエンコードしなければいけないので、入力されたキーワードを変換しています。
request.get("https://ja.wikipedia.org/w/api.php?action=query&format=json&prop=extracts&redirects=1&exchars=300&explaintext=1&titles=#{keyword}", (err, res, body) ->
if err or res.statusCode != 200
return msg.send "アクセスできなかったよ"
実際にリクエストしているのがこの処理です。上で紹介したパラメータを”&”で繋げ、titlesの部分にはURLエンコードされたキーワードを使用します。
エラーか200(成功)以外のステータスコードが返ってきた場合には「アクセスできなかった」というメッセージを出力させます。
data = JSON.parse(body)
for id, value of data.query.pages
msg.send "#{value.extract}"
データの取得に成功したらjsonデータを解析し変換します。日本語の文字列も正しく表示されます。取得したjsonデータはfor ofを使うことで結果の部分を抜き取れます。
以上で「wiki [キーワード]」と入力するとhubotがウィキれるようになります。
#参考