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 値がクライアント (:) から検出されました。