ちょっと試したいことがあり、Qiita API v2 による記事情報の取得に手をつけてみました。
その時に以下の @n0bisuke さんの記事を参考にしつつ実装を試していたら、タグの扱いが(自分が想定していた内容に対して)少しだけ特殊だったので、その対応などに関するメモです。
●Node.js(axios)からQiita APIを利用して指定したユーザーの記事を取得するメモ - Qiita
https://qiita.com/n0bisuke/items/40d0c7831d22c4f1868b
Qiita API v2 で取得できるタグ情報の扱い
タグ情報の仕様
Node.js を用いて Qiita API v2 で取得した記事情報について、タグに関する部分をそのままログ出力すると、以下になりました。
tags: [ [Object], [Object], [Object], [Object], [Object] ],
この部分の仕様は Qiita API v2ドキュメントの「タギング」の項目に書かれていました。
タグで使われている名前だけが得られるのではなく、その名前を格納した部分(name)と合わせて versions という情報もセットになっているようです。
これについて、最近書いていた、ChatGPT API に関する記事 に関する情報取得で、 JSON.stringify() を使って出力し、中身を確かめてみました。実際に出力してみると、仕様のとおの以下が得られました。
これに関して、自分的には、タグに関して得たい出力は以下の形でした。
タグの name の部分のみを配列で取り出す
自分が想定した出力が得られるよう、このタグの name の部分のみを配列で取り出す必要があるため、map() を使って処理してみます。
変更前と変更後は以下のとおりで、 post.tags
を post.tags.map((tag) => tag.name)
にしただけです。
const posts = items.map((post) => {
return {
...
title: post.title,
tags: post.tags,
...
};
});
const posts = items.map((post) => {
return {
...
title: post.title,
tags: post.tags.map((tag) => tag.name),
...
};
});
これで、無事に自分が取得したかった形式で、タグを取り出すことができました。
プログラム全体
プログラムについて、他の部分も含むものを掲載します。
最適限、「Qiita のアクセストークン」と「QiitaのユーザーID」は書きかえが必要なので、ご注意ください。
const axios = require("axios");
const BASE_URL = `https://qiita.com/api/v2`;
const main = async (USREID) => {
const ENDPOINT = `${BASE_URL}/users/${USREID}/items?page=1&per_page=3`; // テスト用に 3記事のみ取得
const res = await axios.get(ENDPOINT, {
headers: {
Authorization: `Bearer <Qiitaのアクセストークン>`, // 要書き換え1
"Content-Type": "application/json",
},
});
const items = res.data;
// 取得するのは「タイトル、作成日、タグ」
const posts = items.map((post) => {
return {
title: post.title,
created_at: post.created_at,
tags: post.tags.map((tag) => tag.name),
};
});
console.log(posts, posts.length);
};
main(`<QiitaのユーザーID>`); // 要書き換え2