長年日記のRSSを出力するスクリプト
はてな日記に長年日記の機能がつきましたね。コレ。わたくしは長年日記がつかいたくて一時は tdiary に乗り換えようかと思ったほどです。ちなみに長年日記ってのは、紙の日記帳でよくある、連用日記のような見た目にする機能のことね。
しかし、、、URLを直に指定しないと使えないというのはかなり微妙な感じ。そこで、長年日記のHTMLを適当にパースしてRSSに出力するスクリプトを書いてみました。
hatena id を入力して、get!ボタンを押すと、今日の日付の長年日記のRSSを取得します。ココ↓から試せます。
http://rocky.sakura.ne.jp/hatena/naganen.html
はてなのデザイン設定にこんな感じ↓で書くと、ここのサイトの右サイドバーのように、長年日記のタイトルが表示されます。
<hatena name="rss" url="http://rocky.sakura.ne.jp/hatena/naganen.cgi?id=(あなたのid)" moduletitle="長年日記" template="hatena-module">
自分は毎日日記かいてないので、長年日記のありがたみが薄いんですが、、、。まぁ、そんな感じで、上のアドレスは自分の気まぐれで止まる可能性大なので、とりあえずスクリプトの中身を晒しておきます。
#!/usr/bin/env ruby # -*- coding: utf-8 -*- require 'open-uri' require 'date' require 'rss/maker' require 'cgi' require 'kconv' id = CGI.new['id'] uri = "http://d.hatena.ne.jp/#{id}/#{Date.today.strftime("____%m%d")}" begin dat = open(uri).read rescue => OpenURI::HTTPError puts "Content-type: text/html\n\n" puts "指定した id が見つかりません。id を確認してください。" exit end dat.gsub!(/\n|\r/,"") title = dat.scan(/<title>(.+?)<\/title>/) dat = dat.scan(/<!--(<rdf:RDF.+?rdf:RDF>)-->/)[1].to_s items_title = dat.scan(/dc:title="(.+?)"/) items_link = dat.scan(/dc:identifier="(.+?)"/) items_date = items_link.map do |item| item.to_s.scan(/\/#{id}\/([0-9]{4})([0-9]{2})([0-9]{2})\//).join("/") + " 00:00:00" end rss = RSS::Maker.make("2.0") do |maker| maker.channel.title = title.to_s.toutf8 maker.channel.link = "http://d.hatena.ne.jp/#{id}/" maker.channel.description = "hatena diary for years" maker.items.do_sort = true items_title.zip(items_link, items_date).each do |t,l,d| item = maker.items.new_item item.title = t.to_s.toutf8 item.link = l.to_s item.dc_subject = t.to_s.toutf8 item.date = Time.parse(d) end end puts "Content-type: application/xml\n\n" puts rss.to_s