OITA: Oika's Information Technological Activities

@oika 情報技術的活動日誌。

C# kizAPI(きざっぴ)でブログの流行ワードを取得する

いま現在話題のトレンドワードをある程度リアルタイムでとれるAPI的なやつで
なんか手軽なのないかなと探してみたら、
kizasi.jpのサービスで「kizAPI(きざっぴ)」ってのがあった。

利用規約はこちら(PDF)。
ブログエントリーからの統計ってことで、リアルタイム性でいえば
ツイッターとかのが良いのかもしれないけども、まあ手軽そうなので試してみた。

いくつかAPIがあるけども、注目語のランキングとるのは
http://kizasi.jp/kizapi.py?type=rank」をGETするだけで良いようだ。
もちろん直接ブラウザに打ってもXMLが返ってくるけども、
なんかゴミが多いというか、いろいろ邪魔くさいので必要なとこだけ取りたい。

C#からLINQ to XMLでパースするとこんな感じ。

var url = "http://kizasi.jp/kizapi.py?type=rank";  
var req = WebRequest.Create(url);  

using (var res = req.GetResponse())  
using (var stream = res.GetResponseStream())  
{  
    var root = XElement.Load(stream);  

    var items = root.Element("channel")  
                    .Elements("item")  
                    .Select(e => new  
                    {  
                        Word = e.Element("title").Value,  
                        Date = DateTime.Parse(e.Element("pubDate").Value)  
                    });  
    //とりあえず出力  
    foreach (var item in items)  
    {  
        Console.WriteLine(item.Word + " (" + item.Date + ")");  
    }  
}  

ところがこのまま実行するとWebExceptionが返る。

サーバーによってプロトコル違反が発生しました. Section=ResponseHeader Detail=CR の後には LF を指定しなければなりません。

どうやらサーバ側の規約違反っぽいやつ。
なおしてよーって言うわけにもいかないので無視する方法を探す。
調べた感じ、useUnsafeHeaderParsingをアプリ構成ファイル(app.config)に
書くのが一般的みたいだが、ここではコードから設定してしまう。

//※System.Configurationの参照を追加  
var conf = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);  
var section = conf.GetSection("system.net/settings") as SettingsSection;  
section.HttpWebRequest.UseUnsafeHeaderParsing = true;  
conf.Save();  

これで↓のように取れました。

>プロ野球開幕 (2016/03/26 16:47:38)  
>開幕戦勝利 (2016/03/26 16:47:38)  
>日本死ね (2016/03/26 16:47:38)  
>ショーンK (2016/03/26 16:47:38)  
>花冷え (2016/03/26 16:47:38)  
>陽光桜 (2016/03/26 16:47:38)  
>球春到来 (2016/03/26 16:47:38)  
>金本監督 (2016/03/26 16:47:38)  
>都庁前 (2016/03/26 16:47:38)  
>民進党 (2016/03/26 16:47:38)  
>野球賭博 (2016/03/26 16:47:38)  
>トサミズキ (2016/03/26 16:47:38)  
>修了式 (2016/03/26 16:47:38)  
>人材紹介会社 (2016/03/26 16:47:38)  
>開幕投手 (2016/03/26 16:47:38)  
>青函連絡船 (2016/03/26 16:47:38)  
>キャッシング会社 (2016/03/26 16:47:38)  
>第63回 (2016/03/26 16:47:38)  
>人工知能 (2016/03/26 16:47:38)  
>ショウジョウバカマ (2016/03/26 16:47:38)  
>エイジング (2016/03/26 16:47:38)  
>開花状況 (2016/03/26 16:47:38)  
>復活祭 (2016/03/26 16:47:38)  
>ジャスティス (2016/03/26 16:47:38)  

titleとpubDate以外にkizasi.jpのページへのリンクとか
関連語とかも取れるけど、まあ使わなそうかな。
pubDateってのもこれランキング自体の更新時刻なので、
全項目で取る意味はあんまないかも。

このrankAPIの関連語はちょっとフォーマットが親切でないので、
ほしいときには「関連語検索」ってほうのAPIを使うのが良いかと思います。