こいけるの日記

データサイエンス / データエンジニアリングに興味がある若手SIer社員の日記

【JavaScript】ランダムにWikipediaの記事を取得する関数

やりたいこと

現在作成中のLINE BOTの機能として、Wikipediaの1記事の情報をランダムにとってきて

  • 記事のタイトル
  • 記事のURL

をレスポンスしてくれる機能を作りたい。

使用したAPIとその使い方

MediaWiki APIを使用した。

基本的な仕様や使い方、使用上の注意点はこの記事を参照のこと。

以下のURLを指定することで、Wikipediaからランダムに1記事の基本情報を取得することが可能。

https://ja.wikipedia.org/w/api.php?format=json&action=query&generator=random&grnnamespace=0&prop=info&inprop=url&indexpageids

パラメータを簡単に説明すると、

  • format=jsonJSON形式を指定
  • action=query でデータ取得のアクションを指定
  • generator=random で記事をランダムに取得するよう指定
  • grnamespace=0 で持ってくる記事の名前空間(分類のようなもの)を0(標準)に設定
  • prop=info で記事の基本情報を取得
  • inprop=url で記事のURLも持ってくるよう設定
  • indexpageids でページのIDを付与 これを指定しなければいけない理由は後述

このURLでの取得例がこちら

f:id:zaohgyu:20191023224400j:plain
FF出てきた!!!

JavaScriptのサンプルコード

上記のURLを用いて記事の情報をJSONで取得し、記事のタイトルとURLを返すサンプルコード

function getRandomArticle() {
  const url = 'https://ja.wikipedia.org/w/api.php?format=json&action=query&generator=random&grnnamespace=0&prop=info&inprop=url&indexpageids';
  const res = UrlFetchApp.fetch(url);
  const item = JSON.parse(res);
  
  // 取得したページのIDを取得
  const pageID = item.query.pageids;
  // ページのタイトルを取得
  const pageTitle = item.query.pages[pageID].title;
  // ページのURLを取得
  const pageUrl = item.query.pages[pageID].fullurl;
  
  // リプライ用のテキスト生成
  replyText  = 'こんな記事を拾ってきたわん!'+'\n';
  replyText += '【'+pageTitle +'】'+'\n';
  replyText += pageUrl;
  
  return replyText;
}

上に貼ったJSONサンプルを見ると分かるが、query.pagesの直下に該当記事のpageIDが変数名として入るフォーマットになっている。

記事はランダムに取得するため、当然このpageIDは都度変わる。

そのため、まずはquery.pageidsからpageIDを取得したうえ、その値をブラケット記法で用いて各変数にアクセスしている。

URLにindexpageidsを指定したのはこのquery.pageidsを表示するようにするためだった。

LINE BOTで動かしてみる

f:id:zaohgyu:20191023231816p:plain:w300

こんな感じ

おわり~