3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?