Qiita API v2を利用して記事をローカルにエクスポート・バックアップする

APIを利用してQiitaの記事をエクスポート・バックアップしてみます。今日はPHPを使って書いてみることにします。

<?php
class Qiita {
const ITEM_LIMIT = 20;
private $token;
public function __construct($token) {
$this->token = $token;
}
public function getInfo() {
return $this->getRequest('https://qiita.com/api/v2/authenticated_user');
}
public function getItems($page) {
return $this->getRequest(
'https://qiita.com/api/v2/authenticated_user/items?' .
http_build_query(['page' => $page, 'per_page' => self::ITEM_LIMIT])
);
}
private function getRequest($url) {
$curl = curl_init($url);
curl_setopt_array($curl, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $this->token,
'Content-Type: application/json',
],
]);
$result = curl_exec($curl);
curl_close($curl);
return json_decode($result);
}
}
$token = 'xxxxxxxxxxx';
$workdir = '/tmp/qiita_' . $token;
$setouchi = new Qiita($token);
$max = ceil($setouchi->getInfo()->items_count / Qiita::ITEM_LIMIT);
if (!file_exists($workdir)) {
mkdir($workdir);
}
$created = 0;
$updated = 0;
$skip = 0;
for ($i = 1; $i <= $max; $i++) {
echo "リクエスト($i) -> ";
foreach ($setouchi->getItems($i) as $remoteItem) {
$filename = $workdir . '/' . preg_replace('/.*\//', '', $remoteItem->url);
if (file_exists($filename)) {
$localItem = file_get_contents($filename);
} else {
$localItem = false;
}
if ($localItem === false) {
$created ++;
file_put_contents($filename, json_encode($remoteItem));
echo '+';
} else if (strtotime($remoteItem->updated_at) > strtotime(json_decode($localItem)->updated_at)) {
$updated ++;
file_put_contents($filename, json_encode($remoteItem));
echo '^';
} else {
$skip ++;
echo '_';
}
}
echo PHP_EOL;
}
echo '---' . PHP_EOL;
echo '新規作成: ' . $created . PHP_EOL;
echo '更新あり: ' . $updated . PHP_EOL;
echo '更新なし: ' . $skip . PHP_EOL;

このファイルの$tokenのところと$workdirのところを好きなように変更してもらって、以下のように実行すると保存されます。

$ php qiita-copy.php
リクエスト(1) -> ++++++++++++++++++++
リクエスト(2) -> ++++++++++++++++++++
リクエスト(3) -> ++++++++++++++++++++
リクエスト(4) -> ++++++++++++++++++++
リクエスト(5) -> ++++++++++++++++++++
リクエスト(6) -> ++++++++++++++++++++
リクエスト(7) -> ++++++++++++++++++++
リクエスト(8) -> ++++++++++++++++++++
リクエスト(9) -> ++
---
新規作成: 162
更新あり: 0
更新なし: 0

この機能はバックアップだけでなく、ブログへの移行(別途インポート用フォーマットに変換する処理を書く必要はある)だったり、Evernoteに入れる(別途EvernoteのAPIを研究する必要あり)など用途はいろいろとあるかと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA