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にアクセスし、その結果を解析するという単純なものが多いと言えます。