はじめに
Qiitaで記事を書き始め、6年。この記事は、117記事目になります。

過去を振り返ることはあんまりしてこなかったけど、今後の自分の方向性を考えるうえで、通算でよく見られていた記事ってなんだろうと思い、QiitaのAPIを使って調べてみました。
もしかしたら有料のプランに加入すれば、これは見られるのかもしれませんが、無償なので、手で作りました。でも簡単です。
作成したソースは下記のgithubにあります。
概要
Node.jsの、npm run startで起動する、CUIアプリです。また自分用なので、"認証中のユーザーの記事の一覧を作成日時の降順で返します。"というGET /api/v2/authenticated_user/itemsを使用しています。
ソース
import axios from "axios";
import dotenv from "dotenv";
import fs from "fs";
dotenv.config();
const token = process.env.QIITA_TOKEN;
const PER_PAGE = 100;
// ほしい情報の型定義
interface QiitaItem {
title: string;
url: string;
page_views_count: number;
likes_count: number;
stocks_count: number;
comments_count: number;
tags: string[];
created_at: string;
updated_at: string;
}
// 記事を取得する関数
async function fetchQiitaItems(): Promise<QiitaItem[]> {
const allItems: QiitaItem[] = [];
let page = 1;
try {
// 無限ループで記事を取得
while (true) {
// APIを呼び出して、Qiitaの最新記事を取得
const response = await axios.get("https://qiita.com/api/v2/authenticated_user/items", {
headers: {
Authorization: `Bearer ${token}`,
},
params: {
per_page: PER_PAGE,
page: page,
},
});
const currentItems = response.data.map((item:any) => ({
title: item.title,
url: item.url,
page_views_count: item.page_views_count,
likes_count: item.likes_count,
comments_count: item.comments_count,
stocks_count: item.stocks_count,
tags: item.tags.map((tag: any) => tag.name),
created_at: item.created_at,
updated_at: item.updated_at,
}));
allItems.push(...currentItems);
if (response.data.length < PER_PAGE) {
break;
}
page++;
}
} catch (error) {
console.error("API呼び出しエラー:", error);
}
console.log(`✅ 合計 ${allItems.length} 件取得完了`);
return allItems;
}
// CSVファイルに保存する関数
function saveToCSV(items: QiitaItem[]): void {
// ,でjoinして、それを\nでjoin
const csv = items.map((item) => (
[
item.title,
item.url,
item.page_views_count,
item.likes_count,
item.comments_count,
item.stocks_count,
item.tags.join(","),
item.created_at,
item.updated_at,
].join(",")
)).join("\n");
// ファイルに保存
fs.writeFileSync("qiita_items.csv", csv);
}
async function main() {
const items = await fetchQiitaItems();
if (items) {
saveToCSV(items);
console.log("✅ CSVファイルに保存完了");
} else {
console.error("❌ 記事の取得に失敗しました");
}
}
main();
ざっと説明
-
interface QiitaItem- APIから取得したい情報の型定義
- 得られるすべての情報が欲しいわけではないので、扱うべき情報を宣言する意味もある
-
function fetchQiitaItems()- 全件取得するまでAPIを繰り返し呼びだす
- 取得した記事情報を、配列にして返す
-
function saveToCSV()- 1つの記事情報をカンマ区切りの1文にして
- 全部の記事を改行区切りにして
- ファイル保存
ちょっと改造
下記の関数を噛まして、view数の降順にしてみました。
function sortByPageViewsCount(items: QiitaItem[]): QiitaItem[] {
return items.sort((a, b) => b.page_views_count - a.page_views_count);
}
結果
1位:マイクラのスライムチャンクファインダーを作ってみた
英語版しかない、「スライムチャンクファインダー」を作ろうかなーと思ってみた記事。Javaのソースを読んだり、フロントエンドでお絵描きをしたりしないといけないので、技術的難易度は割と高い、自分的にはグッとくる内容
でもきっとアクセス数が多いのはそうでなくて、普通に「スライムチャンクファインダー」を求めてくる人がいるからじゃないかと想像。うーん、まじめに作るか。
2位:マイクラの司書ガチャを、統計的な観点で検証
ワンツーフィニッシュでマイクラ。司書ガチャはみんなやることだと思うけど、それを数千回記録して分析してみた記事。分析だけはできる人はいるだろうけど、記録と分析をできる人はあんまりいないのだろう。記録は、技術と気合いでカバー。
3位:3Dの散布図をさくっと見るツールを作ってみた
AIのコーディングもなく、また私の技術力も低い状態だったので素のJavaScriptでグラフを描いた力作(なつかしい)
3D散布図は、欲しいときは欲しいけど、欲しいケースがほとんどないというニッチだけど濃い要望があるグラフだと思っています。
以下の順位は略だけど、キーワード
動画、開発環境、マイクラ、形態素解析、n8n、React
この辺りが多いでしょうかね。
おわりに
結果は、何となく知ってた、という内容でしたが、思いっきり何かに寄せて書くというのもありかもしれない。飽きっぽい自分にはちょっと向かないか。
APIが公開されていれば、情報はすごく簡単に得られます。AIを使ってコーディングすればもう一瞬でできます。この記事を書いてる時間の方が数倍長いわ。
自分の記事数を知りたい人は、簡単に調べられるので是非どうぞ。
ではよきQiitaライフを!