この記事は何か?
本記事はQiita APIを使用して自分の記事のView数を取得する方法を解説したものです。
本記事では、Playwrightを使ってAPIリクエストを実行して、すべての記事のView数を取得します。
参考記事
今回のコードの実装は、以下の記事を参考にさせて頂きました。
目次
前提
環境
- エディタ: VS Code
- Node.js: v22.17.1(インストール済み)
Qiitaのアクセストークンについて
Qiita APIでview数を取得するにはQiitaのアクセストークンが必要です。
アクセストークンの発行手順は以下となります。
- Qiitaにログイン
- 右上のアイコンから「設定」を選択
- 左メニューから「アプリケーション」を選択
- 「個人用アクセストークン」の「新しくトークンを発行する」をクリック
- スコープで「read_qiita」にチェックを入れて発行
- 発行したトークンは再表示できないため控えておく。
Playwrightのインストールについて
Playwrightのインストールについては、以下の記事で解説しています。
Playwright×TypeScriptでAPIテストを書いてみる
使用するQiita API
今回は、以下の2つのQiita APIを使用します。
ユーザー情報を取得
GET /api/v2/users/:user_id
ユーザー情報を取得します。
レスポンスのitems_count(記事の投稿数)を使用します。
投稿記事一覧を取得
GET /api/v2/users/:user_id/items
指定したユーザーの投稿記事一覧を作成日時の降順で返します。
レスポンスのpage_views_count(記事のView数)を使用します。
プログラムの設計
API制限の確認
Qiita APIには以下の制限があります:
-
/api/v2/users/:user_id/itemsは1リクエストで最大100記事まで - 認証ありの場合、1時間あたり1000リクエストまで
そのため、すべての記事のview数を取得するには繰り返しリクエストする必要があります。
実装方針
API制限を踏まえ、本記事では以下の方針でview数を取得する方針としました。
-
/api/v2/users/:user_idで、items_count(記事の投稿数)を取得する -
items_countを1回のリクエストで取得する記事数で割って、繰り返しリクエストする回数を求める -
/api/v2/users/:user_id/itemsを繰り返しリクエストして、すべての記事のpage_views_countを取得する
プログラムの実装
ソースコード
下記が実際のコードです。
qiita-api.spec.tsというファイルを作成して実装しました。
import { test, expect } from '@playwright/test';
// 取得した記事の情報からタイトル、ページビュー、作成日を保持
interface Article {
title: string;
page_views_count: number;
created_at: string;
}
const PER_PAGE = 100; // 1ページあたりの最大取得件数
const userid = process.env.USER_ID; // ユーザー名を指定
const accessToken = process.env.ACCESS_TOKEN; // アクセストークンを指定
test('Qiita APIで記事のviewを取得する', async ({ request }) => {
// ユーザー情報から記事の総数を取得
let itemsCount = 0;
try {
// ユーザー情報を取得
const url = new URL(`https://qiita.com/api/v2/users/${userid}`);
const headers = {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
};
const response = await request.get(url.toString(), { headers });
// ステータスコードが200であることを検証
expect(response.status()).toBe(200);
// レスポンスボディから記事の総数を取得
const jsonResponse = await response.json();
itemsCount = jsonResponse['items_count'];
} catch (error) {
console.error('Error:', error);
test.fail();
}
// 記事の総数から記事取得のループ回数を計算する
const loopCount = Math.ceil(itemsCount / PER_PAGE);
// すべての記事のページビューを取得
let articles: Article[] = [];
try {
for (let i = 1; i <= loopCount; i++) {
// リクエストURLの構築
const url = new URL(`https://qiita.com/api/v2/users/${userid}/items`);
url.searchParams.append('page', i.toString()); // ページ番号(1から開始)
url.searchParams.append('per_page', PER_PAGE.toString()); // 1ページあたりの取得件数
const headers = {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
};
// ユーザーの記事一覧を取得(作成日の降順で取得)
const response = await request.get(url.toString(), { headers });
// ステータスコードが200であることを検証
expect(response.status()).toBe(200);
// レスポンスボディから各記事のタイトル、ページビュー、作成日を取得
const jsonResponse = await response.json();
articles = articles.concat(jsonResponse);
}
} catch (error) {
console.error('Error:', error);
test.fail();
}
// 最初に取得した記事の総数と、リクエストして取得した記事の件数が同じかチェック
expect(articles.length).toBe(itemsCount);
// 取得件数をログ出力
console.log(`Number of articles retrieved: ${articles.length}`);
// 総ページビュー数、平均ページビュー数をログ出力
const totalViews = articles.reduce((sum, article) => sum + article.page_views_count, 0);
console.log(`total: ${totalViews}`);
console.log(`average: ${Math.floor(totalViews / articles.length)}`);
console.log('='.repeat(80));
// 取得した記事を一覧でログ出力(タイトル、ページビュー、作成日をカンマ区切りで出力)
articles.forEach((article, index) => {
console.log(`No.${index + 1},${article.title},${article.page_views_count},${article.created_at}`);
});
});
実行方法
-
コード内の以下の値を自分の情報に書き換える
-
userid: 自分のQiitaユーザーID -
accessToken: 自分のQiitaアクセストークン
-
-
ターミナルで以下のコマンドを実行
npx playwright test qiita-api.spec.ts --project=chromium
実行結果
以下のような結果を取得できます。
Number of articles retrieved: 28
total: 6632
average: 236
================================================================================
No.1,経験ベースのテスト技法とは?概要と一般的な技法について,28,2025-11-29T15:56:40+09:00
No.2,ブラックボックステストとは?概要と一般的な技法について,80,2025-11-28T12:43:27+09:00
No.3,Qiitaの記事執筆に便利なVSCodeの3つの拡張機能,200,2025-11-25T20:07:34+09:00
...
No.28,JMeterをWindows11にインストールする,563,2025-10-05T16:51:54+09:00
記事数、総View数、平均View数が一目で分かるため、自分の記事の状況を把握しやすくなります。