PHPからBing Search APIを使って画像を収集する

(2016/11/18追記)
Bing Search APIの無料利用は2016年12月をもって終了するようです。そのため本記事の方法は利用できなくなる見込みです。

# 無料の検索API

検索と言えば「ぐぐる」のGoogleが有名ですが、検索結果を使って何かしたいときに使えるGoogle Custom Search APIは無料では100リクエスト/日で若干使いづらいところがあります。

そんなときには、5,000リクエスト/月のMicrosoftのBing Search APIの方がちょこっと多めに使えます。

# Bing Search APIを使う準備

1. Microsoftアカウントを作る

2. Azure Marketplaceで無料の「5000トランザクション/月」のプランにサインアップする
 * https://datamarket.azure.com/dataset/bing/search

3. Azure Marketplaceのマイアカウントのアカウントキーでキーの値を取得する
 * https://datamarket.azure.com/account/keys

# Bing Search APIをPHPから使ってみる

まずは下のサービスエクスプローラで検索条件を検討します。

* https://datamarket.azure.com/dataset/explore/bing/search

ここでは「修造」というキーワードの画像を収集してみます。「Image」タブを開いてパラメータをこうしてみます。

* Query: 修造
* Options: (空のまま)
* Market: ja-JP
* Adult: Strict
* Latitude: (空のまま)
* Longitude: (空のまま)
* ImageFilters: Size:Medium

そして「適用」ボタンを押すと、「現在表示されているクエリの URL:」のURLが更新されるのでコピーしときます。

https://api.datamarket.azure.com/Bing/Search/v1/Image?Query=%27%E4%BF%AE%E9%80%A0%27&Market=%27ja-JP%27&Adult=%27Strict%27&ImageFilters=%27Size%3AMedium%27

Bing Search APIではこのURLに対してBasic認証でGETでアクセスすると結果を取得できます。デフォルトだとXMLなので↑のURLに「&$format=json」を追加します。

```
<?php

$url = 'https://api.datamarket.azure.com/Bing/Search/v1/Image?Query=%27%E4%BF%AE%E9%80%A0%27&Market=%27ja-JP%27&Adult=%27Strict%27&ImageFilters=%27Size%3AMedium%27&$format=json';
$username = '';
$password = 'アカウントキー';

$option = array(
    'http' => array(
        'method' => 'GET',
        'header' => 'Authorization: Basic ' . base64_encode($username . ':' . $password),
    ),
);
$context = stream_context_create($option);
$result = file_get_contents($url, false, $context);
var_dump(json_decode($result, true));
```

これの実行結果がこんな感じになります。

```
array(1) {
  ["d"]=>
  array(2) {
    ["results"]=>
    array(50) {
      [0]=>
      array(11) {
        ["__metadata"]=>
        array(2) {
          ["uri"]=>
          string(150) "https://api.datamarket.azure.com/Data.ashx/Bing/Search/v1/Image?Query='修造'&Market='ja-JP'&Adult='Strict'&ImageFilters='Size:Medium'&$skip=0&$top=1"
          ["type"]=>
          string(11) "ImageResult"
        }
        ["ID"]=>
        string(36) "bab2ccce-3a35-41fb-8af0-58510888c74c"
        ["Title"]=>
        string(12) "松岡修造"
        ["MediaUrl"]=>
        string(79) "http://www.officiallyjd.com/wp-content/uploads/2013/01/20130112_ichihara_15.jpg"
        ["SourceUrl"]=>
        string(65) "http://www.officiallyjd.com/archives/209179/20130112_ichihara_15/"
        ["DisplayUrl"]=>
        string(57) "www.officiallyjd.com/archives/209179/20130112_ichihara_15"
        ["Width"]=>
        string(3) "480"
        ["Height"]=>
        string(3) "345"
        ["FileSize"]=>
        string(5) "23667"
        ["ContentType"]=>
        string(10) "image/jpeg"
        ["Thumbnail"]=>
        array(6) {
          ["__metadata"]=>
          array(1) {
            ["type"]=>
            string(14) "Bing.Thumbnail"
          }
          ["MediaUrl"]=>
          string(77) "http://ts1.mm.bing.net/th?id=OIP.M38c05c8bf108c9a9978bf09f6d2f4010o0&pid=15.1"
          ["ContentType"]=>
          string(9) "image/jpg"
          ["Width"]=>
          string(3) "300"
          ["Height"]=>
          string(3) "215"
          ["FileSize"]=>
          string(4) "9142"
        }
      }
      [1]=>
(中略)
    }
    ["__next"]=>
    string(156) "https://api.datamarket.azure.com/Data.ashx/Bing/Search/v1/Image?Query='%E4%BF%AE%E9%80%A0'&Market='ja-JP'&Adult='Strict'&ImageFilters='Size:Medium'&$skip=50"
  }
}
```

一度に得られる結果は最大50件になります。次の結果を得たい場合は__nextのURLにアクセスします。