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

第1回Live Search API

はじめに

はじめまして。今回よりWindows Liveサービスにて提供されているAPI・SDKの紹介と、それらを利用したアプリケーションの開発をしていきます。どうぞよろしくお願い致します。

Windows Liveとはマイクロソフトのソフトウェアやサービスを総称するブランド名のひとつです。Windows Liveサービスの中にはAPIやSDKが公開されているものもあり、簡単にWindows Liveサービスそれ自体をカスタマイズしたり、作成するアプリケーションの機能として組み込んだり、マッシュアップに利用したりできます。第1回目はWindows Liveサービスの中でも代表的なLive SearchのAPIについて取り上げます。

Live Search API

Live Search APIは、Live Searchの検索エンジンを利用できるWebサービスです。Live Search APIを利用すれば、Webサイトの検索をはじめ画像やニュースなど多様な情報を取得する機能をアプリケーションに組み込むことができるようになります。今回はVisual Basic 2008 Express Editionを使ってコンソールアプリケーションを作成し、APIの内容を確認します[1]⁠。

Application IDの取得

Live Search APIの利用には、アプリケーションごとにApplication IDを取得する必要があります。下記の手順にて開発者用のサイトへ移動し、Application IDを取得しましょう。取得にはWindows Live IDによる認証が必要です。

  1. http://search.msn.com/developerにアクセスします[2]⁠。
  2. 「Create and Manage Application IDs」からIDの管理ページへサインインします。
  3. 「Get a new AppID」からIDの取得ページへ移動します。
  4. Application Name欄にIDを使用するアプリケーションの名前を入力します図1⁠。名前は後から変更できます。
  5. 利用規約を確認後、⁠I Accept]ボタンをクリックし承諾します。
  6. 管理ページに自動で戻り、IDが登録されたことがわかります。Application IDは16進数の文字列です。
図1 Application IDの取得
図1 Application IDの取得

プロジェクトの作成とサービス参照の追加

それでは、アプリケーションの作成に取り掛かります。まず、新規にコンソールアプリケーションのプロジェクトを作成します図2⁠。ここではLiveSearchSampleというプロジェクト名にしました。

図2 新しいプロジェクトの作成
図2 新しいプロジェクトの作成

Live Search APIは、WSDLとSOAPという仕様や規約を使用しています。アプリケーションではこれらを解釈する必要がありますが、Visual Studioを使用するとサービス参照の追加図3をするだけで、Webサービスを利用することができます。

  1. ソリューションエクスプローラからプロジェクト名を右クリックし、⁠サービスの参照を追加」を選択します。
  2. アドレス欄にLive Search APIのWSDLの場所(http://soap.search.msn.com/webservices.asmx?wsdl)を入力します[3]⁠。
  3. 「移動」をクリックします。すると「1個のサービスが見つかりました」と表示されると思います。
  4. 名前空間欄に参照に使用する名前空間を入力します。ここではServiceReferenceという名前にしました。
  5. [OK]をクリックします。
図3 サービス参照の追加
図3 サービス参照の追加

以上の操作によりWebサービスを利用するクラスが名前空間ServiceReference以下に作られています。

Webサイトの検索

さっそく、Webサイトを検索するコードを書いてみます。はじめにサービス参照により作られた名前空間をインポートしておきます。

Imports LiveSearchSample.ServiceReference

Webサービスに要求する内容を書いていきます。まず、検索対象や取得項目を設定するSourceRequestオブジェクトを生成します。

Dim sourceRequest = New SourceRequest With { _
    .Source = SourceType.Web, _
    .Offset = 0, _
    .Count = 10, _
    .ResultFields = ResultFieldMask.Title Or _
                    ResultFieldMask.Description Or _
                    ResultFieldMask.Url}
Source
検索対象を指定します。SourceType.Webの場合Webサイトを検索します。
Offset、Count
取得する結果件数(Count)とその開始位置(Offset)です。Offsetは0、Countは10が規定値になります。Offsetは最大1,000まで、Countは最大50[4]まで指定可能です。
ResultFields
取得する項目を指定します。複数指定する場合はOr演算子を使います。上記ではタイトル・説明・URLを指定しています。

全般的な設定についてSearchRequestオブジェクトを生成します。

Dim searchRequest = New SearchRequest With { _
    .AppID = "取得したApplication ID", _
    .Query = "技術評論社", _
    .CultureInfo = "ja-JP", _
    .Requests = New SourceRequest() {sourceRequest}}
AppID
取得したApplication IDを指定します。
Query
検索する文字列を指定します。Live Searchの検索オプションで使用する検索キーワードも指定可能です。
CultureInfo
言語と地域の指定です。日本語・日本の場合は「ja-JP」になります。
Requests
SourceRequestオブジェクトの配列を指定します。

以上でWebサービスへのリクエスト内容の作成は完了です。Webサービスを呼び出すクラスのインスタンスを作成し、結果を取得してみます。Searchメソッドを呼び出すことで検索結果が得られます。その戻り値はSearchResponseオブジェクトです。

Dim service = New MSNSearchPortTypeClient
Dim searchResponse = service.Search(searchRequest)
Dim sourceResponse = searchResponse.Responses.Single

ResponsesプロパティにSourceResponseオブジェクトが配列として格納されています。今回の場合は結果が1つ格納されていることが予測されるため、Singleメソッドを用いてSourceResponseを取得しています。

結果をコンソールに出力してみましょう。Totalプロパティに検索リクエストに該当する件数の概算値が入っています。For Eachステートメントを使用してResultsプロパティの内容を表示しています。必ずしも、リクエストした件数分取得できる・指定した項目に値が入っているというわけではありませんので注意してください。

For Each result In sourceResponse.Results
    If result.Title IsNot Nothing Then
        Console.WriteLine("Title: " & result.Title)
    End If
    If result.Description IsNot Nothing Then
        Console.WriteLine("Description: " & result.Description)
    End If
    If result.Url IsNot Nothing Then
        Console.WriteLine("URL: " & result.Url)
    End If
    Console.WriteLine(New String("-"c, 50))
Next

service.Close()

実行するとWebサイトの結果が表示されると思います。うまく動いたでしょうか? ここまでのコードをファイルにまとめました。Searchメソッドを呼び出したとき例外がスローされる可能性がありますのでTry Catchステートメントを使って例外処理をしています。

SampleModule1.vbのダウンロード
SampleModule1.vbファイル

複数のSourceRequestを指定した検索

Webサイトの検索のときにSearchRequest.Requestsプロパティは配列で指定しました。実はSourceRequest.SourceプロパティのSourceTypeが異なれば1度のリクエストで複数のSourceRequestオブジェクトを指定できます。次は複数のSourceRequestを指定して検索できるように変更を加えてみます。

複数指定できるよう、SourceRequest型の変数はListコレクションに変更します。このListに各SourceRequestオブジェクトを追加していきます。

Dim sourceRequests = New List(Of SourceRequest)

SourceType.Newsを指定すると、ニュース記事から検索します。最初の1件のタイトルとURLを取得してみます。

sourceRequests.Add(New SourceRequest With { _
    .Source = SourceType.News, _
    .Count = 1, _
    .ResultFields = ResultFieldMask.Title Or _
                    ResultFieldMask.Url})

Live Search APIでは検索文字列に指定した単語の修正候補を取得することもできます。修正候補があった場合、タイトル項目に格納されて返ってきます。

sourceRequests.Add(New SourceRequest With { _
    .Source = SourceType.Spelling, _
    .Count = 3, _
    .ResultFields = ResultFieldMask.Title})

SearchRequest.Requestsプロパティには、sourceRequestsをToArrayメソッドを使って配列化し指定します。

searchRequest.Requests = sourceRequests.ToArray

検索結果は、SearchResponse.Responsesに複数のSourceResponseオブジェクトが格納されて返ってくることが予測されます。各SourceResponseの内容を出力できるように変更します。

Dim searchResponse = service.Search(searchRequest)

For Each sourceResponse In searchResponse.Responses

    Console.WriteLine("Source: " & sourceResponse.Source.ToString)
    Console.WriteLine("Total: " & sourceResponse.Total)

    For Each result In sourceResponse.Results
        If result.Title IsNot Nothing Then
            Console.WriteLine("Title: " & result.Title)
        End If
        If result.Description IsNot Nothing Then
            Console.WriteLine("Description: " & result.Description)
        End If
        If result.Url IsNot Nothing Then
            Console.WriteLine("URL: " & result.Url)
        End If
        Console.WriteLine(New String("-"c, 50))
    Next
Next

以上のコードをファイルにまとめましたので参照してください。

SampleModule2.vbのダウンロード
SampleModule2.vbファイル

おわりに

いかがでしたでしょうか。検索リクエストに指定できるオプションは、実際のLive Searchと同様にまだたくさんあります。今回紹介したものは代表的なものでした。より詳細に検索結果を制御したい場合はAPIリファレンスを参照してみてください。

次回もLive Search APIを利用してアプリケーションを開発します。

おすすめ記事

記事・ニュース一覧