4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

A I に頼んで Qiitaの投稿記事を Markdownへ一括 ダウンロードしてみてみた

4
Last updated at Posted at 2026-02-23

Qiitaには公式の Qiita API v2 があり、アクセストークンを使って「自分の投稿記事すべて」を取得できます。
Qiitaの投稿記事のバックアップのため Markdownをひとつひとつ取得するのま手間がかかるので、Claude Code に「私のQitaのBlogをMarkdownで全て取得する方法を教えてください。」とお願いして一括取得スクリプトを作成してもらいました。
タイトル画像.jpg

Claude CodeとClaudeは別々のプロダクトです。
Claudeは、claude.aiやAPIを通じて使える汎用AIアシスタントです。会話、文章作成、分析、コーディングなど幅広いタスクに対応しています。
Claude Codeは、コーディング作業に特化したコマンドラインツール(CLI)です。ターミナルから直接使えるエージェント型のツールで、コードベース全体の理解・編集・デバッグ・テスト実行などを自律的に行うことができます。
ということで、今回いま流行りの VS Codeをベースにした次世代のコードエディタ Cursor上で Claude Codeを実行しています。

■ 一括取得スクリプト内容

このスクリプトでは GET /api/v2/authenticated_user/items を呼び出し、レスポンスJSONに含まれる body(Markdown本文)を1記事=1ファイルで保存しています。

fetch_qiita_articles.sh
#!/bin/bash
# Qiita 公開記事 Markdown 一括取得スクリプト
# 使い方: QIITA_TOKEN=your_token ./fetch_qiita_articles.sh

set -euo pipefail

TOKEN="${QIITA_TOKEN:-}"
OUTPUT_DIR="${OUTPUT_DIR:-qiita_articles}"
PER_PAGE=100

if [ -z "$TOKEN" ]; then
  echo "エラー: QIITA_TOKEN 環境変数を設定してください"
  echo "例: QIITA_TOKEN=xxxxxxxx ./fetch_qiita_articles.sh"
  exit 1
fi

mkdir -p "$OUTPUT_DIR"

echo "記事を取得中..."

page=1
total=0

while true; do
  tmp_file=$(mktemp)
  http_code=$(curl -s -o "$tmp_file" -w "%{http_code}" \
    -H "Authorization: Bearer $TOKEN" \
    "https://qiita.com/api/v2/authenticated_user/items?page=${page}&per_page=${PER_PAGE}")
  body=$(cat "$tmp_file")
  rm -f "$tmp_file"

  if [ "$http_code" != "200" ]; then
    echo "APIエラー: HTTP $http_code"
    echo "$body"
    exit 1
  fi

  count=$(echo "$body" | python3 -c "import sys,json; data=json.load(sys.stdin); print(len(data))")

  if [ "$count" -eq 0 ]; then
    break
  fi

  # 各記事をファイルに保存
  echo "$body" | python3 -c "
import sys, json, re, os

data = json.load(sys.stdin)
output_dir = os.environ.get('OUTPUT_DIR', 'qiita_articles')

for item in data:
    item_id   = item['id']
    title     = item['title']
    body_md   = item['body']
    created   = item['created_at'][:10]
    tags      = ', '.join(t['name'] for t in item['tags'])
    likes     = item['likes_count']
    url       = item['url']

    # ファイル名に使えない文字を除去
    safe_title = re.sub(r'[\\\\/:*?\"<>|]', '_', title)
    filename = f'{created}_{safe_title}.md'
    filepath = os.path.join(output_dir, filename)

    # フロントマターを付けて保存
    content = f'''---
id: {item_id}
title: {title}
tags: {tags}
created: {created}
likes: {likes}
url: {url}
---

{body_md}
'''
    with open(filepath, 'w', encoding='utf-8') as f:
        f.write(content)

    print(f'  保存: {filename}')
"

  total=$((total + count))
  echo "ページ $page: $count 件取得 (合計: $total 件)"

  if [ "$count" -lt "$PER_PAGE" ]; then
    break
  fi

  page=$((page + 1))
  sleep 0.5  # レートリミット対策
done

echo ""
echo "完了! $total 件の記事を '$OUTPUT_DIR/' に保存しました。"

この fetch_qiita_articles.sh は、Qiita API v2 にアクセストークンで認証しつつ、自分の投稿一覧をページングで取得してローカルへ保存するバックアップ用スクリプトです。

- `QIITA_TOKEN` を環境変数から受け取り、未設定ならエラー終了します(安全に早期失敗)。
- `GET /api/v2/authenticated_user/items?page=...&per_page=...` を `curl` で呼び出し、`Authorization: Bearer <token>` ヘッダで認証します。
- レスポンス(JSON配列)の件数を数え、0件になったら「全ページ取得完了」としてループを終了します。
- 各記事について、JSONから `title` / `body(Markdown)` / `created_at` / `tags` / `likes_count` / `url` などを取り出し、ファイル名を作って `qiita_articles/` に1記事=1ファイルで保存します。
- 取得負荷を下げるため、ページごとに短い sleep を入れています(レートリミット対策)。

・ 使い方

  1. アクセストークンを取得
  2. 実行: QIITA_TOKEN=あなたのトークン ./fetch_qiita_articles.sh
  3. 出力先を変えたい場合: QIITA_TOKEN=xxx OUTPUT_DIR=my_posts ./fetch_qiita_articles.sh

・ 出力形式
各記事は qiita_articles/ フォルダに以下の形式で保存されます:

形式
  qiita_articles/
    2024-01-15_記事タイトル.md
    2024-03-20_別の記事.md
    ...

各ファイルの先頭にはメタ情報(ID、タグ、いいね数、URL)がフロントマターとして付きます。

Python3 が必要です

■ 実行方法

● アクセストークン取得

1) Qiita 設定画面
Qiita → 設定 → アプリケーション → 「新しいトークンを発行する」をクリック

01_qiitaトークン取得02.jpg

2) アクセストークンの発行画面
スコープは、[read_qiita 権限]へチェックし、[発行する]をクリック
01_qiitaトークン取得03.jpg

3) アクセストークン確認
発行した個人用アクセストークンを保存してください。この文字列は再表示できません

01_qiitaトークン取得04.jpg

● 一括取得スクリプト実行

実行コマンド
  QIITA_TOKEN=あなたのトークン ./fetch_qiita_articles.sh       

・ 実行例

1) 実行ディレクトリ確認

 (venv) shirok@~ % ls -l
  -rwxr-xr-x@ 1 shirok  staff  2256 Feb 22 21:17 fetch_qiita_articles.sh

2) スクリプト実行

  (venv) shirok@~ % QIITA_TOKEN=<あなたのアクセストークン> ./fetch_qiita_articles.sh
    記事を取得中...
    保存: 2026-02-20_Oracle Database@AWS で Multiple ODB Peerings してみてみた.md
    保存: 2026-02-16_Windows の WSLで netperf をインストールして TCP, UDP レイテンシ(遅延)をマイクロ秒(μs)単位で測定してみてみた.md
    保存: 2026-02-04_iPhone に iPerf3 を入れて Oracle Cloud 仮想マシンへインターネット帯域測定してみてみた.md
     ・・・
    ページ 3: 39 件取得 (合計: 239 件)

    完了! 239 件の記事を 'qiita_articles/' に保存しました。

3) 出力ディレクトリ確認

(venv) shiro@kurama Claude % ls -l
    -rwxr-xr-x@ 1 shirok  staff  2256 Feb 22 21:17 fetch_qiita_articles.sh
    drwxr-xr-x@ 2 shirok  staff    64 Feb 22 21:15 qiita_articles

4) 出力ファイル確認

(venv) shiro@kurama Claude % ls -l ./qiita_articles
  total 13992
  -rw-r--r--@ 1 shirok  staff    5195 Feb 22 21:18 2018-07-08_unixODBCをインストールしてみた.md
  -rw-r--r--@ 1 shirok  staff   10295 Feb 22 21:18 2018-07-09_Oracle Cloud で DPDKをインストールしてみた.md
  -rw-r--r--@ 1 shirok  staff   19789 Feb 22 21:18 2018-07-09_Oracle Cloud:Oracle Cloud と AWS を IPSec VPN(Libreswan)でマルチクラウド接続してみてみた.md
  ・・・

これで、自分のQiita記事を Markdown としてローカルに一括バックアップできました。
あとはこのフォルダを Git 管理したり、別サービス(ブログ/Notion/Obsidian等)に移植したりすると「資産化」できます。

※トークンは秘密情報なので、公開・ログ・スクショ・コマンド履歴への残りに注意してください(本記事中のトークン文字列はダミーです)。

■ 参考

Qiita API・スクレイピングについて
Qiita APIのドキュメント
アクセストークン
Cursor
Claude Code の概要とインストール

4
1
0

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
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?