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以降はまた続きで書きます。