はじめての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ホストは用意していません。