使ってみよう! Windows Live SDK/API

第25回Live Search API 2.0 ─⁠─ JavaScriptからの利用

Live Search API 2.0

昨年の2008年11月に、Live Search API 2.0 Betaがリリースされました。本連載の第1回目でもLive Search APIを紹介しましたが、そのときは1.1 Betaでした。2.0になり大きくAPIが変更されています。

今回はこの新しいバージョンのLive Search APIについてです。まずは新しい機能を簡単に確認してみましょう。

新しい検索対象

「検索」対象とは言えないかもしれませんが、新しく情報を取得できるリソースとして、これまでのWebページや画像に加えて次のものが加わりました。

  • 関連する検索キーワード
  • クイックアンサー
  • 広告

Live Searchで検索すると表示される「関連する項目の検索」の情報図1や、検索キーワード欄に計算式や「2009年 七夕⁠⁠、⁠カロリー ハンバーグ」といった言葉を入力すると表示される情報図2を取得できるようになりました。後者はクイックアンサーと呼ばれるLive Searchの機能です。広告については日本でサービスしておらず、マイクロソフトとの契約が必要であるため、関係のある方は少ないでしょう。

図1 関連する項目
図1 関連する項目
図2 クイックアンサー
図2 クイックアンサー

新しいプロトコル

以前のAPIはXMLをベースとしたSOAPと呼ばれるプロトコルを使用してLive Searchサービスとやり取りをする必要がありました。Version 2.0では新たにプロトコルが増えて次の3種類になっています。

  • JSON
  • XML
  • SOAP

JavaScriptで利用が便利なJSON形式や、多くのWebサービスで利用されているXML形式が増えました。これまで同様SOAP形式もありますが、中のデータ型は変更になっています。

JSON、XML形式ともHTTP GETメソッドによりリクエスト用のURLにアクセスすることでレスポンスを得ます。

このプロトコル追加が一番インパクトのある新機能ではないでしょうか。多くのプログラミング言語からの利用がより簡単になり、JavaScriptを利用するとクライアントPCとLive Searchサービスのサーバーとの通信だけでAPIの利用が可能です。Webアプリケーションサーバーが仲介する必要はありません。本記事ではJavaScriptとJSON形式によるAPI利用を紹介します。

厳密な型

Live Search APIで扱うデータやパラメータは、検索対象によって一様ではありません。これまでのSOAP APIではリクエストとレスポンス用にそれぞれひとつのデータ型しかありませんでした。そのため、レスポンスデータのTitleプロパティに検索語の修正候補が設定されているなど、不都合がおきていました。新しくなったAPIでは検索対象に合わせた個別のデータ型が用意されており、コードを記述する際に間違いの軽減や可読性に役立つものとなっています。

その他の変更点

上記のほかに、この後に登場するLive Search Developer Centerの刷新や、利用規約の改定により無制限にAPI呼び出しが可能になったこと、エラーハンドリングの改善が変更点となっています。

Application IDの取得

Live Search API を利用するにはApplication IDが必要となります。まずはApplication IDを作成しましょう。作成にはWindows Live IDアカウントが必要です。

Live Search Developer Center図3へ移動し、以下の項目について記入します。

項目 説明
Application name アプリケーション名
Description アプリケーションの説明
Company name 会社名
Country/region 国・地域
Email address E-mailアドレス
Website Webサイトのアドレス(オプション)

アプリケーション名にはAPIを利用するアプリケーションの名前を記入します。企業のみの利用に限られていませんので、会社名には個人利用の場合、それとわかる内容を記入しておくとよいでしょう。

図3 Live Search Developer Center
図3 Live Search Developer Center

利用規約を確認後(承諾の場合チェックボックスをチェックします⁠⁠、⁠Agree]ボタンをクリックするとApplication IDが作成されます。IDは16進数の文字列です。

作成したIDの管理はLive Search Developer CenterのHomeページから行います。最近24時間の各IDによるAPI利用回数も確認することができます。

JSON形式の利用

さてLive Search APIでJSON形式のデータを得る方法ですが、そのためには次の書式のアドレスにアクセスするだけです。

http://api.search.live.net/json.aspx?AppId=[Application ID]&[必要なリクエストパラメーター(複数)]&JsonType=[JSON形式レスポンスの種類]

リクエストに必要なパラメータは後述していますので、先にレスポンスの種類を確認しておきましょう。レスポンスは次の3種類が用意されています。

  • JSON
  • 関数
  • コールバック関数

プログラムから扱いやすいように純粋なJSON形式だけでなく、JSON形式の文字列を戻り値として返す関数として、もしくはJSON形式の値を引数として関数に渡しているコードとして結果を得ることができます。

それぞれの種類の例を示します。⁠Windows Live」をWebから検索し最初の1件を取得した結果です。例では見やすいよう改行や空白の挿入をしています。

JSON

純粋なJSON形式の場合は、次のように中括弧で括られた文字列が返ってきます。URLのパラメータのJsonTypeには「raw」を指定します。JsonTypeパラメータを指定しない場合も、この形式の結果が返ってきます。

{
    "SearchResponse": {
        "Version": "2.0",
        "Query": { "SearchTerms": "Windows Live" },
        "Web": {
            "Total": 121000000,
            "Offset": 0, 
            "Results": [{
                "Title": "Windows Live メッセンジャー \/ MSN メッセンジャー",
                "Description": "(省略)",
                "Url": "http:\/\/messenger.live.jp\/",
                "DisplayUrl": "http:\/\/messenger.live.jp\/",
                "DateTime": "2009-01-04T04:22:05Z"
            }]
        }
    }
}

関数

関数の場合は次のようになります。LiveSearchGetResponseという関数の戻り値にJSON形式の値が設定されています。URLのJsonTypeパラメータには「function」を指定します。

function LiveSearchGetResponse() {
    return { 
        "SearchResponse": {
            "Version": "2.0",
            "Query": { "SearchTerms": "Windows Live" },
            "Web": {
                "Total": 121000000,
                "Offset": 0, 
                "Results": [{
                    "Title": "Windows Live メッセンジャー \/ MSN メッセンジャー",
                    "Description": "(省略)",
                    "Url": "http:\/\/messenger.live.jp\/",
                    "DisplayUrl": "http:\/\/messenger.live.jp\/",
                    "DateTime": "2009-01-04T04:22:05Z"
                }]
            }
        }
    }; /* pageview_candidate */
}

コールバック関数

最後にコールバック関数形式です。ifステートメントから始まる文字列になっており、API呼び出し時に指定した関数が存在する場合、その関数にJSON形式の結果を渡しています。

アドレスのJsonTypeパラメータには「callback」を指定し、関数名をJsonCallbackパラメータに指定します(JsonType=callback&JsonCallback=UserCallback のようになります⁠⁠。

if(typeof UserCallback == 'function') 
    UserCallback({ 
        "SearchResponse": {
            "Version": "2.0",
            "Query": { "SearchTerms": "Windows Live" },
            "Web": {
                "Total": 121000000,
                "Offset": 0, 
                "Results": [{
                    "Title": "Windows Live メッセンジャー \/ MSN メッセンジャー",
                    "Description": "(省略)",
                    "Url": "http:\/\/messenger.live.jp\/",
                    "DisplayUrl": "http:\/\/messenger.live.jp\/",
                    "DateTime": "2009-01-04T04:22:05Z"
                }]
            }
        }
    } /* pageview_candidate */);

本記事ではこのコールバック関数の形式を使用しています。

Web検索

実際にJavaScriptでWebの検索結果を取得してみましょう。先にも書いたようにhttp://api.search.live.net/json.aspxへアクセスして結果を得ます。URLに必要なパラメータを追加して検索対象や検索オプションを指定します。

必須パラメータ

必ず指定するパラメータは次の3種類です。

AppId

作成したAppliation IDを指定します。

Query

検索する文字列を指定します。

Sources

検索対象を指定します。Webの場合は「Web」と指定します。指定できる対象は以下の通りです。

指定する値 説明
Ad 広告[1]
Image 画像検索
InstantAnswer クイックアンサー
News ニュース[1]
Phonebook 電話帳[1]
RelatedSearch 関連する検索キーワード
Spell 検索語の修正候補
Web Web

Sourcesには複数の値を指定でき、一度のリクエストで複数対象の結果を得ることができます。例えば「Sources=Web+RelatedSearch」のように指定します。

※1

日本向けサービスは現在提供されていません

オプションパラメータ

動作を細かく指定するためにいくつかオプションで指定するパラメータもあります。パラメータはSource共通のものとSource固有のものがあります。ここではWebで使用する主なものを紹介します。

Market

国・地域情報を指定します。日本の場合は「ja-jp」です。

Web.Count

取得する件数を指定します。デフォルトは10です。最大50まで指定できます。

Web.Offset

オフセット値を指定します。デフォルトは0です。10と指定すると検索結果上位11番目からの結果を取得できることになります。最大1000まで指定可能です。

Options

「EnableHighlighting」と指定すると、結果のWebタイトルや説明文内に検索語が含まれている場合、検索語前後にUnicode文字「U+E000」「U+E001」が挿入されます。検索語のハイライトに使用するために用意されています。

コードの記述

それでは実際にコードを記述します。ここではHTMLファイルを作成して、scriptタグ内にコードを書きます。最初に以下の内容のHTMLを記述します。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <title>Live Search Sample</title>
    <script type="text/javascript">
    <!--
        // (ここにコードを記述します)
    //-->
    </script>
</head>
<body>
    <div>
        <input type="text" id="terms" />
        <input type="button" value="Search" onclick="search();" />
        <div id="output" />
    </div>
</body>
</html>

表示されるページは図4のようになります。テキストボックスに検索語を入力してSearchボタンをクリックすると、Live Searchの結果を表示するようにしましょう。

図4 作成するWebページ
図4 作成するWebページ

JavaScriptからAPIを利用する場合、Live Search APIのURLのドメイン(api.search.live.net)とWebページのあるドメインとが異なり、通常はコード上からAPIのURLへはアクセスできません。ただし、scriptタグに指定するURLは異なるドメインでも通信が可能です。一般的な手法としてJavaScriptのコードからscript要素を追加してこのクロスドメインの問題を回避します。

Searchボタンをクリック時の処理を記述します。APIのアドレスの文字列とscript要素を作成し、script要素のsrc属性にアドレスを指定してheadタグ内へ挿入しています。

// Search ボタン クリック
function search() {
    var appId = '作成した Application ID';

    // アクセスするアドレスにパラメータを指定
    var request = 'http://api.search.live.net/json.aspx?'

    // 必須パラメータ
    + 'AppId=' + appId
    + '&Query=' + encodeURI(document.getElementById('terms').value)
    + '&Sources=Web'

    // オプションパラメータ
    + '&Market=ja-jp'

    // コールバック関数形式を指定
    + '&JsonType=callback'
    + '&JsonCallback=searchCompleted';

    // script 要素作成
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.setAttribute('id', 'searchScript');
    script.src = request;

    // head 要素内に script 要素挿入
    var head = document.getElementsByTagName('head');
    var oldScript = document.getElementById('searchScript');
    if (oldScript != null) head[0].removeChild(oldScript);
    head[0].appendChild(script);
}

続いてコールバックされる関数を記述します。この関数にJSON形式の値が渡されます。ここでは検索結果を表示することにします。検索結果の値は引数のresponseを使用して「response.SearchResponse.Web.Total」のように参照できます。構造は既に示したJSON形式の値を参考にしてください。response.SearchResponse.Web.Resultsが配列になっていて、Webサイトの情報が取得した件数分格納されています。

// コールバックされる関数
function searchCompleted(response) {
    // id="output"のdiv要素取得
    var output = document.getElementById('output');
    output.innerHTML = '';

    // 検索語と結果件数を表示
    var header = document.createElement("div");
    header.innerHTML =
          response.SearchResponse.Query.SearchTerms + ' の検索結果 '
        + response.SearchResponse.Web.Total + ' 件';
    output.appendChild(header);

    // 各Webページの情報(タイトルとアドレスと説明)を表示
    var list = document.createElement("ul");
    var results = response.SearchResponse.Web.Results;
    for (var i = 0; i < results.length; ++i) {
        var item = document.createElement("li");
        list.appendChild(item);
        item.innerHTML =
            '<a href="' + results[i].Url + '">' + results[i].Title + '</a><br />'
            + results[i].Description;
    }
    output.appendChild(list);
}

上記はコールバックされたときのエラー処理を省略しているのですが、ひとまず動作するものができました。実際に確認してみましょう図5⁠。

図5 検索結果の表示
図5 検索結果の表示

エラー処理

エラーハンドリングについても確認しておきます。API呼び出し時のパラメータの不備や、検索対象のサービスが一時的に利用できないなどの場合はレスポンスにはエラーを示す番号とメッセージが格納されています。JSON形式の場合は次のようになります。例では必須パラメータを指定せずに呼び出した場合です。

{
    "SearchResponse": {
        "Version": "2.0",
        "Query": { "SearchTerms": "" },
        "Errors": [{
            "Code": 1001,
            "Message": "Required parameter is missing.",
            "Parameter": "SearchRequest.Sources",
            "HelpUrl": "http:\/\/msdn.microsoft.com\/en-us\/library\/dd251042.aspx"
        }]
    }
}

コールバック関数形式でAPIを呼び出していた場合は上記JSON値が指定した関数に渡されます。

正常時のJSON値と比較してください。SearchResponse.Webがなくなり、代わりにErrorsがあります。このSearchResponse.Errorsの有無によりリクエストが正常に処理されたか判断できます。

以上より先ほどのsearchCompleted関数は次のように書くことができます。

function searchCompleted(response) {
    var errors = response.SearchResponse.Errors;
    if (errors != null) {
        var message = "エラーが発生しました。\n";
        for (var i = 0; i < errors.length; ++i) {
            message += "Message: " + errors[i].Message + "\n";
        }
        alert(message);
        return;
    }
    // 以下 元のコードと同じ
}

用意されているエラーコードは、Error Handling (Live Search, Version 2.0) で確認できます。

サンプルコード

最後にサンプルについて紹介して終わります。本連載ではWeb検索しか扱えませんでしたが、まだ多くのことがLive Search APIで行えます。豊富なサンプルが提供されていまので併せて試してみるとよいでしょう。下記のリンクからダウンロード可能です。

サンプルの言語はJavaScript、VB.NET、C#があり、JavaScriptはJSON、VB.NETとC#はXMLとSOAP形式を利用しています。すべての検索対象に対してのコードが用意されていて、複数の対象を選択した場合のサンプルも含まれています。サンプルコードは単純でリファレンスがなくとも直観的にわかるのではないかと思います。より詳細な情報は、MSDN Libraryを参照してください。

おすすめ記事

記事・ニュース一覧