😎

QiitaからZennに雑に移行した

2022/12/15に公開

VSCodeで記事を書いてそのまま反映させる体験がよさそうだったので、QiitaからZennにお引越ししました。
自動でやってくれるツールとかありそうですが、量的にえいっとやっちゃえるので自前でえいっとやりました。

環境

macOS Ventura 13.0.1
Node.js 18.x

前提

このへんはやってある体です。

https://zenn.dev/zenn/articles/connect-to-github

https://zenn.dev/zenn/articles/install-zenn-cli

手順(概要)

  1. Qiita APIで自分の記事一覧をとってくる
  2. とれたJSONをスクリプトで .md ファイルに落とし込む
  3. 不足部分を調整する
  4. push

手順(詳細)

1. Qiita APIで自分の記事一覧をとってくる

https://qiita.com/api/v2/users/:userid/items を叩きます。
:userid を自分のQiita IDに置き換えてください。
Qiita API において、 GET は認証は不要です。ブラウザのアドレスバーに入れるだけでもとってこれます。まぁ curl なり postman なりご自由にどうぞ。

レスポンスを qiita.json というファイルに保存し、Zenn 用のリポジトリのルートに置いておきます。

https://qiita.com/api/v2/docs
(よみづらい)

2. とれたJSONをスクリプトで .md ファイルに落とし込む

以下のようなスクリプトを書いて Zenn 用のリポジトリのルートに置き、 node ./move.mjs で実行します。
Node.js のバージョンは18系でした。

レスポンスから対応する情報をとってまとめ、 /articles 以下に 1記事ずつ放り込むスクリプトです。

move.mjs
import json from "./qiita.json" assert { type: "json" };
import fs from "node:fs/promises";

for (const item of json) {
  const header = `---
title: "${item.title}"
emoji: ""
type: "tech"
topics: [${item.tags.map((t) => `\"${t.name}\"`)}]
published: false
published_at: ${item.created_at.replace("T", " ").slice(0,16)}
---
`;
  const body = item.body;
  fs.writeFile(`./articles/${item.id}.md`, header + "\n" + body);
}

3. 不足部分を調整する

だいたいできればいいやと思っていたので、先のスクリプトは以下に対応していないです。

  • 絵文字が入らない
  • タグ/トピックの仕様の違いを吸収してない
    • Qiitaはタグに記号(.とか)を含められるのですが、Zennは使えません。
      • 名寄せを考えるといい仕様ですね。
    • なので、 Node.js とかは nodejs にしなきゃいかんのですが、そんなのは実装してませんよ、という。
  • 画像とってきてない
  • 独自のmarkdown拡張を置き換えてない
    • s/note/message とか。

これくらい手動でやればいっかなーと思ってました。

4. push

ぷっしゅぷっしゅ

おわり

以上です。
普段遣いのエディタから直接記事が書けるのは快適ですね。

GitHubで編集を提案

Discussion