はてな日記バックアップ

はてな日記に技術系ブログを移動してきて1ヶ月ちかくたつが、特に問題を感じないので(普段書いてるWiki記法と微妙に違うので多少慣れが必要だったのはあるが)技術系はこっちに集約することにする。

はてなの日記をきちんと使うのは初めてなので、データをどういう形式で取り出せるのか調べてみた。以下の形式があるのね。

うーん、Movable Typeは昔はつかってたけど当分使う予定が無いから、XML形式とCSV形式だけあればいいかな。XMLの方は使い勝手がよさそうにみえつつ、中身がいわゆるはてな記法ではいっているので、他で使うならXMLからデータを取り出した後に自力でパース処理していかないとけなさそうなのが厳しいところ。

ともあれ外部サーバーを借りる時はデータロストが怖いので、定期的にバックアップを取っておくことにする。

require "rubygems"
require "mechanize"
require "cgi"
#ログインID
@user_id = "ID"						
#パスワード
@pass = "パスワード"				
#ファイルをダウンロードするローカルフォルダ
@output_path = "./hatena"		
#日記のURL(IDと日記URLが必ず一致かどうか知らないので個別に設定)
url = "http://d.hatena.ne.jp/ココを変更/"	

#Mechanizeオブジェクト作成
web = WWW::Mechanize.new()
web.max_history = 3	#3ページより前のデータは破棄

#ログイン
page = web.get("https://www.hatena.ne.jp/login?backurl=#{CGI::escape(url)}")
form = page.forms[0]
form.fields.find{|f| f.name=="name"}.value 	= @user_id;
form.fields.find{|f| f.name=="password"}.value 	= @pass;
web.submit(form)

#ダウンロード(XMLとCSV形式を対象とする。CSVはShift-JISな点に注意
{"export"=>"xml","source"=>"csv"}.each do |key,value|
  doc = web.get("#{url}#{key}")
  #ファイル出力
  date = Time.now()
  fp = open("#{@output_path}/hatena_%s_%02d_%02d.#{value}" % [date.year,date.month,date.day], "w")
    fp.write(doc.body);
  fp.close()
end

一応ファイルもアップしておこう - 「hatena_backup.rb

これを別サーバーのcronに登録しておいて、週3回ぐらいとればいいかな。日付で切り分けていくので貯まっていくけど、それはそれでいいかな。1世代の管理だと壊れたファイルになったときにこわいからな。半年に1回ぐらい古いファイルを自力で消す運用にしよう。