読者です 読者をやめる 読者になる 読者になる

指定した URL の人気ブックマーク一覧を取得する

はてなブックマークネタ第2弾。 今度は、指定した 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 = GetPopularBookmarks("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;
        }
    }

    [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>();
    }
}

実行結果はこちら。

f:id:griefworker:20170405164319p:plain