Qiita の記事を Zenn に移行してみる(Qiitaを退会した訳ではない)

3 min read読了の目安(約3100字

Zenn 使ってみたかった

いま話題の Zenn とりあえず触ってみたかったので Qiita での記事を移行してみた。決してQiitaを退会した訳ではないw

ともかくZenn は「GitHubリポジトリ連携」ができるので Qiita が突然サービスしても記事を自分で管理できるのがいいかなと思いました。

Zenn公式サイトに書いてある

Zenn で「GitHubリポジトリ連携」する方法は、Zenn公式サイトに記載されているのでそちらを参照すとして、「Qiita → Zenn に記事を移行」するとき Frontmatter の制約があるのでそこを気にする必要がある。

GitHubリポジトリでZennのコンテンツを管理する

Frontmatter の制約

これだけ押さえておけば簡単に移行できる。あとはスクレイピングして多少整形してあげればよい。

タグ Qiita → Zenn
title title を設定, 70文字の制約あり、「":」はパースエラーになる
emoji アイキャッチとして使われる絵文字
type "tech"固定でよい
topics tags を設定
published true

スクレイピングについて

やり方はどんな方法でもよいが、Qiitaの記事をごっそり移行するならslug値を取得した方が簡単。slug 値は、同じで管理していた方が後々便利そうなので同値にしておく。

Frontmatter の制約があるのでZenn側でデプロイに失敗したら適宜手修正する。

fkooo さん記事の「Qiita API v2 を使って投稿一覧を取得する」 の Python スクリプトで URL だけ取得するようにしておく。② slug 値だけを抜き出してファイルに保存。※下記コマンドで

python Qiita.py | grep "https" | sed "s/^https:\/\/qiita.com\/murachi1208\/items\//$1/" >> Qiita.txt

④ 下記の PHP に ③で処理した「Qiita.txt」を読み込ませて Zennで表示できる mdファイルを作成する。

<?php
require_once('spyc.php');

$fh = fopen("Qiita.txt", "r");
while (($line = fgets($fh))) {
  $line = str_replace(array("\r\n","\r","\n"), '', $line);
  $tmp = qiita($line . ".md");
  $fw = fopen($line . ".md", "w");
  fwrite($fw, $tmp);
  fclose($fw);
}
fclose($fh);

function qiita($md) {
  $user = 'murachi1208';
  $html = file_get_contents("https://qiita.com/" . $user . "/items/" . $md . "", false);

  $position = strpos($html, '---',4);
  $yaml = substr($html, 0, $position + 3);
  $body = substr($html, $position + 3);

  print $md ."\r\n";
  $obj = Spyc::YAMLLoadString($yaml);

  $obj['emoji'] = '📝';
  $obj['type'] = 'tech';
  $obj['topics'] = $obj['tags'] ;
  $obj['published'] = 'true' ;

  //
  $ret = "";
  $ret = $ret .  '---' . PHP_EOL;
  $ret = $ret . 'title: "' . mb_strcut($obj['title'], 0, 70) . '"' . PHP_EOL ;
  $ret = $ret . 'emoji: "📝"' . PHP_EOL ;
  $ret = $ret . 'type: "tech"' . PHP_EOL ;
  $ret = $ret . 'topics: ' . $obj['topics'] . PHP_EOL ;
  $ret = $ret . 'published: true' . PHP_EOL ;
  $ret = $ret . '---' . PHP_EOL;
  $ret = $ret . $body;

  return $ret;
}

⑤ 作成されたファイルを articles/ にコピーする。
※YAMLパースには、spyc を使用しています。

うまくいったのだろうか

とりあえず120投稿分を移行してみた。タイトルを"なろう風"にしていたのがダメでしたね。失敗w

https://zenn.dev/murachi

Qiita → Zenn 自動連係する? あとZenn使ってみて

毎日投稿しているならまだしも、個人でメモ程度に月1あるかないかのペースなので適当に手動同期するのでいいかなと思いました。が、仕組みを作るのは面白いからそのうち簡単にできるようにするかも。

Zenn は、投げ銭とか、記事を売ったり Qitta と方向性は違うと思うが根本は同じかなと思います。技術のオープン化は必要と思いますが、苦労して調べたことがお金になるのもモチベーションアップになると思うしいいことだと考えますね。

参考サイト

Zenn CLIで記事・本を管理する方法
GitHubリポジトリ連携を通して感じたZennの良さ
Qiitaの記事をzennに移行したときにしたこと
4ステップでGithubからZennに記事を公開してみる(トラブルシューティング付き)