はてなブックマークネタ第3弾。 最後は、指定した URL に付けられたすべてのブックマークを取得してみた。
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Net.Http; using System.Net.Http.Headers; using System.Threading.Tasks; namespace HatenaBookmarkSample { class Program { static void Main(string[] args) { var bookmarks = GetAllBookmarks("http://hatenablog.com") .GetAwaiter().GetResult(); foreach(var bookmark in bookmarks.Bookmarks) { Console.WriteLine($"{bookmark.User} : {bookmark.Comment}"); } Console.WriteLine("Enter で終了します。"); Console.ReadLine(); } static async Task<EntryBookmarks> GetPopularBookmarks(string url) { var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders .Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); // User-Agent を設定しないと nginx にはじかれる httpClient.DefaultRequestHeaders .UserAgent.Add(new ProductInfoHeaderValue("HatenaClient", "0.0.1")); var requestUri = $"http://b.hatena.ne.jp/api/viewer.popular_bookmarks?url={url}"; var json = await httpClient.GetStringAsync(requestUri); var bookmarks = JsonConvert.DeserializeObject<EntryBookmarks>(json); return bookmarks; } static async Task<EntryBookmarks> GetAllBookmarks(string url) { var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders .Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); // User-Agent を設定しないと nginx にはじかれる httpClient.DefaultRequestHeaders .UserAgent.Add(new ProductInfoHeaderValue("HatenaClient", "0.0.1")); var requestUri = $"http://b.hatena.ne.jp/entry/jsonlite/?url={url}"; var json = await httpClient.GetStringAsync(requestUri); var bookmarks = JsonConvert.DeserializeObject<EntryBookmarks>(json); return bookmarks; } } [JsonObject] public class EntryBookmark { /// <summary> /// ブックマーク ID を取得または設定します。 /// </summary> [JsonProperty("eid")] public string Id { get; set; } /// <summary> /// タイトルを取得または設定します。 /// </summary> [JsonProperty("title")] public string Title { get; set; } /// <summary> /// 記事の URL を取得または設定します。 /// </summary> [JsonProperty("url")] public string Url { get; set; } /// <summary> /// ブックマークしたユーザーを取得または設定します。 /// </summary> [JsonProperty("user")] public string User { get; set; } /// <summary> /// ブックマークコメントを取得または設定します。 /// </summary> [JsonProperty("comment")] public string Comment { get; set; } /// <summary> /// ブックマークした時間を取得または設定します。 /// </summary> [JsonProperty("timestamp")] public string Timestamp { get; set; } } [JsonObject] public class EntryBookmarks { /// <summary> /// ブックマーク件数を取得または設定します。 /// </summary> [JsonProperty("count")] public int Count { get; set; } /// <summary> /// エントリの ID を取得または設定します。 /// </summary> [JsonProperty("eid")] public string EntryId { get; set; } /// <summary> /// エントリのタイトルを取得または設定します。 /// </summary> [JsonProperty("title")] public string Title { get; set; } /// <summary> /// エントリの URL を取得または設定します。 /// </summary> [JsonProperty("entry_url")] public string EntryUrl { get; set; } /// <summary> /// ブックマークの URL を取得または設定します。 /// </summary> [JsonProperty("url")] public string Url { get; set; } /// <summary> /// ブックマーク一覧を取得または設定します。 /// </summary> [JsonProperty("bookmarks")] public List<EntryBookmark> Bookmarks { get; set; } = new List<EntryBookmark>(); } }
実行結果はこちら。
はてなブックマークが提供する API は、REST API や Atom API や件数取得 API などなど、 たくさんあって分かりにくい。 REST API に一本化して、機能を充実してほしいところだ。