murawaki の雑記

はてなグループから移転してきました

はてなグループからの引っ越し

2019 年 7 月第3週に数日かけて、はてなグループにあった雑記をはてなブログに移した。その処理のメモ。はてなグループを使っている人、さらには日記機能だけを使っていた人は少ないだろうから、需要はないと思われるが、備忘録として。

背景

2009 年 4 月にはてなダイアリーを使いはじめたが、すぐにはてなグループに移行したという経緯がある。当時のはてなダイアリーは encoding に EUC-JP を使っており、JIS の範囲外の文字を使おうとすると文字参照の嵐になって不便だった。はてなグループを採用したのは、日記の encoding が UTF-8 だったから。日記以外の機能は一切使っていなかった。

2019 年 7 月 3 日にはてなグループの年内終了の予告があった。サービス終了のリスクは前々から感じていた。明らかに放置されていたので。しかし意外だったのは、自社サービス内での移行機能をまともに提供していないこと。予告には「MT形式での出力など対応を検討いたします」とあったが、はてなのやる気のなさを考えると実現するか疑わしい。それに、MT 形式での export にしか言及してないということは、はてなブックマーク等の移行を行う気がないという意味だと理解した。それなら自分でやってしまった方がはやい。はてなブログを採用したのは、はてな記法を真面目に整形するのが面倒という消極的な理由。

手順は以下の通り

  1. はてなグループの日記を CSV ファイルにエクスポート
  2. エクスポートされた日記を記事に分割
  3. 各記事をはてなブログに仮アップロード
  4. 新旧記事の URL 対応を取得
  5. 記事間リンクを修正した記事をはてなブログに再アップロード
  6. はてなグループの日記の各記事を新 URL への案内に差し替えてアップロード

はてなグループの日記を CSV ファイルにエクスポート

はてなグループの日記の「管理」から「データ管理」以下の「日記のダウンロード」に進み、CSV ファイルをダウンロード。

「データ管理」とは別に「日記のエクスポート・インポート・削除」があるのが謎すぎる。

エクスポートされた日記を記事に分割

ローカルで CSV 形式の日記を記事単位のテキスト単位に分割。csv2hw.pl: CSV からはてダラ形式への変換スクリプトを取ってきて魔改造。改造の目的は HatenaBlogWriter 形式にあわせること。

  • はてなダイアリーライター形式は YYYY-MM-DD.txt という日単位のテキストファイルを要求するが、HatenaBlogWriter は YYYY-MM-DD_NN.txt という記事単位のテキストファイルを要求する。1 日に複数の記事を書いた場合は分割しないとけない。
  • HatenaBlogWriter が要求するメタ情報 (title, date, category 等) を抽出し、出力のヘッダに記述

例えば、日単位のテキストでは body 内に

*p1*[ネタ]昆虫とままごと

のように記述されていた記事タイトルから、記事番号 NN (01)、category (ネタ)、title (昆虫とままごと) を抽出。

各記事をはてなブログに仮アップロード

記事単位のテキストファイルを HatenaBlogWriter を使ってはてなブログにアップロード。

ruby hbw.rb

1 日 100 記事の投稿制限に引っかかった。実行を 2 回にわけることに。

新旧記事の URL 対応を取得

なぜ仮アップロードかというと、雑記内には以前の記事へのリンクが大量に貼られていて、これを適切に書き換える必要があったから。はてなブログでは、一度アップロードしてみないことには、どの URL が割り当てられるかわからない。

HatenaBlogWriter は ./data/YYYY-MM-DD_NN.txt.dat というファイル名でメタ情報を出力する。このうち、

url: https://rekken.hatenablog.com/entry/20190526/1558796400

に着目し、YYYY-MM-DD_NN から新 URL への対応表を作る。

記事間リンクを修正した記事をはてなブログに再アップロード

この対応表を見ながら、各記事テキストを走査し、http://rekken.g.hatena.ne.jp/murawaki/YYYYMMDD/pNNhttps://rekken.hatenablog.com/entry/YYYYMMDD/?????????? に書き換え。

再び hbw.rb を呼び出して再アップロード。これで新しいはてなブログ側の処理は終了。

はてなグループの日記の各記事を新 URL への案内に差し替えてアップロード

最後に古いはてなグループの日記を移転告知に差し替える。

改造していない、元の csv2hw.pl を呼び出して、CSV 形式の日記を YYYY-MM-DD.txt というファイル名の日毎の日記に分割。

日毎の日記を走査し、

*p1*[ネタ]昆虫とままごと

のような記事タイトルにマッチすると、それをそのまま出力。続けて、先の対応表を参照し、

<a href="https://rekken.hatenablog.com/entry/YYYYMMDD/??????????">はてなブログに移転しました</a>

という移転告知を出力。もとあった記事本文は捨てる。

この結果をはてなグループの日記にアップロード。アップロードには はてなダイアリーライター (hw.pl) を使う。HTTPS でのアクセスが必須になっているらしいが、

require Crypt::SSLeay;

が通らず、Crypt::SSLeay を CPAN で取ってきて build しようとしても失敗する。

コードの中身をちゃんと確認していないが、Crypt::SSLeay が登場するのはここだけ。stackoverflow のやりとりを参考にしつつ、これを

require Net::SSLeay;

に書き換えると問題なく動いた。