blockblog移行手順
ごく限られたニーズだと思うがtrackbackしてくれた人がいた(!)ので、以下列挙します。
利用の際は各自自己責任で。
作業環境
debian/GNU Linux stable
OpenOffice.org calc 2.0
bash
ruby1.8
# unix系の環境が手元にない人ごめんなさい、でもbash以外はかなり流用できるんじゃないかと思います。
手順概要
試行錯誤はあったものの、概ね以下の手順で実施
a. blockblog(以下bblog)への投稿記事を読みHatena::Diary(以下hatena)にupload可能な形式(Movable Type形式以下MT形式)に変換、local diskにdownload
b. 同様に画像をlocal diskにdownload
c. bで取得した画像をhatenaに一括upload
d. aで生成したMT形式のdata fileをhatenaに一括upload
e. hatenaの記事中の画像linkをbblogへのlinkからhatenaへのlinkに置換する(ここは手動)
# trackbackやcommentは移行対象外
では各詳細を説明
a.
こちらは
a-1. 取得すべき投稿記事idを各行に羅列したtext file
a-2. a-1からruby scriptに取得対象な記事のurlを渡し、取得結果をfileにdumpするbash script
a-3. a-2から呼ばれ、該当urlのhtml sourceから必要箇所を取り出し、MT形式に変換するruby script
という構造にした。
a-1は具体的には手動、bblogの管理者画面で
> 管理者ツールトップ > 猫又にたぶらかされてはなりませぬ : 記事編集
に行き、このpageを保存
このpageを自分のblog_seq(私の場合は19469)でgrepして記事一覧のlinkのみにして それをさらにOpenOfficeに貼りつけて簡単に文字列分割して記事の一覧にしてそれをtext fileに保存
a-2はこんなscript
#! /bin/bash # a-1のlistにfileをfull path指定 TARGETLIST="/home/hogehoge/bin/bblog2hatena/entrytarget.txt" # a-3のruby scriptのありかをこれまたfull path指定 RETREIVE_ENTRY="/home/hogehoge/bin/bblog2hatena/retreive_entry.rb" # bblogの自分の公開側のurl(の一部) a-1の記事のidを末尾につけてちゃんと見えればOK URLPART="http://ki01.bblog.jp/entry/" # MT形式の出力先file名 MTFORMAT="ki01.bblog.txt" for TARGETPOST in `cat $TARGETLIST` ; do cd /tmp/blog_moving/ echo $TARGETPOST ruby $RETREIVE_ENTRY $URLPART$TARGETPOST/ >> $MTFORMAT done
a-3はこんなscript
require 'hpricot' require 'open-uri' require 'kconv' require 'parsedate' require 'date' doc = Hpricot(open(ARGV[0])) print "AUTHOR: k1dee" print "\n" print "TITLE: " # title (doc/'a').each { |e| s = e.inner_html.toutf8.gsub(/<.*?>/,'') if e.attributes['href'] == (ARGV[0]) print s print "\n" end } print "STATUS: Publish" print "\n" print "ALLOW COMMENTS: 1" print "\n" print "CONVERT BREAKS: 1" print "\n" print "ALLOW PINGS: 1" print "\n" print "DATE: " # date (doc/'h2.date').each { |e| s = e.inner_html.toutf8 t = Date.parse(s) print t.strftime("%m/%d/%Y") } print " 00:00:00 AM" print "\n" print "CATEGORY: " # category (doc/'span').each { |e| s = e.inner_html.toutf8.gsub(/<.*?>/,'') next if e.attributes['style'] != nil print s.gsub(/[\[\]]/,'') } print "\n" print "-----" print "\n" print "BODY:" print "\n\n" print "<div class=\"section\">" print "\n" # body (doc/'div.entrybody').each { |e| s = e.inner_html.toutf8 print s print "\n" } print "</div>" print "\n\n" print "-----" print "\n" print "EXTENDED BODY:" print "\n\n" print "-----" print "\n" print "EXCERPT:" print "\n\n" print "-----" print "\n" print "KEYWORDS:" print "\n\n" print "-----" print "\n\n" print "--------" print "\n\n"
b以降はまた続きで書きます。