塩焼きブログ

塩焼きに関しての研究内容を公開しています

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を研究する必要あり)など用途はいろいろとあるかと思います。