だるろぐ

明日できることは、今日しない。

WebMatrix 3: フィードの購読者数を取得する(1:サーバーサイド編)

f:id:daruyanagi:20130420221551p:plain

こんな感じのソーシャル共有+ RSS 購読ボタンをサイトに追加したいな、と思って、今朝少し WebMatrix と格闘していた。

SNS における共有数の取得部分は JavaScript だけで完結するのだけれど、RSS 購読数の取得部分は JavaScript だけでは少ししんどいのかなぁ。Same origin policy というものに引っかかってしまう。まぁ、こういうときは WebMatrix でサーバー側に RSS 購読数を取得するようにすればいいよね。


~/FeedCount/https://blog.daruyanagi.jp/https://blog.daruyanagi.jp/ の RSS 購読数を取得する FeedCount.cshtml を書いてみた。とりあえず今回は一番簡単な Livedoor Reader だけ。

@using System.Text
@using System.Text.RegularExpressions

@functions 
{
    public int GetSubscriptionCountOfLiveDoorReader(string url)
    {
        try
        {
            using (var client = new WebClient() {
                Encoding = Encoding.UTF8 } )
            {
                var text = client.DownloadString(
                    @"http://reader.livedoor.com/about/" + url);
                var m = new Regex(
                    @"""subscriber_count""\> \((\d+) users\)")
                .Matches(text);

                return m.Count == 0 ? 0 : m[0].Groups[1].Value.AsInt();
            }
        }
        catch
        {
            return 0;
        }
    }
}

Livedoor Reader の購読者数は、http://reader.livedoor.com/about/(URL)へアクセスすると取得できるらしい。

f:id:daruyanagi:20130420223407p:plain

あとは正規表現で当該部分を取得すればいい。AsInt() は ASP.NET Web Pages の便利関数。知っておくと便利だよ。

@{
    var url = string.Join("//", 
        UrlData.Where(_ => !string.IsNullOrEmpty(_)));

    var livedoor = GetSubscriptionCountOfLiveDoorReader(url);

    var data = new {
        livedoor = livedoor,
        total = livedoor,
    };

    Response.Clear();
    Response.ContentType = "application/json";
    Response.Write(Json.Encode(data));
    Response.End();
}

今回は JSON で値を返すことにしました。JsonHelper を使うとカンタン。

結果はこんな感じ。

f:id:daruyanagi:20130420224202p:plain

({"livedoor":6,"total":6})

次回はこれを JavaScript から呼んで、Web ページの表示しましょう。

注記

なお、UrlDate で https://blog.daruyanagi.jp/ を取得しようとすると、

f:id:daruyanagi:20130420223145p:plain

このようなエラー*1が発生したり、そのほかにもいろいろあるのだけれど、それについてはまた稿を改めたい。

*1:危険な可能性のある Request.Path 値がクライアント (:) から検出されました。