HatenaBookmarkSharp - はてなブックマーク REST API C# クライアント

はじめに

HatenaBookmarkSharp っていう、はてなブックマーク REST APIC# クライアントを書いた。

developer.hatena.ne.jp

www.nuget.org

github.com

モチベーション

自分が現在作っているアプリではてなブックマーク REST API を呼び出したい場面があり、今のところ C# のクライアントが NuGet に存在しなかったので、ライブラリとして作って NuGet に放流した。

使い方

OAuth トークンを取得するための HatenaAuthorizer と、はてなブックマーク REST API を呼び出すための HatenaBookmarkClient を提供している。

var authorizer = new HatenaAuthorizer(
    consumerKey: consumerKey,
    consumerSecret: consumerSecret);

var requestToken = await authorizer.GetRequestTokenAsync(
    scope: Scopes.All);

var authenticationUri = authorizer.GenerateAuthenticationUri(
    requestToken.OAuthToken);
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
    var escapedUrl = authenticationUri.ToString().Replace("&", "^&");
    Process.Start(new ProcessStartInfo("cmd", $"/c start {escapedUrl}")
    {
        CreateNoWindow = true,
    });
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
    Process.Start("xdg-open", authenticationUri.ToString());
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{
    Process.Start("open", authenticationUri.ToString());
}

Console.Write("verifier:");
var verifier = Console.ReadLine();

var accessToken = await authorizer.GetAccessTokenAsync(
    oauthToken: requestToken.OAuthToken,
    oauthTokenSecret: requestToken.OAuthTokenSecret,
    verifier: verifier);

var client = new HatenaBookmarkClient(
    consumerKey: consumerKey,
    consumerSecret: consumerSecret,
    oauthToken: accessToken.OAuthToken,
    oauthTokenSecret: accessToken.OAuthTokenSecret);

var user = await client.GetMyAsync();

var tags = await client.GetMyTagsAsync();

var url = new Uri("https://tnakamura.hatenablog.com");
var createdBookmark = await client.CreateBookmarkAsync(
    new NewBookmark(url)
    {
        Comment = "[blog]Test",
    });

var bookmark = await client.GetBookmarkAsync(url);

var entry = await client.GetEntryAsync(url);

await client.DeleteBookmarkAsync(url);

実装

シンプルな HttpClient ラッパー。レスポンスの JSON をパースするのに、Newtonsoft.Json ではなく System.Text.Json 使ってみた。

はてなブックマーク REST API の認可が OAuth 2.0 ではなく OAuth 1.0 という部分はイケてない。あまり力を入れていないんだろうか。IdentityModel とか使うの厳しそうだったので、OAuth 1.0 クライアントは自前で抱えることに。neuecc 氏の AsyncOAuth をだいぶ参考にさせてもらった。

おわりに

今のところ、はてなブックマーク REST API のドキュメントにあるものには対応している。はてなブックマーク REST API 自体にほとんど変化がないので、当面はライブラリにバグが見つかったら修正するくらいの、ゆる〜い方針で開発する。

自分が使うために作ったとはいえ、はてなブックマークREST API を呼び出す需要はほとんど無さそうな気がしないでもない。