Laravel上でGoogle Custom Search APIを使ってみた

# ■ はじめに
Laravel上でGoogleの検索機能を応用したWebアプリを作りたいと思い立ったので、
よさげなライブラリ「[Laravel Google Custom Search Engine](https://github.com/jdrda/laravel-google-custom-search-engine)」を調査／試用してみた。

ざっと調べた感じ、GoogleのCustom Search APIは「1日100リクエスト」までなら無料で利用できるらしい。
それ以上のリクエストは有料のようだ。

(もともと、Googleの検索用APIは「Google Web Search API」という名称だったようだが、こちらは2010/11/1から非推奨となり、2014/9/29で廃止されている。)
~~https://developers.google.com/web-search/docs/~~ (廃止版のドキュメント)

# ■ 前提
* Googleアカウントを持っていること
* Laravelアプリケーションが動作する環境が整っていること

# ■ 作業
## ◇ Google Custom Search APIの設定
1. [Google APIの一覧ページ](https://console.developers.google.com/apis/library)から「Custom Search API」を選択
1. プロジェクト未作成であればプロジェクトを作成し、APIを有効にする
1. 必要な認証情報の設定を行う
1. APIを呼び出すためのキーが発行される

## ◇ カスタム検索エンジンの作成
上記のAPIを利用するには、Googleの「カスタム検索エンジン」を設定する必要がある
https://cse.google.com/cse/

1. 検索エンジンを新規追加![カスタム検索 - 検索エンジンの編集 2017-02-12 03-44-47.png](https://qiita-image-store.s3.amazonaws.com/0/165108/dc4845d3-070f-c696-38dc-078e08ed8e96.png)
2. 「検索エンジンの名前」と「schema.orgタイプ」を入力し、検索エンジンを作成
(schema.orgタイプは、あとから設定画面で自由に編集/削除可能)![カスタム検索 - カスタム検索エンジンの作成 2017-02-12 03-56-31.png](https://qiita-image-store.s3.amazonaws.com/0/165108/f8b013a4-0785-3836-ff11-eef1c30c6900.png)
schema.orgタイプについては、参考リンクからどうぞ。

1. コントロールパネルを開く![カスタム検索 - 作成完了しました 2017-02-12 04-07-59.png](https://qiita-image-store.s3.amazonaws.com/0/165108/6ec70f71-d4cf-c560-02f3-67c919d57715.png)

1. 検索エンジンIDが発行されていることを確認![カスタム検索 - 基本 2017-02-12 04-08-22.png](https://qiita-image-store.s3.amazonaws.com/0/165108/361cb640-ebf0-dbaa-2946-a53a817bf62a.png)

## ◇ Laravel Google Custom Search Engineの用意

公式の手順に従ってインストール
https://github.com/jdrda/laravel-google-custom-search-engine

1. Laravelプロジェクト直下で、composerを利用しライブラリ本体をインストール
<pre>composer require jan-drda/laravel-google-custom-search-engine</pre>
1. インストーリしたライブラリを、サービスプロバイダーとファサードに設定する
    
```php:config/app.php
    'providers' => [
        ...

        'JanDrda\LaravelGoogleCustomSearchEngine\LaravelGoogleCustomSearchEngineProvider',
    ],

...


    'aliases' => [
        ...
        'GoogleCseSearch' => 'JanDrda\LaravelGoogleCustomSearchEngine\Facades\LaravelGoogleCustomSearchEngineProvider',
    ],
```
3.コンフィグファイルを作成
<pre>php artisan vendor:publish --provider="JanDrda\LaravelGoogleCustomSearchEngine\LaravelGoogleCustomSearchEngineProvider"</pre>
4. 上記で作成したファイルに、「APIキー」と「検索エンジンID」を設定

```php:/config/laravelGoogleCustomSearchEngine.php
    'engineId' => '検索エンジンID',
    'apiKey' => 'APIキー'
```

5.検証用コントローラを作成
<pre>php artisan make:controller GoogleSearchController</pre>
6. サンプルプログラムを用意

```php:app/Http/Controllers/GoogleSearchController.php
use Illuminate\Http\Request;
use JanDrda\LaravelGoogleCustomSearchEngine\LaravelGoogleCustomSearchEngine;
use JanDrda\LaravelGoogleCustomSearchEngine\LaravelGoogleCustomSearchEngineProvider;

use Log;

class GoogleSearchController extends Controller
{
    public function index(){
        // CustomSearchEngineライブラリ
        $searchModel = new LaravelGoogleCustomSearchEngine();

        // リクエスト送信
        $searchKeyword = '猫とは';

        // get first 10 results for query '猫とは'
        $results = $searchModel->getResults($searchKeyword);

        Log::debug('$searchKeyword -> '.print_r($searchKeyword, 1));
        Log::debug('$results -> '.print_r($results, 1));

        return view('googleCustomSearch', [
            'results' => '',
        ]);
    }
}
```

7.ログに吐き出してみた結果
<pre>[2017-02-12 02:19:12] local.DEBUG: $searchKeyword -> 猫とは  
[2017-02-12 02:19:12] local.DEBUG: $results -> Array
(
    [0] => stdClass Object
        (
            [kind] => customsearch#result
            [title] => ネコ - Wikipedia
            [htmlTitle] => <b>ネコ</b> - Wikipedia
            [link] => https://ja.wikipedia.org/wiki/%E3%83%8D%E3%82%B3
            [displayLink] => ja.wikipedia.org
            [snippet] => しかし、チアミナーゼは熱によって失活するため加熱すれば問題はなく、イカ・タコなどは
ネコにとっての必須 ... アワビ、サザエ、ノリ: 死亡する危険はないが、春先のアワビの
ツノワタ（内臓）を食べさせるとネコの耳が ...
            [htmlSnippet] => しかし、チアミナーゼは熱によって失活するため加熱すれば問題はなく、イカ・タコなどは<br>
<b>ネコ</b>にとっての必須 ... アワビ、サザエ、ノリ: 死亡する危険はないが、春先のアワビの<br>
ツノワタ（内臓）を食べさせると<b>ネコ</b>の耳が&nbsp;...
            [cacheId] => -fmMe8ASwpYJ
            [formattedUrl] => https://ja.wikipedia.org/wiki/ネコ
            [htmlFormattedUrl] => https://ja.wikipedia.org/wiki/<b>ネコ</b>
            [pagemap] => stdClass Object
                (
                    [cse_thumbnail] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [width] => 230
                                    [height] => 219
                                    [src] => https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcTe8GqM-P_zkvNOS94EMawclL8kr20rWiNRIqZH5KBKwZPFSj5p06_hhQvE
                                )

                        )

                    [metatags] => Array
</pre>
とりあえずできた。
次はこのデータをどう加工するかを考えていきたい。

# ■ 参考リンク
* [Google Custom Search API(カスタムサーチAPI)を使ってプログラム的に検索結果を取得する方法 | urashita.com](http://urashita.com/archives/8158)
* [Google Custom Search API を使ってみる - Qiita](http://qiita.com/megu_ma/items/8cad39f61e35588e5476)
* [schema.org タイプを使ってトピックの検索エンジンを作成 - カスタム検索 ヘルプ](https://support.google.com/customsearch/answer/4544182?hl=ja)
* [Googleリッチスニペット対策！初心者向けSchema.org解説！](https://syncer.jp/schema-entering)