facebook twitter hatena line google mixi email

Php/GoogleSearchApi

提供: 初心者エンジニアの簡易メモ
移動: 案内検索

Ajax版のGoogleSearchApiを使えばphpからGoogle検索できる

// あまり使いすぎると403で以下メッセージが来る
Suspected Terms of Service Abuse. Please see http://code.google.com/apis/errors

ライブラリ&サンプル

<?php
require_once 'Zend/Http/Client.php';
/**
 * GoogleSearchApi
 *
 * @url http://wiki.nonip.info/work/index.php?php%2FGoogleSearchApi
 * @ex
 * // ウェブ検索
 * $google = GoogleSearchApi::factory();
 * $result = $google->search('Paris Hilton');
 * if ($result->responseStatus == 200) {
 *   foreach($result->responseData->results as $r) {
 *     echo var_dump($r);
 *   }
 * }
 * // 画像検索
 * $google = GoogleSearchApi::factory('Image');
 * $google->setOption('safe', 'active');
 * $result = $google->search('Paris Hilton', 2);
 * if ($result->responseStatus == 200) {
 *   foreach($result->responseData->results as $r) {
 *     echo var_dump($r);
 *   }
 * }
 */
 
/**
 * Google検索
 */
class GoogleSearchApi
{
    public function __construct($type = null)
    {
        // 直接ins生成禁止
        if (!$type) {
            die("error class GoogleSearchApi require factory() method");
        }
    }
    static public function factory($type = null)
    {
        switch($type) {
        case 'image':
            return new GoogleSearchApiImage($type);
            break;
        default:
            return new GoogleSearchApiWeb($type);
            break;
        }
    }
}
/**
 * ウェブ検索
 */
class GoogleSearchApiWeb extends GoogleSearchApiAbstruct
{
    /**
     * constructor
     */
    public function __construct()
    {
        $this->_api = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0';
        parent::__construct();
    }
}
/**
 * 画像検索
 */
class GoogleSearchApiImage extends GoogleSearchApiAbstruct
{
    /**
     * constructor
     */
    public function __construct()
    {
        $this->_api = 'http://ajax.googleapis.com/ajax/services/search/images?v=1.0';
        parent::__construct();
    }
}
/**
 * 基底検索
 */
abstract class GoogleSearchApiAbstruct
{
    protected $_api = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0';
    protected $_options = array();
    
    /**
     * constructor
     */
    public function __construct()
    {
        // 詳細 http://code.google.com/intl/ja/apis/websearch/docs/reference.html#_intro_fonje
        $this->_options = array(
            'hl' => 'ja',
            'lr' => 'lang_ja',
            'rsz' => 'large',    // small(4件), large(8件)
            'safe' => 'off',    // active, moderate, off(エロoff)
            'start' => 0,        // 何番目から取得したいか 0~56
            // 'filter' => 0,    // 0, 1
        );
    }
    /**
     * 検索
     *
     * @param  string $keyword
     * @param  int    $page
     * @return void
     */
    public function search($keyword, $page = 1)
    {
        if ($options) {
            $this->_options = merge_array($this->_options, $options);
        }
        $this->setOption('q', $keyword);
        
        if ($page >= 2) {
            // ページ設定
            $this->setPage($page);
        }
        // リクエスト処理実行
        $json = $this->_requestExec($this->_api, $this->_options);
        
        return json_decode($json);
    }
    /**
     * オプション配列設定
     */
    public function setOptions($options)
    {
        $this->_options = $options;
    }
    /**
     * オプション設定
     */
    public function setOption($key, $option)
    {
        $this->_options[$key] = $option;
    }
    /**
     * ページ設定
     *
     * @param  int  $page
     * @return void
     */
    public function setPage($page = 1)
    {
        if ($page <= 1) return;
        // 何番目から検索するか設定
        $this->_options['start'] = $this->_getRszNumber($this->_options['rsz']) * $page;
    }
    /**
     * リクエスト処理実行
     */
    private function _requestExec($url, $params)
    {
        // Zend_Http_Clientロード
        $client = new Zend_Http_Client();
        $client->setUri($url);
        $client->setConfig(array(
            'maxredirects' => 0,
            'timeout'      => 3
        ));
        // 複数のパラメータを一度に追加します
        $client->setParameterGet($params);
        
        // GET リクエストを実行します
        $response = $client->request();
        $ret = $response->getBody();
        
        return $ret;
    }
    /**
     * rsz数字取得
     *
     * @param  int  $rsz
     * @return void
     */
    private function _getRszNumber($rsz)
    {
        $rszNames = array(
            'large' => 8,
            'small' => 4,
        );
        // 数字でないとき
        if (!is_numeric($rsz)) {
            return $rszNames[$rsz];
        }
        return $rsz;
    }
}
?>