その1からの続き。
検索するコード
自動生成されたクラスを利用するのに名前空間が長いのでForm1のコードの先頭に以下のようにImportsしておきます。LiveSearchSampleはアプリケーションの名前空間です。
Imports LiveSearchSample.com.msn.search.soap
そして、ボタンを押したとき初音ミクを検索してPictureBoxに表示させるコードは以下のようになります。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
Dim service As New MSNSearchService
Dim sourceRequest As New SourceRequest
Dim searchRequest As New SearchRequest
sourceRequest.Source = SourceType.Image ' 画像を検索
sourceRequest.ResultFields = ResultFieldMask.Image ' 検索結果に画像情報を指定
sourceRequest.Count = 1 ' 1件検索
searchRequest.Query = "初音ミク" ' 検索文字列
searchRequest.AppID = "あなたのAppID" ' Application ID
searchRequest.CultureInfo = "ja-JP" ' 日本語のページから検索(画像検索ではたぶん意味なし)
searchRequest.Requests = New SourceRequest() {sourceRequest}
' 検索
Dim searchResponse As SearchResponse = service.Search(searchRequest)
' 結果表示
PictureBox1.ImageLocation = searchResponse.Responses(0).Results(0).Image.ImageURL
Catch soapEx As System.Web.Services.Protocols.SoapException
MessageBox.Show(soapEx.ToString)
Catch webEx As System.Net.WebException
MessageBox.Show(webEx.ToString)
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub
MSNSearchServiceクラスのSearchメソッドを呼ぶことで検索ができます(18行目)。Searchメソッドの引数はSearchRequestクラスのオブジェクトです。SearchRequestには、SourceRequestクラスオブジェクトが必要になります。さーちリクエストとそーすリクスト、ややこしい……。
SourceRequestには、取得する結果件数・検索するファイルタイプ・取得する結果のオフセット値・取得するフィールド(タイトルやURL、説明など)・検索するソース(Webページや画像など)などの設定を指定します。上記コードでは検索するソースに画像を指定(8行目)、取得するフィールドに画像情報を指定(9行目)、1件のみ検索結果を返すようにしています(10行目)。もしWebページから検索する場合は以下のようになります。
sourceRequest.Source = SourceType.Web
sourceRequest.ResultFields = ResultFieldMask.Title Or ResultFieldMask.Description Or ResultFieldMask.Url
検索件数はデフォルトで10件まで、最高で50件を指定できます(SourceTypeがPhoneBookの場合は25です。PhoneBookは日本でサービスはしていません)。上記のResultFieldsにはタイトル・説明・URLを指定していますが、これがResultFieldsのデフォルト値になります。また、指定しても必ずその情報が返ってくるとは限りませんのでEmptyかどうかのチェックが必要です。
SearchRequestには、Application ID・カルチャ情報・検索文字列・SourceRequest(の配列)を指定します。オプションでフィルタ・地域・その他の細かい検索の設定の指定ができます。
Searchメソッドの戻り値は、SearchResponseクラスのオブジェクトになります。SearchResponseはSourceResponseクラスの配列をResponsesプロパティを持ち、各SourceResponseは、Resultクラスの配列をResultsプロパティに持っています。さーちレスポンスとそーすレスポンス、またややこしい。
21行目ではPictureBox1のImageLocationプロパティに検索結果のURLを指定しています。結果がない場合もあるので本来ならばきちんとチェックしてあげる必要があります。また複数の結果を取得する方が良くあると思いますのでループ処理による検索結果の表示例も以下に書いておきます(expand sourceをクリックしてください)。
' Sample
For Each sourceResponse As SourceResponse In searchResponse.Responses
Console.WriteLine(String.Format("検索結果 合計{0}件", sourceResponse.Total))
For Each result As Result In sourceResponse.Results
If Not String.IsNullOrEmpty(result.Title) Then
Console.WriteLine(result.Title)
End If
If Not String.IsNullOrEmpty(result.Description) Then
Console.WriteLine(result.Description)
End If
If Not String.IsNullOrEmpty(result.Url) Then
Console.WriteLine(result.Url)
End If
Next
Next
結果
さて実行結果は……ミクきたー。これを書いた時点では、http://zeloma.com/tag/%8F%89%89%B9%83~%83Nにある画像みたい。
ちなみに、Image.ImageURLではなくImage.ThumbnailURLを指定するとLive Searchが持っているサムネイル画像が表示されます。サムネイルは最大で160x160ピクセルのようですね。また、検索文字列を「初音ミク imagesize:DIM_H_1024」のように指定すると壁紙サイズ(この場合の高さが1024ピクセル)の画像が検索できます。
More Infomation
Live Search APIの各クラスやプロパティなどについては細かく触れませんでしたのでより詳細な情報はSDKを見てください。英語ですが数も少ないし検索という簡単な対象なのでわかりやすいかと思います。コードサンプルもあります(C#)。また、Live Search Interactive SDKでは、実際に動作しているサンプルが見れ、C#のコードと実際に送信されるSOAPのデータ(XML形式)も確認できます。
今回作成したプログラムで実際に送受信されていたデータは次のようなものでした。
送信時:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<Search xmlns="http://schemas.microsoft.com/MSNSearch/2005/09/fex">
<Request>
<AppID>あなたのAppID</AppID>
<Query></Query>
<CultureInfo>ja-JP</CultureInfo>
<SafeSearch>Moderate</SafeSearch>
<Flags>None</Flags>
<Requests>
<SourceRequest>
<Source>Image</Source>
<Offset>0</Offset>
<Count>1</Count>
<ResultFields>Image</ResultFields>
</SourceRequest>
</Requests>
</Request>
</Search>
</soap:Body>
</soap:Envelope>
受信時:
<?xml version="1.0" encoding="utf-8" ?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<SearchResponse xmlns="http://schemas.microsoft.com/MSNSearch/2005/09/fex">
<Response>
<Responses>
<SourceResponse>
<Source>Image</Source>
<Offset>0</Offset>
<Total>4454</Total>
<Results>
<Result>
<Image>
<ImageURL>http://ktaianime.up.seesaa.net/image/miku13439.jpg</ImageURL>
<ImageWidth>240</ImageWidth>
<ImageHeight>400</ImageHeight>
<ImageFileSize>30688</ImageFileSize>
<ThumbnailURL>http://t2.images.live.com/images/thumbnail.aspx?q=1431982184337&id=b9ff1da72be70581941668e8f4e0849d</ThumbnailURL>
<ThumbnailWidth>96</ThumbnailWidth>
<ThumbnailHeight>160</ThumbnailHeight>
<ThumbnailFileSize>3751</ThumbnailFileSize>
</Image>
</Result>
</Results>
</SourceResponse>
</Responses>
</Response>
</SearchResponse>
</soapenv:Body>
</soapenv:Envelope>