0
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?

Playwright×QiitaAPIで記事のView数を取得する

Posted at

この記事は何か?

本記事はQiita APIを使用して自分の記事のView数を取得する方法を解説したものです。
本記事では、Playwrightを使ってAPIリクエストを実行して、すべての記事のView数を取得します。

参考記事

今回のコードの実装は、以下の記事を参考にさせて頂きました。

目次

前提

環境

  • エディタ: VS Code
  • Node.js: v22.17.1(インストール済み)

Qiitaのアクセストークンについて

Qiita APIでview数を取得するにはQiitaのアクセストークンが必要です。
アクセストークンの発行手順は以下となります。

  1. Qiitaにログイン
  2. 右上のアイコンから「設定」を選択
  3. 左メニューから「アプリケーション」を選択
  4. 「個人用アクセストークン」の「新しくトークンを発行する」をクリック
  5. スコープで「read_qiita」にチェックを入れて発行
    1. 発行したトークンは再表示できないため控えておく。

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数を取得する方針としました。

  1. /api/v2/users/:user_idで、items_count(記事の投稿数)を取得する
  2. items_countを1回のリクエストで取得する記事数で割って、繰り返しリクエストする回数を求める
  3. /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}`);
  });
});

実行方法

  1. コード内の以下の値を自分の情報に書き換える

    • userid: 自分のQiitaユーザーID
    • accessToken: 自分のQiitaアクセストークン
  2. ターミナルで以下のコマンドを実行

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数が一目で分かるため、自分の記事の状況を把握しやすくなります。

参考資料

0
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
0
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?