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

Λάδι Βιώσας

http://profile.hatena.ne.jp/kenkitii/

長年日記のRSSを出力するスクリプト

hatena ruby

はてな日記に長年日記の機能がつきましたね。コレ。わたくしは長年日記がつかいたくて一時は 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