説明しよう!bot

正体は 大迫半端ないbot with Wikipedia です. するいる を見つけて、あたかもそれが半端ないように説明します. 旬が過ぎそうなので公開しますね.

ソースコード

const request = require('request');

// Wiki API
const wiki_url = "http://ja.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&titles=";

const toHalfWidth = (string) => {
  return string.replace(/[!-~]/g, (halfString) => String.fromCharCode(halfString.charCodeAt(0) - 0xFEE0))
    .replace(/”/g, "\"")
    .replace(/’/g, "'")
    .replace(/‘/g, "`")
    .replace(/¥/g, "\\")
    .replace(/ /g, " ")
    .replace(/〜/g, "~");
};

const requestWiki = (word, callback) => {
  if (!word) {
    callback(word + 'はんぱないって。');
    return;
  }
  request(wiki_url + encodeURI(toHalfWidth(word)), (error, response, body) => {
    if (!error && response.statusCode === 200) {
      const info = JSON.parse(body);
      const query = info.query;

      var contents = [];
      if (query && query.pages) {
        for (var p in query.pages) {
          if (query.pages[p].extract) {
            contents = query.pages[p].extract.replace(/<("[^"]*"|'[^']*'|[^'">])*>/g,'').split('');
            if (contents && contents.length > 0) {
              var suru = null;
              for (var i = 0; i < contents.length; i++) {
                if (contents[i].match(/(.*)する$/i) != null) {
                  suru = contents[i];
                  break;
                }
              }
              if (!suru) {
                for (var i = 0; i < contents.length; i++) {
                  if (contents[i].match(/(.*)いる$/i) != null) {
                    suru = contents[i].replace(/いる$/, "");
                    break;
                  }
                }
              }
              if (suru) {
                callback(word + 'はんぱないって。アイツはんぱないって。' + suru.replace('\n', '') + 'もん。そんなん出来ひんやん、普通。');
                return;
              }
            }
          }
        }
      }
    }
    callback(word + 'はんぱないって。');
  });
};

使い方

requestWiki('小倉唯', (body) => {
  // 送信処理
});

おわりに

Wikipedia の文章は一見いろいろな書き方が存在するが、実はよく似た書き方がされている。 その特徴をつかんで面白おかしく実装するのもいいですね.