トリコロールな猫/セキュリティ

思いついたことをぼちぼち書いてます。

はてなブックマークフィードを利用して月ごとのはてブをまとめる

今年毎月まとめているセキュリティに関する記事。「文書公開」「インシデント・脆弱性」「読み物」の3つのカテゴリに分けてまとめています。

security.nekotricolor.com

最初は地道に手でコピペしてましたがさすがに面倒なのと、せっかくはてなに越してきたのではてブを使いたい。ということで、「気になる記事ははてブしておき、月ごとにまとめる」ということにしてみました。

で、はてブはいろんなAPIを公開しているので、最初ははてブの各エントリの情報を取得して加工しようかと思っていました。

はてなブックマークエントリー情報取得API - Hatena Developer Center

が、フィードを取ってくれば、RubyでXML処理するだけでいけそう。

はてなブックマークフィード仕様 - Hatena Developer Center

タグの情報が入る要素があるので、しかるべきタグをつけておけば、各カテゴリについて簡単にまとめられそうです。

ブックマークのルール

記事に必要な情報は、

  • 記事作成日時
  • 記事タイトル
  • 情報源
  • 記事の引用・コメント

の4つ。

記事タイトルと情報源は、はてな記法の[記事のURL:title]の形で表示されるものをそのまま使います。

ということで、以下のようなルールでブクマするようにします。

文書公開 [YYYYMM][YYYYMMDD][securitydocument] 引用orコメント
インシデント・脆弱性 [YYYYMM][YYYYMMDD][securityincident] (引用orコメント)
読み物 [YYYYMM][YYYYMMDD][securitynews] 引用orコメント

2016年5月はこのルールでブクマしてみました。

201605に関するnekotricolorのはてなブックマーク

はてなブックマークフィードの仕様

ルールに沿ってつけたブックマークのフィードを取得し、Rubyを使って月次でまとめていきます。

フィードの使用については前述のここで説明されています。

はてなブックマークフィード仕様 - Hatena Developer Center

たとえば

http://b.hatena.ne.jp/nekotricolor/atomfeed?tag=201605&tag=securitynews

というURLから、以下のようなXMLファイルをGETできます。

<feed xmlns="http://purl.org/atom/ns#" xmlns:opensearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xml:lang="ja">
<title>201605とsecuritynewsに関するnekotricolorのはてなブックマーク (12)</title>
<link type="text/html" rel="alternate" href="http://b.hatena.ne.jp/nekotricolor/201605/securitynews/"/>
<link type="application/x.atom+xml" rel="service.post" href="http://b.hatena.ne.jp/atom/post" title="201605とsecuritynewsに関するnekotricolorのはてなブックマーク (12)"/>
<entry>
<id>
tag:hatena.ne.jp,2005:bookmark-nekotricolor-287084623
</id>
<title>
【セキュリティ ニュース】TFTPのリフレクション攻撃に注意 - 約60倍の増幅率(1ページ目 / 全1ページ):Security NEXT
</title>
<link type="text/html" rel="related" href="http://www.security-next.com/069607"/>
<link type="text/html" rel="alternate" href="http://b.hatena.ne.jp/nekotricolor/20160510#bookmark-287084623"/>
<link type="application/x.atom+xml" rel="service.edit" title="【セキュリティ ニュース】TFTPのリフレクション攻撃に注意 - 約60倍の増幅率(1ページ目 / 全1ページ):Security NEXT" href="http://b.hatena.ne.jp/atom/edit/287084623"/>
<summary>
“IPアドレスを詐称してTFTPサーバへファイルの要求を行うもので、要求を受けたサーバは、詐称されたIPアドレスに対し、ファイルの送信を繰り返し試みる”
</summary>
<content type="html">...</content>
<issued>2016-05-10T12:01:55+09:00</issued>
<author>
<name>nekotricolor</name>
</author>
<dc:subject>201605</dc:subject>
<dc:subject>20160509</dc:subject>
<dc:subject>securitynews</dc:subject>
</entry>
(略)
</feed>

ブログに必要な情報は以下のタグに入っています。

記事作成日時 feed/entry/dc:subject
記事のURL feed/entry/linkのrel="related"
引用・コメント feed/entry/summary

この3つの情報は、たとえば2016年5月分のsecuritynewsタグをつけたブックマークのフィードを「201605-securitynews.xml」として保存した場合、以下ようなRubyで取ってくることができます。
# 日付はYYYYMMDDをYYYY/MM/DDに変換してます。

require 'rexml/document'
doc = REXML::Document.new("201605-securitynews.xml")
date = url = summary = ""

doc.elements.each('feed/entry') {|entry|
 entry.elements.each('dc:subject'){|element|
   if element.text =~ /\d\d\d\d\d\d\d\d/
    date = element.text.scan(/(\d\d\d\d)(\d\d)(\d\d)/).join("/")
   end
 }
 url = entry.elements['link[@rel="related"]'].attributes['href']
 summary = entry.elements['summary'].text
}

これをうまいことはてな記法に入れ込めば記事完成。「文書公開」に関しては情報源も重要なので、手動で確認して書いてます。まあ数が少ないから気にならない。

なお、このフィードには1ページ20件しか出力されないので、ofパラメータを使って全件取ってくる必要があります。たとえば、2ページ目と3ページ目のURLは以下のようになります。

http://b.hatena.ne.jp/nekotricolor/atomfeed?tag=201605&tag=securitynews&of=20
http://b.hatena.ne.jp/nekotricolor/atomfeed?tag=201605&tag=securitynews&of=40

ブクマ数の表示

読み物については、ブクマ数も表示するようにしました。こんなことできるんですね。

自分のブログに「○○users」を表示する - はてなブックマークヘルプ

http://b.hatena.ne.jp/entry/image/エントリーのURL
という URL を指定すると、そのエントリーのブックマーク数を画像で取得することが可能です。

以上の手順でまとめたのが2016年5月の記事です。

security.nekotricolor.com

うん、この方が断然後から見直しやすい。

今後の課題

記事作成日時については、記事の中から作成日時が書かれている場所を探して手動でタグをつける、というようなことをやっていて、これはなんとか自動化したいところなんですがダメですね。フィードとかはてなの仕様とかではなく、そもそも記事の作成日時は、その記事の中を見ないとわからないんですよね。

みなさん苦戦しているようです。

upa-pc.blogspot.jp


英語の記事でもあった。

www.makeuseof.com


Google検索は結果にその記事がいつ書かれたか表示されるので、上記記事にはそれを利用する方法も書かれています(検索時に「&as_qdr=y15」をつけると確実に表示されるそうで)。ただこれはあくまでGoogleがその記事の存在を認識したときなので、正確ではない可能性も。

This date isn’t guaranteed to be the publication date. It’s usually the date that Google last noticed an update to that page.

Wayback Machineだと正確な日時が分かりそうですがそこまでするのもなあ。

Internet Archive’s Wayback Machine lets you know how many times the archive has saved a specific page, and between which dates. Often, you can even look at what that page looked like at specific points in time. This means you can prove that the quote or data you’re referencing was actually there on that date.

RSSからは当然作成日時が取れるのでなんとかなりそうなもんですが、今のところスマートに取得する方法は思いつきません。Readabilityに保存すると掲載日も保存されて「おっ」と思いましたが保存されない記事もあったりして。

最初に記事が公開された時刻というのは割と重要だと思うんですけど、表示方法が統一されてないですよね。HTML5では「pubdate」というのが公開日時を表す属性になる予定だったのが廃止になったそうで、代わりにSchema.orgの「dataPublished」を使えということになっています。

あなたが見逃してるかもしれないHTML5で廃止された5つの要素・属性 - Coding Design's Tumblr

pubdateを使うかわりにブログポスト用のスキーマを使うのがよいということになってるようです。

ちなみにはてなブログでは「pubdate」を使ってますね。以下ソース。

<a href="http://security.nekotricolor.com/entries/2015/04/16" rel="nofollow">
       <time pubdate datetime="2015-04-16T10:04:30Z" title="2015-04-16T10:04:30Z">
            <span class="date-year">2015</span>
            <span class="hyphen">-</span>
            <span class="date-month">04</span>
            <span class="hyphen">-</span>
            <span class="date-day">16</span>
       </time>
 </a>

作成日時に限らず、このHTMLの書き方の自由さというのには
セキュリティ新着情報をつぶやくボットの方でも苦労させられていて、少なくとも政府系では新着情報の書き方とか、せめて日時のフォーマットくらいは統一しろやと思うんですけど、HTML5が普及すればこの辺もラクになるのかしら(ならないんだろうなあ。

感想

4月まではタイトルが気になったものをとりあえず残している感じでしたが、それだとあんまり意味がないのでサラッとでも読んで要約になりそうな部分を引用するようにしたらだいぶいい感じになってきました。自分がなんの分野に興味があるのかも分かるし(最近はランサムウェア"業界"の変容ぶりが気になる)。その代わりAppleとFBIの攻防とか、興味のない分野は根こそぎ無視するのでそれはそれでいいのかなーと思いつつ。まあこういうのは後から意味が出てくるもので継続が大事なので、変に義務を課すようなことはせず、ストレスにならない方法を今後も模索していくつもりです。

セキュリティに限らず自分のはてぶをこういう風にまとめて置いておくっていうのは他にも使えそうな方法だな。ほんとRubyが書けるようになってよかった。