@kyanny's blog

My thoughts, my life. Views/opinions are my own.

和風Wizardry純情派 / Wの跡地 私的バックアップ

blog.kyanny.me

これと同じように wget でサイト丸ごとダウンロードして Heroku にアップロードしてミラーサイトを作った。プライベートリポジトリにもろもろ保存した。ミラーサイトの URL は別にある。

https://github.com/kyanny/WizDiary

和風 Wiz はあの黒白デザインが雰囲気があって良いし、人名などカテゴリで読むのがすごくしっくりくる作りなので、どうにかそれを維持したかった。その挙動ははてなダイアリーの動的な性質によるものだったので、静的ファイルを配信する以外の工夫が必要だった。後述する。

「指輪世界 / 5人タクティクスオウガ 私的バックアップ」を作ったときと比べての差分は、

1. wget のオプションを追加する

CSS が d.st-hatena.com ドメインで配信されていたので、そこもクロール対象に追加した。 --span-hosts のみでドメインを絞り込まないと、広告タグ経由とかなのか、大量の外部サイト(アメブロとか)までクロールしはじめて収拾がつかなかった。

$ wget \
  --recursive \
  --no-clobber \
  --page-requisites \
  --html-extension \
  --convert-links \
  --no-parent \
  --domains=d.hatena.ne.jp,d.st-hatena.com \
  --span-hosts \
  http://d.hatena.ne.jp/WizDiary/
2. 書き換えられていないリンクを修正する

wget の挙動がおかしいせいで EUC-JP の html 内に UTF-8 文字列が含まれてしまい、 ruby や sed では invalid encoding エラーで処理できない。 nokogiri も使えない。仕方ないのでエンコーディングに寛容な(鈍い) perl を使う。

d.hatena.ne.jp/WizDiary/*.html

$ find d.hatena.ne.jp/WizDiary -type f -name '*.html' -print0 | xargs -0 perl -i -ple 's/http:\/\/(?=d\.hatena\.ne\.jp)/\//g' 
3. webrick にハンドラを実装する

/searchdiary?word=/archive?word= のハンドラを実装する。ローカルファイルを読んで返すようにする。

require 'webrick'

include WEBrick

port = ENV['PORT']
user = ENV['USER']
pass = ENV['PASS']

server = HTTPServer.new(
  :Port => port,
  :DocumentRoot => './',
  :RequestCallback => lambda do |req, res|
    HTTPAuth.basic_auth(req, res, "my realm") do |username, password|
      username == user && password == pass
    end
  end
)

server.mount_proc '/d.hatena.ne.jp/WizDiary/searchdiary' do |req, res|
  query_string = CGI.unescape(req.query_string).force_encoding('EUC-JP').encode('UTF-8')
  filename = "./d.hatena.ne.jp/WizDiary/searchdiary?#{query_string}.html"
  res.body = File.read(filename)
end

server.mount_proc '/d.hatena.ne.jp/WizDiary/archive' do |req, res|
  if req.path.match?(%r{/archive/})
    res.body = File.read(".#{req.path}")
  else
    query_string = CGI.unescape(req.query_string).force_encoding('EUC-JP').encode('UTF-8')
    filename = "./d.hatena.ne.jp/WizDiary/archive?#{query_string}.html"
    res.body = File.read(filename)
  end
end

trap("INT"){ server.shutdown }
server.start

で、こんな感じでだいたい動く。 URL のぼかしは YouTube の動画エディタのカスタムぼかしを使った。参考 動画にモザイクかけたい! ソフトがなくても画面をぼかす方法【YouTubeのカスタムぼかし機能】 – 100メガ


id:matakimika もあの緑色のデザインや、はてなダイアリーの URL ページ構造(p ごとに見出しで permalink になるが日単位でもまとめて読める)のまま手元に置いておきたかったのでバックアップを取りそこねたことが悔やまれるが、はてなダイアリー終了のかわりに再び更新が再開されたので、それを喜ぶべきだろう。