なか日記

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

C#ではてなブログAtomPubを使って記事の一覧を取得する

はてなブログの記事一覧を取得したくなったので、ちょっと調べてみました。

はてなが提供している Atom Publishing Protocol を使うと簡単に取ってこれそうです。

Atom Publishing Protocol とは

Atom Publishing Protocol(以下 AtomPub) はウェブリソースを公開、編集するためのアプリケーション・プロトコル仕様です。はてなブログのAtomPubと通じて、開発者ははてなブログのエントリを参照、投稿、編集、削除するようなオリジナルのアプリケーションを作成できます。

はてなブログAtomPub - Hatena Developer Center

認証が必要

はてなブログAtomPubを利用するには認証が必要です。

OAuth認証、WSSE認証、Basic認証のいずれかが利用できますが、今回はWSSE認証、Basic認証を使ってみます。

必要なもの

ルートエンドポイントとAPIキー

ブログの「設定」-「詳細設定」画面にルートエンドポイントとAPIキーが載ってますのでそれを控えておいて下さい。

f:id:nakaji999:20150903122056p:plain

記事を取得する(Basic認証)

まずはお手軽なBasic認証から。CredentialsにはてなのID(ユーザ)とAPIキー(パスワード)を指定してす。

取得したレスポンスの内容は「はてなブログAtomPub - Hatena Developer Center」を見て下さい。

var hatenaId = "[はてなのID]";
var apiKey = "[APIキー]";
var endpoint = "[ルートエンドポイント]/entry";

using (var cl = new WebClient())
{
    cl.Credentials = new NetworkCredential(hatenaId, apiKey);
    cl.Encoding = Encoding.UTF8;
    var xml = cl.DownloadString(endpoint);
    return AtomPaser.Parse(xml);
}

記事を取得する(WSSE認証)

WSSE認証はこんな感じ。

var hatenaId = "[はてなのID]";
var apiKey = "[APIキー]";
var endpoint = "[ルートエンドポイント]/entry";

var enc = Encoding.GetEncoding("UTF-8");
var nonce = SHA1.Create().ComputeHash(enc.GetBytes(DateTime.Now.ToString()));
var now = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ");

var list = new List<byte>();
list.AddRange(nonce);
list.AddRange(enc.GetBytes(now));
list.AddRange(enc.GetBytes(apiKey));

var digest = SHA1.Create().ComputeHash(list.ToArray());
var value =
    string.Format(
        "UsernameToken Username=\"{0}\", PasswordDigest=\"{1}\", Nonce=\"{2}\", Created=\"{3}\""
        , hatenaId
        , Convert.ToBase64String(digest)
        , Convert.ToBase64String(nonce)
        , now
        );

using (var cl = new WebClient())
{
    cl.Headers.Add("X-WSSE", value);
    cl.Encoding = Encoding.UTF8;
    var xml = cl.DownloadString(endpoint);
    Console.WriteLine(xml);
}