26
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Qiitaの投稿をGitHubにバックアップ

Last updated at Posted at 2012-08-03

最近、何か思いつくとQiitaに書いてばかりいます。やっぱり、KobitoのMarkdown + ローカル編集は楽ちんですね。

Qiita + Kobito への依存度が上がるにつれて、気になるのがバックアップ。そこで、Qiitaへの投稿をサクッとGitHubにバックアップするスクリプトを作りました。(for Mac)

  • 例: cognitom/Qiita ←こんな感じにGitHubにコミットされます。

##はじめに (前提条件)

  • Kobitoを利用して投稿していること。
  • PHPのコマンドライン版が使えること。(シェル版もそのうち公開されるかも)
  • 例外処理とか書いてません。;-)

##使い方

  1. まず、自分のGitHubに新規にリポジトリを作成します。
    • "Repository Name"を「Qiita」に。(別の名称でも構わないですが、以降適宜読み替えて下さい)
    • "Initialize this repository with a README"のオプションをチェック。
    • "Create Repository"をクリック。
  2. Macにクローン。
    • "Clone in Mac"ボタンをクリック。
    • ~/github/Qiita にクローン。
  3. 次のコマンドを実行。
$ cd ~/github/Qiita
$ curl -s https://raw.github.com/cognitom/Qiita/tool/update.php | php

※実行そのものも自動化したい場合は、dailyとかでcronを回して下さい。

##注意
コマンドを実行すると、カレントディレクトリの内容を一旦削除して、KobitoのデータベースからMarkdownファイルを再構築します。なので、必ずリポジトリのディレクトリに移動してから、実行すること。

##スクリプト解説

コードは、GitHubにも置いてあります。処理の流れはこんな感じ。

  1. KobitoのデータはSQLiteに保存されているので、その内容をSQLで取得。
  2. 1レコードずつ、ファイルに保存
  3. 目次ファイルを保存 (README.md)
  4. GitHubに自動コミット

なお、ここではQiitaに公開済みの投稿だけをバックアップするようにしました。(「限定共有」も除く)

下記ソースのコメントも参照。

update.php
<?php
//各種設定
$dir = getcwd();
$dbfile = getenv('HOME') . '/Library/Kobito/Kobito.db';
$message = 'Automatic Update';

//ファイル名のサニタイズ関数
function sanitize($string) {
	return trim(str_replace(str_split("~`!@#$%^&*=+{}\\|;:\"',<.>/?"), '', strip_tags($string)));
}

//ローカルリポジトリのファイルを一度クリア
$files = glob("$dir/*");
foreach ($files as $file)
	if (is_file($file) && 'README.md' != basename($file))
		unlink($file);

//Kobitoからデータを取得 (SQLite)
$db = new SQLite3($dbfile);
$query = "select ZUID, ZTITLE, ZRAW_BODY, ZURL from ZITEM where ZUID is not null and ZPRIVATE = 0 ORDER BY ZPOSTED_AT DESC";
$results = $db->query($query);

//1レコードずつファイルに保存
$md = "Posts on Qiita\n=====\n\n";
echo "Collecting your posts from Kobito...\n";
while ($row = $results->fetchArray()){
	$title = sanitize($row['ZTITLE']);
	echo "* $title\n";
	$md .= "* [{$row['ZTITLE']}]({$row['ZURL']} \"see on Qiita\")\n";
	file_put_contents("$dir/$title.md", $row['ZRAW_BODY']);
}

//目次がわりのREADME.mdを作成
file_put_contents("$dir/README.md", $md);

//GitHubにコミット
echo "\nConnecting to GitHub...\n";
chdir($dir);
exec("git add -A");
exec("git commit -a -m '$message'");
exec("git push origin master");

##Appendix

Q. Gitでユーザ名・パスワードを聞かれてめんどくさい

A. GitのモードがHTTPになっているのかも。次のコマンドでSSHに切り替えると、いちいち聞かれなくなるはず。

git config remote.origin.url git@github.com:your_user_name/repository_name.git

###Q. 毎回curlでダウンロードするのもどうかと...
A. 適当なところにダウンロードして使って下さい。ダウンロードしたら、↓こんな感じで。

$ cd ~/github/Qiita
$ php ./update.php

###Q. Gist連携でいいじゃん
A. オンラインからの編集だと、その機能があるんですよね。最近気付きました。Kobitoからはその機能使えないのと、文章のバックアップも必要なので。GitHubのリポジトリの方がまとまってる感もありますし。

###Q. 投稿数が増えて来るとちょっとつらい?
A. 差分をとるような方向にプログラム修正した方が良いかも。コメント、フォーク歓迎です。

26
25
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?