LoginSignup
11
15

More than 5 years have passed since last update.

MediaWiki APIを使ってhubotにwikiらせた

Posted at

Slack上でbotにwikiの情報を調べさせる方法を紹介します。

hubot-slack-wiki-1-min-1024x364.png

情報を取得する手段として、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がウィキれるようになります。

参考

11
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
15