塩焼きブログ

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

Qiitaの全記事を一括編集する

Qiitaの全記事を取得して、特定の文字列が含まれていたら編集みたいな処理をしたり、記事を移行した場合の移行先リンクの追加などを行う時にこんな感じでできると思います。

<?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])
    );
  }

  public function patchItems($id, $data) {
    return $this->patchRequest('https://qiita.com/api/v2/items/' . $id, $data);
  }

  private function patchRequest($url, $data) {
    $curl = curl_init($url);
    curl_setopt_array($curl, [
      CURLOPT_CUSTOMREQUEST => 'PATCH',
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_POSTFIELDS => json_encode($data),
      CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . $this->token,
        'Content-Type: application/json',
      ],
    ]);
    $result = curl_exec($curl);
    curl_close($curl);

    return json_decode($result);
  }

  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 = 'mosura';

$setouchi = new Qiita($token);
$max = ceil($setouchi->getInfo()->items_count / Qiita::ITEM_LIMIT);

$result = "";

for ($i = 1; $i <= $max; $i++) {

  echo PHP_EOL;

  foreach ($setouchi->getItems($i) as $remoteItem) {

    $url = "https://blog.sioyaki.com/entry/" . date("Y/m/d/His", strtotime($remoteItem->created_at));

    print_r($setouchi->patchItems($remoteItem->id, [
      "body" => "Qiita:Teamへの移行のため、この記事は " . $url . " に移行されました。この記事は移行のために一定の期間を置いて削除します。",
      "tags" => [["name" => "Hatena", "versions" => ["0.0.1"]]],
      "title" => $remoteItem->title,
    ]));
  }
}

echo PHP_EOL;

今回Qiita::Teamに移行するには記事を全部削除しなければいけないようだったので、一括して削除する前に移転先を記載しました。