2017年1月4日水曜日

Wikipedia APIで「今日は何の日」データを取得するJavaScript


2017 Jan. 05.
2017 Jan. 04.

送信するURL

  var now = new Date();
  var month = now.getMonth()+1;
  var day = now.getDate();
  var monthDay = month+"月"+day+"日 ";
  var url = 'https://ja.wikipedia.org/w/api.php?format=json&utf8&action=query&prop=revisions&rvprop=content&titles=';
  url = url + monthDay;

取得するJSONデータ構造

  {
      "batchcomplete": "",
      "query": {
          "pages": {
              "4951": {
                  "pageid": 4951,
                  "ns": 0,
                  "title": "1月4日",
                  "revisions": [
                      {
                          "contentformat": "text/x-wiki",
                          "contentmodel": "wikitext",
                          "*": "{{カレンダー 1月}}\n'''1月4日'''(いちがつよっか)は[[グレゴリオ暦]]で年始から4日目に当たり、"
                      }
                  ]
              }
          }
      }
  }

  JSONデータ.query.pages[ pageid[0] ].revisions[0]["*"] に本文が格納されている。

  本文の内容の書式

     次の区切り文字列・順番で記事が並んでいる。
    各記事はアスタリスク(*)で始まり改行文字で終了している。
       == できごと ==
       == 誕生日 ==
       == 忌日 ==
       == 記念日・年中行事 ==
       == フィクションのできごと ==
       == 誕生日(フィクション) ===
       == 出典 ==
       == 関連項目 ==

wikipediaから今日に関する記事を取得し文字列で返すJavaScript

function wikipediaWhatIsToday(countArticle) {  // countArticleに取得する記事数を指定する
  var now = new Date();
  var month = now.getMonth()+1;
  var day = now.getDate();
  var monthDay = month+"月"+day+"日 ";
  var url = 'https://ja.wikipedia.org/w/api.php?format=json&utf8&action=query&prop=revisions&rvprop=content&titles=';
  url = url + monthDay;
  var response = UrlFetchApp.fetch(url);
  var json = response.getContentText();
  var data = JSON.parse(json);

  // get the page IDs
  //   http://stackoverflow.com/questions/30006183/get-wikipedia-pageid-from-title より
    var pageid = [];
    for( var id in data.query.pages ) {
      pageid.push( id );
    }

  // 記事本文を取得
  var content = data.query.pages[ pageid[0] ].revisions[0]["*"];  // キー*の値は["*"]で取り出す

  // 「できごと」を取り出す
  var dekigoto = content.match(/== できごと ==[\s\S]*== 誕生日 ==/);  // 改行文字を含む文字列には [\s\S]* を使う

  // アスタリスクで始まり改行文字で終わる文字列を取り出す
  article = dekigoto[0].match(/\*.+\n/g);  // *の前に\が必要

  // countArticleの個数の記事を取り出す
  var numberArticle = [];
  while (true) {
    var rand = Math.floor( Math.random() * article.length) ;
    numberArticle.push(rand);
    numberArticle = numberArticle.filter(function (x, i, self) {
            return self.indexOf(x) === i;
        })
    if (numberArticle.length == countArticle ) {
      break;
    }
  }

  var outputText = monthDay + "のできごと\n";
  numberArticle.forEach(function(numLine) {
    outputText = outputText + article[numLine] + "\n";
  });
  return outputText;
}

0 件のコメント:

コメントを投稿