はじめてのBing API
私の調べもの(MS系技術情報)の場合、googleよりもbingの方が良い結果を返すことも多く、最近はもっぱらいbingを使っていたりします。Bing API 2.0のリファレンスを見たら何やら面白いことができそうなので、ちょっと弄ってみました。とは言っても英語->日本語翻訳ですが。(^^;
出来上がりは、こんなの。相変わらずのてきとーUI。記事が長くなるのでXAMLは省略。
Jsonを使った例になっています。一応、検索のコードも入れておきましたが、翻訳とほとんど一緒です。
using System; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Json; namespace BingSearchSample { public partial class MainPage : UserControl { public MainPage() { InitializeComponent(); } // 入手したIDを設定する string apiId = "<ApiID>"; string baseUrl = "http://api.bing.net/json.aspx?AppId="; #region 検索の例 private void Search(string query) { string url = baseUrl + apiId + "&Query=" + query + "&Sources=Web"; WebClient client = new WebClient(); client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(SearchCompleted); client.DownloadStringAsync(new Uri(url)); } void SearchCompleted(object sender, DownloadStringCompletedEventArgs e) { if (e.Error != null) return; var val = JsonValue.Parse(e.Result); var results = val["SearchResponse"]["Web"]["Results"]; foreach (JsonObject result in results) { // 結果の表示は行っていない・・・ var r = new { Title = result["Title"], Description = result["Description"], Url = result["Url"] }; } } private void Search() { Search(source.Text); } #endregion #region 翻訳の例 private void Translate(string query, string from, string to) { string url = baseUrl + apiId + "&Query=" + query + "&Sources=Translation" + "&Translation.SourceLanguage=" + from + "&Translation.TargetLanguage=" + to; WebClient client = new WebClient(); client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(TranslateCompleted); client.DownloadStringAsync(new Uri(url)); } void TranslateCompleted(object sender, DownloadStringCompletedEventArgs e) { target.Text = String.Empty; if (e.Error != null) return; var val = JsonValue.Parse(e.Result); if (!val.ContainsKey("SearchResponse")) return; var searchResult = val["SearchResponse"]; if (!searchResult.ContainsKey("Translation")) return; var results = searchResult["Translation"]["Results"]; var q = from result in results.OfType<JsonObject>() select (string)result["TranslatedTerm"]; target.Text = String.Join(",", q.ToArray()); } private void Translate() { // 英語から日本語へ翻訳 Translate(source.Text, "en", "ja"); } #endregion private void Button_Click(object sender, RoutedEventArgs e) { Translate(); } } }
今回はclientaccesspolicy.xmlがbing apiサイトに用意されていたので、ASP.NETホストは用意していません。