Web APIを使おう!~食べ物のカロリーを表示するプラグイン

それでは、基本が分かったところで、入力した文字列をトリガーとして何かしらの情報をWebから引っ張ってくるようなプラグインを作ってみたいと思います。Web APIとは、Webを経由して別のサーバー上にあるプログラムやデータを活用するための仕組みです。APIを利用することで、オンライン書店から書籍情報を検索したり、ある地域の天気予報を調べることができるようになります。

ここでは、Web APIを使う例として、食べ物の名前からそのカロリーを取得する「カロリーAPI」を利用して、食べ物のカロリーを表示するプラグインを作ってみようと思います。

「カキフライ」を入力して変換してみたところ

このWeb APIの使い方は簡単です。指定されたURLに食べ物の名前をパラメータとして加えてアクセスするだけです。これにより食べ物のカロリーをXMLの形式で得ることができます。

いきなり、ATOKダイレクトのプラグインを作ってみる前に、簡単にPythonでこのAPIを利用するサンプルを書いてみます。以下のプログラムを「calorie.py」という名前で保存してください。

calorie.py

#! /usr/bin/env python
# coding:utf-8
import urllib
from xml.dom import minidom, Node

# 設定
apiurl = 'http://soogle.ddo.jp/calapi/api?name=%s&output=xml'
proxy  = {} #proxy = {'http':'http://proxy.example.com:8080'}

# APIにアクセスしてカロリーを取得する
def get_calorie( food ):
    # Calorie API にアクセスする
    food_enc = urllib.quote(food.encode('utf-8'))
    url = apiurl%food_enc
    h   = urllib.urlopen(url, proxies=proxy)
    xml = h.read()
    # XML をパースする
    result = []
    dom = minidom.parseString(xml)
    for item in dom.getElementsByTagName("item"):
        menu_node = item.getElementsByTagName("menuName")
        kcal_node = item.getElementsByTagName("kcalMiddle")
        menu = get_text_from_nodelist(menu_node)
        kcal = get_text_from_nodelist(kcal_node)
        result.append(u"%s (%s kcal)"%(menu,kcal))
    return result

# XML のノードからテキストを取り出す
def get_text_from_nodelist(nodelist):
    s = ""
    for node in nodelist:
        if node.nodeType == Node.TEXT_NODE:
            s += node.wholeText
        if node.nodeType == Node.ELEMENT_NODE:
            s += get_text_from_nodelist(node.childNodes)
    return s

# 実行する
result = get_calorie( u'トンカツ' )
for i in result:
    print i

そして、これを実行するには、コマンドラインから「python calorie.py」と入力します。すると、以下のように表示されるはずです。

「トンカツ」で調べたカロリーの結果が表示された

筆者は Python 初心者だったので、若干、XMLの扱い方を調べるのに時間がかかってしまったのですが、XMLのライブラリ、xml.dom.minidom を使うことで、手軽に任意の要素を取り出すことができます。minidom は、DOM 標準に準拠しているので、JavaScript で XMLを扱ったことがあれば、ちょっと調べるだけで使いこなせるでしょう。

ポイントとなるのは、WebからXMLデータをダウンロードする以下の部分です。

    h   = urllib.urlopen(url, proxies=proxy) # URLを指定する
    xml = h.read()                           # 実際にデータを読み出す

そして、XMLデータをダウンロードしたら、minidom を使って解析します。

    dom = minidom.parseString(xml)

解析したものは、DOM を介してアクセスできます。以下では、DOM にある<item>タグを列挙し、さらにその子ノードにある、<kcalMiddle>という要素を取得しています。

    for item in dom.getElementsByTagName("item"):
        kcal_node = item.getElementsByTagName("kcalMiddle")
        # ...

このように、Web APIを利用するプログラムは、ほとんど、APIにアクセスし、その結果を解析するという単純なものが多いと言えます。