Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2003/10/20

counter hits
since 1999/11/06


PEAR SOAP+Google Web APIsでGoogle検索してみる

alertここにある情報はかなり古くなっており、正しくなくなっている可能性があります。掲載しているサンプルコードiなどは、最新のPHPでは動作しない、もしくは、別途設定・調整が必要になるかも知れません。情報を鵜呑みにせず、あなたの手を動かして、あなたの目で確認してください。

何かと話題の「Webサービス」ですが、個人的にも非常に興味を持ってまして、情報収集とかサンプルを作って「ををーっ!動いた動いた」とか色々やってます。ただ、本当の意味の「実用化」にはまだまだ時間がかかりそうですが、最大の課題の1つと思われるセキュリティ関連の仕様が出てきてますし、コンテンツの方も、Google・Amazon、その他パイロット版を公開しているところもあるようで、ますます目が離せなくなってきています(^-^)

ちょっと前置きがダラダラとなってしまいましたが(^-^; Webサービスの仕組みの1つにSOAP(SOAP1.1まではSimple Object Access Protocolの略)がありますが、PHPでの実装の1つにPEARのSOAPパッケージがあります。今回は、SOAPパッケージを使ってGoogleの検索をWebサービス経由で行うサンプルを書いてみました。

PHP+SOAPについては、かなり以前から公開されているサイトもあります。

まず、GoogleのWebサービスによる検索サービスを利用するためには、ユーザー登録(無料)を行い、開発者キットとライセンスキーを取得する必要があります。登録とキットのダウンロードは、Google Web APIsのページから行います。ダウンロードしたキットを展開すると、GoogleSearch.wsdlがTOPディレクトリにありますので、以下のサンプルと同じディレクトリにコピーしておいてください。

また、PEARのSOAPパッケージをインストールしておきます。今回は、2003/10/19時点での最新版(SOAP 0.8RC2)を使用しました。

●SOAPパッケージのインストール
# pear install soap
downloading SOAP-0.8RC2.tgz ...
...done: 80,053 bytes
install ok: SOAP 0.8RC2
# 

なお、SOAPパッケージには他のパッケージへの依存関係がありますので、インストール時にエラーが発生した場合は、適宜upgradeを行ってください。

●例)パッケージのアップグレード
# pear upgrade [パッケージ名]

さて、今回のPHPスクリプトの方ですが、

  • SOAP_WSDLインスタンスの作成し、WSDLからプロキシ(代理)オブジェクトを作成
  • 生成したプロキシ経由でサービスメソッドをコールし、結果を取得
  • 結果を表示

といった感じで作ってみました。全体的にかなり簡単なコードになりますが、Google Web APIsの制限で、送受信データの文字コードはUTF-8を使用する必要があります。なお、各種エラー処理(SOAP Faultの扱いなど)は省略してあります(^-^;

●google.php

<?php
require_once('SOAP/Client.php');
$GOOGLE_KEY = "[ライセンスキーの値]";
?>
<form action="google.php" method="get">
キーワード:<input type="text" name="query"
    value="<?php echo isset($_GET["query"]) ? $_GET["query"] : ""; ?>">
<input type="submit">
</form>
<?php
    if (isset($_GET["query"])) {
        /**
         * プロキシの作成
         */
        $wsdl = new SOAP_WSDL("GoogleSearch.wsdl");
        $proxy = $wsdl->getProxy();

        /**
         * 検索キーワードをUTF-8に変換
         */
        $query = mb_convert_encoding($_GET["query"], "utf-8", "auto");

        /**
         * 検索実行
         */
        $result = $proxy->doGoogleSearch(
                        $GOOGLE_KEY,
                        $query,
                        0,                // 開始件数
                        10,                // 取得件数
                        false,            // 同じサイトを無視するかどうか
                        "countryJP",    // 国(デフォルトでは米国)
                        false,            // アダルトサイトも含めるかどうか
                        "lang_ja",        // 言語の指定
                        "utf-8",        // 入力エンコーディング
                        "utf-8"            // 出力エンコーディング
                        );
?>
<hr>
<p>●検索結果</p>
検索時間:<?php echo $result->searchTime; ?> sec
<ul>
<?
        /**
         * 検索結果の表示
         */
        foreach ($result->resultElements as $index => $obj) {
            $title = mb_convert_encoding($obj->title, mb_internal_encoding(), 'auto');
            $snippet = mb_convert_encoding($obj->snippet, mb_internal_encoding(), 'auto');
            echo "<dl>";
            echo "<dt><a href=\"" . $obj->URL . "\">" . $title . "</a></dt>";
            echo "<dd>" . $obj->URL . "</dd>";
            echo "<dd>" . $snippet . "</dd>";
            echo "</dl>";
        }
    }
?>

実際に検索をした例をしたに示します。検索時間自体は0.1秒ほどですが、私の環境(ADSL12M:実質1.4M(T~_T))では実際に画面が表示されるまでに(体感的に)約2秒ほどかかりました。

●「php5」で検索した結果の例
●検索結果
検索時間:0.146912 sec


@IT:オブジェクト指向言語に生まれ変わるPHP5 ... 
http://www.atmarkit.co.jp/flinux/special/php5/php5a.html
Top > Linux Square > オブジェクト指向言語に生まれ変わるPHP5[前編]. オブ
ジェクト指向言語に生まれ変わるPHP5 ~ ベータリリース目前!? ... 1/2. Index.
オブジェクト指向言語に生まれ変わるPHP5[前編] ~ ベータリリース目
前!? ... @IT:オブジェクト指向言語に生まれ変わるPHP5 ... http://www.atmarkit.co.jp/flinux/special/php5/php5c.html ... オブジェクト指向言語に生まれ変わるPHP5 ~ PHP5の新機能とPHP4との互換
性 ~ 現在開発中のPHP5は、オブジェクト指向機能が大幅に強化される。
次世代PHPはどのような言語になるのか? ベータリリースをひかえたPHP5 ... Do You PHP? - PHP5関連情報http://www.doyouphp.jp/php5/ PHP本家へ, HOME | SECURITY | INSTALL | SAMPLE | TROUBLE | TIPS | PHP5 | BOOK | LINKS | BBS. HOME.
SECURITY. INSTALL. SAMPLE. TROUBLE. TIPS. PHP5. BOOK. LINKS. BBS. last updated 09/28/2003. hits since
11/06/1999. (C)1999-2003 Hideyuki SHIMOOKA All rights reserved. Valid HTML 4.01! Valid CSS! ... スラッシュドット ジャパン | PHP5 Beta 1http://slashdot.jp/developers/03/06/30/0733256.shtml?topic=56 ... PHP5 Beta 1. Oliver による Monday June 30, @04:20PM の投稿, 求む:当事者
のタレコミ 部門より.. PHP ... MySQL is no longer bundled with PHP5. (スコア:2,
参考になる). Anonymous Coward のコメント: Monday June 30, @05:37PM (#348727). ... スラッシュドット ジャパン | OO ... http://slashdot.jp/developers/03/04/01/0527237.shtml?topic= ... Re:期待~ mera の投稿 (スコア:1) Wednesday April 02, @04:13PM. Re:PHP5もいいけれ
ど (スコア:1). ... Re:PHP5もいいけれど yukifj の投稿 (スコア:1) Wednesday April 02, @05:45PM:
Re:PHP5もいいけれど hebereke の投稿 (スコア:1) Thursday April 03, @12:47AM. ... : (以下略) :

なお、どの様なプロキシオブジェクトが作成されているかは、


<?php
        :
        /**
         * プロキシの作成
         */
        $wsdl = new SOAP_WSDL("GoogleSearch.wsdl");
        $proxy = $wsdl->getProxy();
        :
?>

の部分を、


<?php
        :
        /**
         * プロキシの作成
         */
        $wsdl = new SOAP_WSDL("GoogleSearch.wsdl");
        echo "<pre>" . $wsdl->generateProxyCode() . "</pre>";
        $proxy = $wsdl->getProxy();
        :
?>

としてみてください。SOAPパッケージに含まれるSOAP_Clientクラスを継承したクラスのPHPコードが生成されていることが分かります(適宜改行しています)。このクラスでは、SOAP_Clientクラスのcallメソッドを使用してサービスメソッドをコールしていますが、WSDLが提供されていない場合などはこの方法を使用することになります。逆に、WSDLが提供されているサービスであれば、かなり楽にクライアントアプリケーションを作ることができると思います。

●プロキシのPHPコード

<?php
class WebService_GoogleSearchService_GoogleSearchPort extends SOAP_Client
{
    function WebService_GoogleSearchService_GoogleSearchPort()
{
        $this->SOAP_Client("http://api.google.com/search/beta2", 0);
    }
    function &doGetCachedPage($key, $url) {
        return $this->call("doGetCachedPage",
                        $v = array("key"=>$key, "url"=>$url),
                        array('namespace'=>'urn:GoogleSearch',
                            'soapaction'=>'urn:GoogleSearchAction',
                            'style'=>'rpc',
                            'use'=>'encoded' ));
    }
    function &doSpellingSuggestion($key, $phrase) {
        return $this->call("doSpellingSuggestion",
                        $v = array("key"=>$key, "phrase"=>$phrase),
                        array('namespace'=>'urn:GoogleSearch',
                            'soapaction'=>'urn:GoogleSearchAction',
                            'style'=>'rpc',
                            'use'=>'encoded' ));
    }
    function &doGoogleSearch
        ($key, $q, $start, $maxResults, $filter, $restrict, $safeSearch, $lr, $ie, $oe) {
        return $this->call("doGoogleSearch",
                        $v = array("key"=>$key, "q"=>$q, "start"=>$start, "maxResults"=>$maxResults,
                        "filter"=>$filter, "restrict"=>$restrict, "safeSearch"=>$safeSearch, "lr"=>$lr,
                        "ie"=>$ie, "oe"=>$oe),
                        array('namespace'=>'urn:GoogleSearch',
                            'soapaction'=>'urn:GoogleSearchAction',
                            'style'=>'rpc',
                            'use'=>'encoded' ));
    }
}
?>

ふふふ。。。これからいろいろと遊べそうです(^-^)



About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2003 by Hideyuki SHIMOOKA all rights reserved.