Qiita の記事を Zenn に移行してみる(Qiitaを退会した訳ではない)
Zenn 使ってみたかった
いま話題の Zenn とりあえず触ってみたかったので Qiita での記事を移行してみた。決してQiitaを退会した訳ではないw
ともかくZenn は「GitHubリポジトリ連携」ができるので Qiita が突然サービスしても記事を自分で管理できるのがいいかなと思いました。
Zenn公式サイトに書いてある
Zenn で「GitHubリポジトリ連携」する方法は、Zenn公式サイトに記載されているのでそちらを参照すとして、「Qiita → Zenn に記事を移行」するとき Frontmatter の制約があるのでそこを気にする必要がある。
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
Qiita → Zenn 自動連係する? あとZenn使ってみて
毎日投稿しているならまだしも、個人でメモ程度に月1あるかないかのペースなので適当に手動同期するのでいいかなと思いました。が、仕組みを作るのは面白いからそのうち簡単にできるようにするかも。
Zenn は、投げ銭とか、記事を売ったり Qitta と方向性は違うと思うが根本は同じかなと思います。技術のオープン化は必要と思いますが、苦労して調べたことがお金になるのもモチベーションアップになると思うしいいことだと考えますね。
参考サイト
・Zenn CLIで記事・本を管理する方法
・GitHubリポジトリ連携を通して感じたZennの良さ
・Qiitaの記事をzennに移行したときにしたこと
・4ステップでGithubからZennに記事を公開してみる(トラブルシューティング付き)
Discussion