Java テキストRPG〜情報を揃える WikipediaAPI〜

WikipediaAPIを使用して自分の欲しい情報をまとめたいと思います。
他にもたくさんあるようです。
FaceBookAPIとか興味深いですね。参考サイトはこちらです。

WebAPIを使う

WebAPIを使用するということは、早い話が「ウェブサーバーで提供している情報を取得する」ということです。国のAPIとか、地域の。。。いわゆる「ビッグデータ」がこれに相当します。
このWebAPIを使用して取得した情報を元に自分で使用するための情報を揃えようという分けです。

とりあえずは、WebAPIを叩いてみないことには始まらないのでとりあえず叩きます。
コマンドは以下の通りです。参照するページはこちらです。
curl http://wikipedia.simpleapi.net/api?keyword="武器"

そして、パラメータは以下になります。

keyword : キーワード。エイリアスとして、qも指定可能
output : 出力方式(xml,rss,json,html,javascript,php,tsvを指定可能。デフォルトはxml)
callback : 出力形式がJSONP時の名称を指定可能
lang : 現在未実装。現在は日本語(ja)のみ。
search : 現在未実装につき1のみ。(0.その特定キーワードのみを取り出す、1.前方一致、2.後方一致、3.前後方一致、4.FULLTEXT)

上のコマンドではパラメータに「武器」を設定しています。
出力内容は一部ですが、下に記載します。ちなみにXMLで取得しています。デフォルトがXMLでの取得になるようです。

<results>
<result>
    <language>ja</language>
    <id>401062</id>
    <url>http://wikipedia.simpleapi.net/ja/401062/</url>
    <title>武器等製造法</title>
    <body>武器等製造法(ぶきとうせいぞうほう、昭和28年8月1日法律第145号)は、日本の法律。最終改正は平成12年5月31日法律第91号。 武器の製造の事業の事業活動を調整することによつて、国民経済の健全な運行に寄与するとともに、武器及び猟銃等の製造、販売その他の取扱を規制することによつて、公共の安全を確保することを目的としている。 武器、猟銃等の製造(改造、修理も含む)については経済産業省の所管となる。 定義 この法律では「武器」「猟銃等」について以下のように定義している。 武器銃砲 銃砲弾 爆発物 爆発物を投下し、又は発射する機械器具 ロケット弾発射機 爆雷投射機 魚雷発射管 爆弾投下器 「銃砲」「銃砲弾」「爆発物」「爆発物投下機械器具」「爆発物発射機械器具」に類する機械器具 銃剣 火炎発射機 銃砲を搭載する構造を有する装甲車両であって、無限軌道装置により走行するもの 「銃砲」「銃砲弾」「爆発物」「爆発物投下機械器具」「爆発物発射機械器具」「これら類する機械器具」に使用される部品 銃砲の部品 銃身 拳銃の機関部体 拳銃の回転弾倉 拳銃のスライド 銃架 砲身 砲架 銃砲弾の部品 銃弾の弾丸 火薬類が入っていない信管 砲弾の弾体 薬莢 爆発物の部品 火薬類が入っていない信管 ロケット弾の弾体 手榴弾の弾体 地雷の外殻 爆雷の外殻 機雷の本体の外殻 魚雷の気室 爆弾の弾体猟銃等猟銃 捕鯨砲 銛銃 屠殺銃 空気銃 構成 第1章 - 総則(第1条~第2条) 第2章 - 武器(第3条~第16条) 第3章 - 猟銃等(第17条~第20条) 第4章 - 雑則(第21条~第30条) 第5章 - 罰則(第31条~第35条) 附則 資格 武器製造事業者 猟銃等製造事業者 関連項目 銃砲刀剣類所持等取締法 行政 外部リンク 武器等製造法全文。</body>
    <length>1393</length>
    <redirect>0</redirect>
    <strict>0</strict>
    <datetime>2015-06-11T21:33:58+09:00</datetime>
</result>
<result>
    <language>ja</language>
    <id>1970503</id>
    <url>http://wikipedia.simpleapi.net/ja/1970503/</url>
    <title>武器なき斗い</title>
    <body>『武器なき斗い』(ぶきなきたたかい)は、1960年(昭和35年)に大東映画が製作・配給した日本映画である。 概略 原作は、1959年に中央公論社から出版された西口克己の小説『山宣』である。山宣とは、右翼の凶刃に倒れた労働農民党の代議士・山本宣治のこと。映画化は、西口克己の講演会の後で、大阪市電の勤務者が映画化を提案したのを契機に企画され、製作資金の募金は大阪市交通局の労組、私鉄の労組、大阪総評傘下の労働者が呼びかけて、始まった。没後30周年を記念する映画として、関西在住の3000人が発起人になり、「山宣映画化実行委員会」を結成し、700万円のカンパが集められた。撮影にあたっては、延べ3700人にのぼるエキストラが動員された。 あらすじ 京都府宇治市の料亭花やしきの経営者夫婦のもとに生まれた山本宣治は、同志社大学の講師を務め、性教育の啓発や産児制限運動に関わっていた。やがて労働農民党の京都府連合会委員長となり、第1回普通選挙で当選して代議士となる。治安維持法改正に反対し、国会での質疑を準備している矢先、山本が泊まる東京の旅館に見知らぬ男が訪ねてくる。</body>
    <length>1387</length>
    <redirect>0</redirect>
    <strict>0</strict>
    <datetime>2016-04-23T14:35:07+09:00</datetime>
</result>
</results>

こんな感じで取得できます。しかし、XMLでの取得はできるものの欲しい部分の取得がうまくいきません。。。他ものを探すことにします。

しかし、ちょうど良いものが見つからず。。。
人文学オープンデータ共同利用センター等ものがありましたが、うーむ一歩踏み出せない感じです。

HTMLを取得

仕方ないので、HTMLを取得する方法に切り替えます。具体的には下のようなコマンドを叩くとHTMLを取得することができます。
この取得したものをプログラムで編集して必要なものを取得できるようにしようというものを考えます。
https://ja.wikipedia.org/wiki/%E6%AD%A6%E5%99%A8

Javaの出番

ここでJavaの出番になります。取得したデータを自分の使いやすいように、処理を行う必要があります。
しかし、どんなデータを取得するか?を決めないと実装も何もないです。。。
それでもとりあえずは実装してみました。
リスト形式(ULタグ)のテキストを取得します。ソースはGithubにアップしてあります。

public String execute() {
    String targetUrl = "https://ja.wikipedia.org/wiki/%E6%AD%A6%E5%99%A8";
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = null;
    try {
        builder = factory.newDocumentBuilder();
    } catch (ParserConfigurationException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    try {
        URL urlCls = new URL(targetUrl);
        urlCls.openConnection();
        InputStream inp = (InputStream) urlCls.getContent();
        Document html = builder.parse(inp);
        NodeList nodes = html.getElementsByTagName("ul");
        for (int i = 0; i < nodes.getLength(); i++) {
            loopPrint(nodes.item(i).getChildNodes());
        }

    } catch(MalformedURLException e) {
        e.printStackTrace();
    } catch(IOException ie) {
        ie.printStackTrace();
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return "";
}

今回の実装では、Jsoupを使用せず、w3cのDOMオブジェクトを使用しました。
取得したHTMLの解析などを行うならJsoupを使用した方が良いです。。。

でわでわ。。。



投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す