とんかつ時々あんどーなつ

〜たとえ低空でも飛行していられるように〜

はてなブログに書いてきた記事を GitHub で管理する

はじめに

このブログを始めてから 8 年経ち、気づけば記事も 100 を超えている。 今年に入ったあたりから自分の記事を手元に置いておきたい欲がでてきていた。

道具が揃ったので GitHub リポジトリを作り、そこで管理するようにしたというお話。

はてなブログを辞める予定はいまのところありません

結論

「Claude Code が一晩でやってくれました

どうしたかったか

以下のように管理したいと考えていた

  • 1 記事 1 ファイルで Markdown にする
  • 年と月のディレクトリをそれぞれ作り、該当月の記事をそこに置く

手順

はてなブログのエクスポート機能を使って MovableType 形式のファイルをダウンロードする。このファイルにはすべての記事の情報が含まれている。

僕の場合は kasaharu.hatenablog.com.export.txt というファイルがダウンロードでき、中身は以下のような感じになっていた。

AUTHOR: kasaharu
TITLE: Obsidian と Claude Code で日報を管理する
BASENAME: 20250702/1751407426
STATUS: Publish
ALLOW COMMENTS: 1
CONVERT BREAKS: 0
DATE: 07/02/2025 07:03:46
CATEGORY: Claude Code
CATEGORY: Obsidian
-----
BODY:
<h1 id="はじめに">はじめに</h1>

<p>世の中の流れにのるべくいろんなツールを試している。これは 6 月に試した日報管理のふりかえり。</p>

<h1 id="Obsidian-はじめました">Obsidian はじめました</h1>
(途中省略)
-----
--------
AUTHOR: kasaharu
TITLE: Hello Angular x Claude Code
BASENAME: 20250630/1751241041
STATUS: Publish
ALLOW COMMENTS: 1
CONVERT BREAKS: 0
DATE: 06/30/2025 08:50:41
CATEGORY: Angular
CATEGORY: Claude Code
CATEGORY: AI Coding
-----
BODY:
(続く…)

まずはこの中身を記事ごとに分割し、それぞれ期待するディレクトリに MovableType 形式のファイルのまま配置するようにした。 プロンプトはこんな感じ。

hatena/kasaharu.hatenablog/kasaharu.hatenablog.com.export.txt を次のように分割してほしいです。
- hatena/kasaharu.hatenablog/kasaharu.hatenablog.com.export.txt はそのまま残す
- `AUTHOR: kasaharu` から始まり `--------` までをひとつのブロックとしてファイルに分割する
- 移行の操作は `STATUS: Publish` のもののみとする(Draft は無視)
- 分割する際のディレクトリは DATE(MM/DD/YYYY hh:mm:ss) に含まれる YYYY/MM/ にする
- ファイルの名前は BASENAME の `/` を `-` に変更して、拡張子は `.txt` とする

初回は kasaharu.hatenablog.com.export.txt の中に下書きの記事が含まれていることに気づいてなかったため、一度やり直した。

ただ 2 回目で期待通りのディレクトリ構造とファイル分割をしてくれた。すごいぞ…

ファイルが分割できたのでテキストファイルをひとつずつ Markdown にしてもらう。 まずはお試しで初めての記事を変換してもらうよう指示した。

hatena/kasaharu.hatenablog/2017/01/2017-01-30-083330.txt を Markdown 形式で書き直して hatena/kasaharu.hatenablog/2017/01/2017-01-30-083330.md として保存してください。
- hatena/kasaharu.hatenablog/2017/01/2017-01-30-083330.txt はそのまま残す
- ヘッダーについて
    - 先頭行から `BODY:` の直前までをヘッダーと呼ぶことにする
    - ヘッダーの最初の行に `---` を追加する
    - ヘッダーの最後の行が `-----` の場合は、それを `---` に置き換える
    - Front Matter になればよい
- ボディについて
    - `BODY:` から下をボディと呼ぶことにする
    - `BODY:` の行は削除する
    - 最後の 2 行にある `-----` と `--------` も削除する
    - 残りを Markdown で表現する
        - HTML タグではなく Markdown 形式にする
    - `http://d.hatena.ne.jp/keyword` から始まるリンクがある場合、そのリンクは削除する

これまた期待通りの Markdown ファイルになった。すごい、すごいぞ…

あとはすべてのファイルを変換するだけである。

まとめ

念願の全記事 GitHub 管理を実現できた。 こういうのをパッとできるようになったの すごい助かる。