なか日記

一度きりの人生、楽しく生きよう。

SgmlReaderを使ってはてなカウンターからPVを取得する

以前、以下のエントリで書きましたが、前日のPVをツイートするBotを動かしています。

PVが少ないのは置いといて、GoogleAnalyticsからPVの情報を取得していましたが、今のやり方だと基本インスタンス以上にする必要があり、お財布的にちょっと厳しい。違う方法(OAuthを使う)だと共有インスタンスなどでもいけるんじゃないかという噂を耳にしたのですが、力不足でよくわかりません。。

なので、安直にカウンターからPVを取ってくるようにしました。

方針

日付別ページの「トータルアクセス数」を取ってくるようにします。

f:id:nakaji999:20140825014411p:plain

SgmlReaderのインストール

Htmlを解析するのにSgmlReaderを使用します。

詳細は下記公式GitHubや[twitter:@neuecc]さんのブログを見てもらったらいいと思います。

インストールはパッケージマネージャコンソールで下記コマンドを実行します。

Istall-Package SgmlReader

サンプルコード

はてなにログインして、はてなカウンターのページを取得しています。

WebClinetではCookieが使用できない*1ので、[twitter:@neuecc]さんが下記エントリで書かれていたCustomWebClientをそのまま使わせてもらってます。

string html;
using (var wc = new CustomWebClient() { Encoding = Encoding.UTF8 }) { 
    wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded");

    wc.UploadString("https://www.hatena.ne.jp/login", "POST", "name=[はてなのID]&password=[パスワード]");

    html = wc.DownloadString("http://counter.hatena.ne.jp/[はてなのID]/report?cid=101&date=2014-08-24&mode=access");
}

XDocument xml;
using (var sgml = new SgmlReader() {IgnoreDtd = true })
{
    sgml.InputStream = new StringReader(html);
    xml = XDocument.Load(sgml);
}
var ns = xml.Root.Name.Namespace;
var count= xml.Descendants(ns + "table")
    .Where(x => x.FirstAttribute.Value == "totalcount")
    .Descendants(ns + "strong")
    .First().Value;
Console.WriteLine("2014-08-24のPVは {0} でした", count);

これで無料(共有)インスタンスに変更することができました(ホッ

*1:認証状態の保存に必要