Bing Search APIを使ってニュース検索を行う

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

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

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

ニュース検索を行う

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

ニュースカテゴリを指定することができます。
カテゴリ一覧はこちら

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

//ニュースカテゴリ
//rt_Business,rt_Entertainment,rt_Helth,rtPolitics,rt_Sports,rt_US,rt_World,rt_ScienceAndTechnology
//などがある
string newsCategory = "rt_Business";

次に検索ワードのエンコードを行います。

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

そして、取得したプライマリーアクセスキーをNetworkCredenctialsのusernameとpasswordの両方に同じ値を設定し、Getリクエストを送ります。

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/News"
    + "?Query=" + "'" + searchWord + "'" + "&Market=" + "'" + market + "'" + "&Adult=" + "'" + adult + "'" + "&$top=" + top + "&$format=" + format + "&NewsCategory='"+newsCategory+"'");

Getリクエストで帰ってきたJson文字列を文字列デコードします。

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

これでニュースの検索結果をJsonで取得することができました。

Json.Netで変換する

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

そして、以下のJsonと対応するクラスを作成します。

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

public class Result
{
    public Metadata __metadata { get; set; }
    public string ID { get; set; }
    public string Title { get; set; }
    public string Url { get; set; }
    public string Source { get; set; }
    public string Description { get; set; }
    public string Date { get; set; }
}

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

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

最後にJsonデシリアライズで変換完了です。

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

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" />
                
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

ListViewが作成できたらItemsSourceに変換したリストを入れます。

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

16

コード全体はこんな感じ

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

//ニュースカテゴリ
//rt_Business,rt_Entertainment,rt_Helth,rtPolitics,rt_Sports,rt_US,rt_World,rt_ScienceAndTechnology
//などがある
string newsCategory = "rt_Business";
//文字列エンコード
searchWord = Uri.EscapeDataString(searchWord);

HttpClientHandler handler = new HttpClientHandler();
//認証情報を追加
handler.Credentials = new NetworkCredential("kEO5MTTzRJwAjTfMUtfBUd0gO5E1oh0GpF8Re2IRjuk=", "kEO5MTTzRJwAjTfMUtfBUd0gO5E1oh0GpF8Re2IRjuk=");

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

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

//Jsonシリアライズ
var contens= JsonConvert.DeserializeObject<NewsSearchObject>(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.