Posted at

Tumblrからはてなブログへの記事移行をAPI経由で行う方法

More than 3 years have passed since last update.

Tumblrからはてなブログへの記事移行をやってるんですが、それをAPI経由で行った方法です


環境

OSX 10.10.5

Ruby 2.2.3p173


全体手順


  1. Tumblrから全記事をローカルにexportする

  2. ローカルにexportした記事をいい感じに加工しながらAPI経由ではてなブログに新エントリーを投稿する


1. Tumblrから全記事をローカルにexportする

これにはsky-tumblr-exportを使います

$ npm install -g sky-tumblr-export

とかでサクッと入るんですが、実際に実行するとpandocをインストールしてくれと言われるので、cabal経由でインストールします

$ brew install haskell-platform

$ export PATH=${HOME}/.cabal/bin:$PATH
$ cabal update
$ cabal install cabal-install
$ cabal install pandoc
$ export PATH="$HOME/Library/Haskell/bin:$PATH"

ここまで来てやっとpandocが使えるようになったので、sky-tumblr-exportを使います

$ sky-tumblr-export -u blog.kinzal.net -d /tmp/tumblr --titles

/tmp/tumblr以下にexportされているので、確認してみましょう


2. ローカルにexportした記事をいい感じに加工しながらAPI経由ではてなブログに新エントリーを投稿する

ここからは正直試行錯誤になりそう…

全体的にはgistに投稿してあるので、こちらを見てください

https://gist.github.com/henteko/28a5557a8655de8ae767

基本的な流れとしては、

2.1. exportしたtumblrのデータを読み込んで、タイトルと投稿日時と内容を取得

2.2. 取得したものを元にはてなブログに投稿日時に合うようにアップロード

という感じです


2.1 exportしたtumblrのデータを読み込んで、タイトルと投稿日時と内容を取得

exportしたtumblrデータからタイトルと投稿日時と内容を取得します

今回はRubyを用います

title, date, body = '', '', ''

conf_flag, blank_flag = false, false
blank_count = 0
File.open('/path/to/tumblr_file.md') do |file|
file.each_line do |labmen|
if md = labmen.match(/^raw: (.*)/)
json = md[1]
hash = JSON.parse(json)
title = hash["title"]
date = Time.parse(hash["date"]).utc.iso8601
end
body += labmen if blank_flag

# タイトル部分を本文から除外する(改行含めて5行ある)
if conf_flag && !blank_flag
blank_count += 1
blank_flag = true if blank_count >= 5
end
# -->から上は除外する
conf_flag = true if labmen.match(/^-->/)
end
end
end

なかなかバカみたいなことをしてますが、普通には取り出せないのでこんな感じにしてます

これで、title, date, bodyに取得すべきものが取れます

ちなみにdateははてなブログのAPIに合うように、utcのiso8601に変形してます


2.2. 取得したものを元にはてなブログに投稿日時に合うようにアップロード

ブログに実際に投稿していきます

require 'atomutil'

user_name = 'your_hatena_user_name'
blog = 'your_blog_domain'
url = "http://blog.hatena.ne.jp/#{user_name}/#{blog}/atom/entry"
auth = Atompub::Auth::Wsse.new(
:username => user_name,
:password => 'password'
)
client = Atompub::Client.new(:auth => auth)
entry = Atom::Entry.new(
:title => title,
:updated => date.to_s,
:content => content)
client.create_entry(url, entry)

これではてなブログにアップロードが出来ます

しかしここで問題があって、文字コードの問題でエラーになる場合があります

なので、自分ではruby-atomutilをforkして、自分のブログエントリ内容に合うように改良してそれを使うようにしました

https://github.com/lyokato/ruby-atomutil/compare/954c5d1b387bff63db3462d19d3f7abf196d2b1f...henteko:304e3f464fd84ba2a0b0a50d71e6a0895ac8a8b4


おわりに

これでTumblrからはてなブログへの記事移行は完了です

正直、Tumblrが公式にexportをサポートしてくれたり、はてなブログがTumblrからの移行をサポートしてくれたら一番いいんですが、そんな需要が果たしてどれほどあるのかと疑問になる機能を開発しないですよね


参考

http://www.rpms.me/entry/900036583469/transfer-to-hatena-blog

http://developer.hatena.ne.jp/ja/documents/blog/apis/atom

http://qiita.com/k1LoW/items/4c4ecf4afc1e753038f8

https://gist.github.com/FromAtom/6445620