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; } } ?>