Bing Search APIを使用して画像検索するには

Bing Search APIのプライマリーアカウントキーの取得

Bing Search APIを使用するには$0.00のサブスクリプションを購入し(無料です)、プライマリーアカウントキーを取得する必要があります。

プライマリーアカウントキーの取得方法は
Bing Search APIでWeb検索の記事
を参照してください。

画像検索を行う

Web検索と同様に、検索ワードをQueryとして、market情報や出力フォーマットを指定します。
今回はJsonフォーマットで行います。

また、画像検索ではImageFiltersクエリでイメージフィルターをかけることができます。
おそらく「+」文字列区切りで区切ればいくつもフィルターを指定できるはずだったのですが何度やってもエラーなのでひとつまでしかフィルターをかけることができませんでした。

イメージフィルターの一覧は
こちら
にあります。

string searchWord = "コーヒー";//検索ワード
string market = "ja-JP";//検索をかける言語コード
string adult = "Off";   //エロコンテンツフィルタをかけるかどうかOff,Moderate,Strictの3種類
int top = 50; //トップ何個の検索結果を返すか(デフォルト50)
string format = "json"; //atom(xml)かjsonか

//イメージフィルター
string imageFilter = "Size:Small";

続いて検索ワードを文字列エンコードします。

//文字列エンコード
searchWord = Uri.EscapeDataString(searchWord);

次に取得したプライマリーアカウントキーをNetworkCredentialクラスのユーザー名とパスワードの両方に(同じ値を)設定し、
HttpClientを作成してGetリクエストを送ります。

HttpClientHandler handler = new HttpClientHandler();
//認証情報を追加
handler.Credentials = new NetworkCredential("{Your Account Key}", "{Your Accout Key}");

HttpClient client = new HttpClient(handler);
//Getリクエスト
var resultStr=await client.GetStringAsync("https://api.datamarket.azure.com/Bing/Search/Image"
    + "?Query=" + "'" + searchWord + "'" + "&Market=" + "'" + market + "'" + "&Adult=" + "'" + adult + "'" + "&$top=" + top + "&$format=" + format + "&ImageFilters='"+imageFilter+"'");

ダウンロードした文字列を文字列デコードします。

//文字列デコード
resultStr = Uri.UnescapeDataString(resultStr);

ここまでで画像検索結果をJsonで取得できました。

Json.Netで変換する

続いてJsonのデシリアライズ(Json→C#のクラスに変換)を行います。
Jsonデシリアライズを行うにあたって、Json.Netというライブラリを使用するので
Nugetで「Json.Net」と検索してインストールします・

次にこのような画像検索のJsonフォーマットと対応したクラスを作ります。

public class Metadata
{
    public string uri { get; set; }
    public string type { get; set; }
}

public class TumbnailMetadata
{
    public string type { get; set; }
}

public class Thumbnail
{
    public TumbnailMetadata __metadata { get; set; }
    public string MediaUrl { get; set; }
    public string ContentType { get; set; }
    public string Width { get; set; }
    public string Height { get; set; }
    public string FileSize { get; set; }
}

public class Result
{
    public Metadata __metadata { get; set; }
    public string ID { get; set; }
    public string Title { get; set; }
    public string MediaUrl { get; set; }
    public string SourceUrl { get; set; }
    public string DisplayUrl { get; set; }
    public string Width { get; set; }
    public string Height { get; set; }
    public string FileSize { get; set; }
    public string ContentType { get; set; }
    public Thumbnail Thumbnail { get; set; }
}

public class D
{
    public List<Result> results { get; set; }
    public string __next { get; set; }
}

public class ImageSearchObject
{
    public D d { get; set; }
}

クラスを作成できたらデシリアライズを行います。

//Jsonシリアライズ
var contens= JsonConvert.DeserializeObject<ImageSearchObject>(resultStr);

これで画像検索結果をC#のクラスで扱うことができるようになりました。

これをListViewで表示してみましょう。

このような
ListViewを用意します。

<ListView x:Name="listView" HorizontalAlignment="Left" Height="487" Margin="661,143,0,0" VerticalAlignment="Top" Width="458">
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Vertical">
                <HyperlinkButton Content="{Binding Title}" NavigateUri="{Binding MediaUrl}" FontSize="28" />
                <Image Source="{Binding MediaUrl}"/>
                
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

ListViewを作成できたらItemsSourceにJsonデシリアライズしたリストを入れます。

//ListViewのItemsSourceとする
listView.ItemsSource = contens.d.results;

14

全体的なコードはこのようになります。

string searchWord = "コーヒー";//検索ワード
string market = "ja-JP";//検索をかける言語コード
string adult = "Off";   //エロコンテンツフィルタをかけるかどうかOff,Moderate,Strictの3種類
int top = 50; //トップ何個の検索結果を返すか(デフォルト50)
string format = "json"; //atom(xml)かjsonか

//イメージフィルター
string imageFilter = "Size:Small";

//文字列エンコード
searchWord = Uri.EscapeDataString(searchWord);

HttpClientHandler handler = new HttpClientHandler();
//認証情報を追加
handler.Credentials = new NetworkCredential("{Your Access Key}", "Your Access Key");

HttpClient client = new HttpClient(handler);
//Getリクエスト
var resultStr=await client.GetStringAsync("https://api.datamarket.azure.com/Bing/Search/Image"
    + "?Query=" + "'" + searchWord + "'" + "&Market=" + "'" + market + "'" + "&Adult=" + "'" + adult + "'" + "&$top=" + top + "&$format=" + format + "&ImageFilters='"+imageFilter+"'");

//文字列デコード
resultStr = Uri.UnescapeDataString(resultStr);

//Jsonシリアライズ
var contens= JsonConvert.DeserializeObject<ImageSearchObject>(resultStr);

//ListViewのItemsSourceとする
listView.ItemsSource = contens.d.results;

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.