Google Web APIs ABA Games

Google Web APIsで遊ぼう

Google Web APIsで遊ぼう (c) 長 健太(ABA."Saba")

Googleの膨大なデータに好き勝手にアクセスできる Google Web APIs が公開された(ベータだけど)。 ここは、その全貌には迫らないけど、なにかこいつを叩いて遊べないかと 画策するページです。

とりあえず作ってみたサンプル
Google Web APIsってなに? すごいの?

Google Web APIs っていうのは、 Google を他のプログラムから叩くための口です。 世界最強であらせられる検索エンジンでいらっしゃるGoogle様の 検索結果とかを好き勝手に使い倒すことができる すばらしいものなのです。

でも、良く考えると、今までもGoogleにクエリーを投げてその検索結果を HTMLでもらって、それを切り出すことはできたんだよねえ。 そう考えるとあんまりたいしたことないのかなあ。

あ、そうそう、この叩くための口、 SOAP でできているんですよ。 SOAPってのは、XMLを使ってWeb上にあるサービスにアクセスするための 仕組みで、今はやりのWebサービスっていうやつを実現するための 基本技術ってやつですか、すごい! (詳しくは IT用語辞典:SOAPなどを参照)

でもSOAPでできているからといっても、特になにかができるという わけでもないんですよね。所詮、リモートのサーバが呼び出せるっていうだけ。 GoogleにXMLをPOSTすると結果が返ってきますというだけの話。 そう考えるとあんまりたいしたことないのかなあ。

でも、これを使えばGoogleが誇るデータベースに 自由にアクセス可能になるのです。 いままでWebサービスといっても、なんの役に立つのか良く分からないものが ちょぼちょぼあっただけだったのですが、これでやっとこさまともに使える Webサービスというのが手に入ったわけなのです。 Webサービス時代の幕開けなのです。

でもWebサービスって、複数のサービスつなげてなんぼ、 単体で使ってもあんまり面白くないんだよね。 そう考えるとあんまりたいしたことないのかなあ。

結局何ができるんでしょう

以上。まあできることはこれだけなんだよね。

でも重要なのは「検索」できるということ。 Googleにクエリー(検索したい言葉)を飛ばして、 その結果をいじくるソフトを、 Google Web APIsを使えば簡単に書けるということです。

検索で得られる情報は、

などなど。まあGoogleで普通に検索して、検索結果画面に出てくる情報は ほとんど取れると思ってかまわない。 宣伝とかはとれないけど。 (宣伝が取得できるAPIって面白いかも。 <xsd:element name="sponsoredBy" type="typens:ResultElementArray"/>)

どうやって使うんでしょうか

Google Web APIs Home を見てもらえれば分かると思いますが、まずGoogleのアカウントを 取得する必要があります、ので取得しましょう。 Google Web APIsには、アカウントを取ったあと発行されるライセンスキーを 使ってアクセスします。ちなみに1アカウントで1日1000回までしか 結果を取得できないことに注意。だからといって1人でたくさん アカウントを取ってはいけません。ライセンス違反です。 (ちなみにライセンスについては、 Terms and Conditions for Google Web API Service を読んでください。基本的に個人、非商用目的以外は禁止。)

キーをもらったら実際にプログラムを書いてGoogleを叩いてみましょう。 必要なライブラリやドキュメントは Download the Google Web APIs Developer's Kit にあります。 Java版と.NET版が入ってます。 .NET版、最先端っぽくてかっこいいけど、なにぶん私が分かってないので、 以下はJavaを使うことにします。.NETはだれか他のドットネッターにまかせた。

Javaを使ってGoogleを叩くのにも、何通りか方法があります。

  1. Developer's Kitにあるライブラリを使う

    これ簡単。SOAPをしらなくてもおっけー。 APIドキュメントをにらみながら、対応するAPIをぺちぺち 叩けば結果が簡単にとれます。でもこれ日本語が通らなくない?

  2. Apache SOAPなどを使ってSOAP呼び出しを送り出す

    Apache SOAPなどに 代表されるSOAPを扱うためのライブラリを使って、 Googleに対してSOAPで呼び出しを行います。 SOAPのメッセージをちゃんと構築しないといけないけど、 その分いろいろ細かいカスタマイズがききます。 でもやっぱり日本語が通らないような。

  3. XMLを直接POST

    原始的。SOAPっつても、所詮HTTPのPOSTをサーバで受け付けているだけなので、 XMLのドキュメントを書いてPOSTしてやれば叩くことができる。 ただし自前でGoogle Web APIsが理解するXMLを書かなきゃいかんし、 返ってくるXMLを自前でパースしなきゃいかん。 でも、こうすると小手先技で日本語を通すことができる!

日本語使えるの?

使えません。表向きには。

でもなぜか使える。以下に挙げる方式はどうも裏口っぽく、ひょっとしたら 今後使えなくなるかもしれない。でも一応書いておく。

肝は3つ。

ちなみにWindows2000でやった場合。 こうすると日本語のクエリーを投げて日本語の結果を得ることができる。 oeについてはshift-jisじゃなくてもいいかも。

Javaでやる場合のソースの一部を示すと、

    ...
    URL url = new URL("http://api.google.com/search/beta2");
    URLConnection conn = url.openConnection();
    conn.setDoOutput(true);
    conn.setRequestProperty("Content-Type", "text/xml");
    PrintWriter pst = new PrintWriter(
     new OutputStreamWriter(conn.getOutputStream(), "UTF-8"));
    ...

としておいて、pstにxmlをだらだらと流し込む。 Developer's Kit内のsoap-samplesにあるdoGoogleSearch.xmlとかを 流し込めばよい。keyはちゃんと自分で取得したライセンスキーにすること。

結果は、

    ...
    pst.close();
    conn.connect();
    StringBuffer resultBuffer = new StringBuffer();
    BufferedReader rsp = new BufferedReader(
     new InputStreamReader(conn.getInputStream(), "UTF-8"));
    for ( ; ; ) {
      String rspStr = rsp.readLine();
      ...

として取得。あとは返ってきたXMLをパースすればよし。

で、どうしましょう

はい、これでGoogleが叩けるようになりました。 さてどうしましょう。

困った。ネタがない。Googleで検索ができるようになったといっても 特にだからといってやりたいことがあるわけじゃなし。うーむ。

ネタ探しに関心空間をあさってたら、 Googleじゃんけん ってのを見つけた。Googleの検索件数で勝ち負けを競うというネタ。 うむ、最初はこんな感じのものがいいかな。

ぐーぐ流目方でドン!

「ぐーぐ流目方でドン!」を作ろう! なんじゃこりゃ。

  1. まずお題のキーワードとその検索のヒット件数が表示される

    キーワードは「お題ワード」+「固定ワード」で構成される。

  2. 次に別のキーワードを入力して、なるべくお題のヒット件数と 同じ件数を狙う

    検索は「入力したキーワード」+「固定ワード」でやる。

こんなもの。 たとえば「お題ワード」が「ガンバ」で「固定ワード」が「冒険」だとする。 Googleで「ガンバ 冒険」で検索すると8360件ヒットするので、 「?」+「冒険」で8360件ヒットを狙うのだ。 たとえば「マクガイバー」 + 「冒険」だと1340件なのでぜんぜんダメ。 「のび太」 + 「冒険」だと8970件なのでいい線いってる。

やることは簡単で、検索用のクエリーを作って、Googleに投げ、 結果をもらって、その結果を表示すればよい。

でもせっかくなので、

どうやって作ろう

まずはデータを入れるXMLの形式でも決めましょか。 基本的に、

が格納できればいいでしょう。で、以下のようなXMLにした。

こんな感じ。 お題ワード「ガンバ」、固定ワード「冒険」、 入力したワードが「みんなで」。 「ガンバ + 冒険」で検索した件数とその最初にヒットした内容、 「みんなで + 冒険」で検索した件数とその最初にヒットした内容が 入っています。 このようなデータを、Google Web APIsから得た結果を加工して作るわけです。

SOAPを使っているので、 Google Web APIsから返ってくる結果もXMLで表現されています。 なので、上のデータのところどころで、 Googleからもらった結果をそのままデータ表現として使っているところがあります。

<estimatedTotalResultsCount xsi:type="xsd:int">
8360
</estimatedTotalResultsCount>

とかね。ちなみにこれは、検索してヒットした件数を表している部分。

つぎにこのデータを加工してHTMLにするXSLTの定義を書かなきゃいかん。 XSLTの詳細はここでは書かない。よく分かってないし。 前に挙げたサンプルで覚えるXSLTプログラミングや、 Servlet と XML で掲示板にトライ なんかが役にたつ。

XSLT初心者のxslファイル、というか初めてのxslファイルがこちら。

とくに難しいことはやってない、んだが、非常に苦労したぞ。 XSLT扱うのって結構難儀。

ここまでくれば後は最初にいったデータを作るサーブレットを書けばよし。 ここでは詳細は説明しない。ソースの中の、

を参照。どれもすごく短いので簡単に読めるかと。 これだけでさくっと作れるのだから、やはりGoogle Web APIsはえらい!

Let's 目方でドン!

さあ必要なファイルをmycgiserverに配置していざアクセス!

ぎエー。なんだこりゃ。日本語がぜんぜんよめないざます。 なぜだ。ローカルでテストしたときはうまくいってたし、 mycgiserverにはXSLTエンジンである Apache Cocoon2 があるはずなのに。mycgiserverのinstalled componentsをチェック。

cocoon.jar  1.8.2

あ。

日本語に対応してない1.8.2じゃん。どーしよー。 このままだと日本語が出ないぞ。どうするんだ。 まて次号!

Let's もういっかい目方でドン!

まて次号!じゃない。しょうがないのでXSLTを使わずに サーブレットで直に出力してみた。

どうだ! 出た! 日本語!

ちなみにこのサーブレットは、XSLTのまがい物みたいな動作をするものです。 汎用性は皆無。

ご意見、ご感想

ご意見、ご感想は、 cs8k-cyu@asahi-net.or.jp までお願いします。

ABA Gamesトップページへ