2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

QiitaAPIAdvent Calendar 2024

Day 14

ChatGPTはQiitaAPIを知っているか?

Last updated at Posted at 2024-12-20

はじめに

この記事は、QiitaAPI Advent Calendar 2024の14日目の記事となります。

アドベントカレンダのリストを見ていて、今、QiitaAPIに辿り着いた者の記録です。

ChatGPTはQiitaAPIを知っているか

ChatGPT先生に聞いてみる。

スクリーンショット 2024-12-20 14.12.01.png
スクリーンショット 2024-12-20 14.12.16.png
スクリーンショット 2024-12-20 14.12.31.png

なるほど。
アクセストークンはここから発行できるみたいだ。

スクリーンショット 2024-12-20 14.16.46.png
スクリーンショット 2024-12-20 14.17.02.png

アプリを作ってもらう

知っているのなら、ChatGPT先生にアプリを作ってもらおう。

スクリーンショット 2024-12-20 14.12.39.png
スクリーンショット 2024-12-20 14.12.47.png
スクリーンショット 2024-12-20 14.12.57.png
スクリーンショット 2024-12-20 14.13.05.png
スクリーンショット 2024-12-20 14.13.14.png
スクリーンショット 2024-12-20 14.13.23.png
スクリーンショット 2024-12-20 14.13.31.png
スクリーンショット 2024-12-20 14.13.39.png

「コードスニペット共有アプリ」は面白いかも。
複数の記事で同じようなコードスニペットが使われているものをランキングしてくれるのは欲しいかも。

ただ今日は基本的な作り方を知りたいので単純なものをリクエストしてみよう。

スクリーンショット 2024-12-20 14.13.46.png
スクリーンショット 2024-12-20 14.13.53.png
スクリーンショット 2024-12-20 14.14.02.png

1.js
const fetchTopArticle = async () => {
  const res = await fetch('https://qiita.com/api/v2/items?page=1&per_page=100', {
    headers: { Authorization: 'Bearer YOUR_ACCESS_TOKEN' }
  });
  const articles = await res.json();
  const topArticle = articles.sort((a, b) => b.likes_count - a.likes_count)[0];
  console.log(`今日の注目記事: ${topArticle.title} - ${topArticle.url}`);
};
fetchTopArticle();

スクリーンショット 2024-12-20 14.23.30.png

2.js
const fetchRandomArticleByTag = async (tag) => {
  const res = await fetch(`https://qiita.com/api/v2/tags/${tag}/items?per_page=10`, {
    headers: { Authorization: 'Bearer YOUR_ACCESS_TOKEN' }
  });
  const articles = await res.json();
  const randomArticle = articles[Math.floor(Math.random() * articles.length)];
  console.log(`ランダム記事: ${randomArticle.title} - ${randomArticle.url}`);
};
fetchRandomArticleByTag('JavaScript');

スクリーンショット 2024-12-20 14.24.21.png

3.js
const fetchMyLatestPosts = async () => {
  const res = await fetch('https://qiita.com/api/v2/authenticated_user/items?per_page=5', {
    headers: { Authorization: 'Bearer YOUR_ACCESS_TOKEN' }
  });
  const myPosts = await res.json();
  myPosts.forEach(post => console.log(`${post.title} - ${post.url}`));
};
fetchMyLatestPosts();

スクリーンショット 2024-12-20 14.25.04.png

4.js
const fetchPopularTags = async () => {
  const res = await fetch('https://qiita.com/api/v2/tags?sort=count&per_page=10');
  const tags = await res.json();
  tags.forEach(tag => console.log(`${tag.id} (${tag.items_count} articles)`));
};
fetchPopularTags();

スクリーンショット 2024-12-20 14.26.18.png

5.js
const fetchUserFollowers = async (userId) => {
  const res = await fetch(`https://qiita.com/api/v2/users/${userId}`);
  const user = await res.json();
  console.log(`${userId} のフォロワー数: ${user.followers_count}`);
};
fetchUserFollowers('example_user');

スクリーンショット 2024-12-20 14.27.14.png

いいねいいね。動くんかな?
どれにしようかな・・。
選べるようにしてもらおう!

スクリーンショット 2024-12-20 14.28.51.png

スクリーンショット 2024-12-20 14.29.27.png

qiita_app.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Qiita API サンプル</title>
</head>
<body>
  <h1>Qiita API 実行アプリ</h1>
  <p>以下から選択してください:</p>
  <button onclick="executeFunction(1)">1. 今日の注目記事</button>
  <button onclick="executeFunction(2)">2. タグ別ランダム記事</button>
  <button onclick="executeFunction(3)">3. 自分の最新投稿</button>
  <button onclick="executeFunction(4)">4. 人気タグ表示</button>
  <button onclick="executeFunction(5)">5. ユーザーのフォロワー数</button>
  
  <div id="output" style="margin-top: 20px; padding: 10px; border: 1px solid #ccc;">
    <strong>結果:</strong>
    <p id="result"></p>
  </div>

  <script>
    const accessToken = "YOUR_ACCESS_TOKEN"; // ここにQiitaのアクセストークンを入力

    async function executeFunction(choice) {
      const output = document.getElementById("result");
      output.textContent = "実行中...";
      
      try {
        switch (choice) {
          case 1:
            await fetchTopArticle(output);
            break;
          case 2:
            const tag = prompt("タグを入力してください(例: JavaScript):");
            if (tag) await fetchRandomArticleByTag(tag, output);
            break;
          case 3:
            await fetchMyLatestPosts(output);
            break;
          case 4:
            await fetchPopularTags(output);
            break;
          case 5:
            const userId = prompt("ユーザーIDを入力してください(例: example_user):");
            if (userId) await fetchUserFollowers(userId, output);
            break;
          default:
            output.textContent = "無効な選択です。";
        }
      } catch (error) {
        output.textContent = `エラーが発生しました: ${error.message}`;
      }
    }

    async function fetchTopArticle(output) {
      const res = await fetch('https://qiita.com/api/v2/items?page=1&per_page=100', {
        headers: { Authorization: `Bearer ${accessToken}` }
      });
      const articles = await res.json();
      const topArticle = articles.sort((a, b) => b.likes_count - a.likes_count)[0];
      output.textContent = `今日の注目記事: ${topArticle.title} - ${topArticle.url}`;
    }

    async function fetchRandomArticleByTag(tag, output) {
      const res = await fetch(`https://qiita.com/api/v2/tags/${tag}/items?per_page=10`, {
        headers: { Authorization: `Bearer ${accessToken}` }
      });
      const articles = await res.json();
      const randomArticle = articles[Math.floor(Math.random() * articles.length)];
      output.textContent = `ランダム記事: ${randomArticle.title} - ${randomArticle.url}`;
    }

    async function fetchMyLatestPosts(output) {
      const res = await fetch('https://qiita.com/api/v2/authenticated_user/items?per_page=5', {
        headers: { Authorization: `Bearer ${accessToken}` }
      });
      const myPosts = await res.json();
      output.textContent = "最新投稿:\n" + myPosts.map(post => `${post.title} - ${post.url}`).join("\n");
    }

    async function fetchPopularTags(output) {
      const res = await fetch('https://qiita.com/api/v2/tags?sort=count&per_page=10');
      const tags = await res.json();
      output.textContent = "人気タグ:\n" + tags.map(tag => `${tag.id} (${tag.items_count} articles)`).join("\n");
    }

    async function fetchUserFollowers(userId, output) {
      const res = await fetch(`https://qiita.com/api/v2/users/${userId}`);
      const user = await res.json();
      output.textContent = `${userId} のフォロワー数: ${user.followers_count}`;
    }
  </script>
</body>
</html>

スクリーンショット 2024-12-20 14.30.29.png

ブラウザでこのhtmlファイルを開いてみよう。

スクリーンショット 2024-12-20 14.32.16.png

いい感じ。1を押してみる。

スクリーンショット 2024-12-20 14.33.11.png

おお、表示された。
2を押してみる。

スクリーンショット 2024-12-20 14.35.10.png

QiitaAPIのランダム記事をリクエストしてみよう。

スクリーンショット 2024-12-20 14.35.58.png

グッドグッド。
3を押してみる。

スクリーンショット 2024-12-20 14.36.54.png

改行位置の調整は必要そうだが、情報はちゃんと取れている様子。
4を押してみる。
スクリーンショット 2024-12-20 14.37.56.png

良さげ。Python強いな。
5を押してみる。
スクリーンショット 2024-12-20 14.40.32.png
ユーザー Qiitaのフォロアー数を見てみよう。
スクリーンショット 2024-12-20 14.40.47.png

60万人??

スクリーンショット 2024-12-20 14.45.17.png

445565人となっているが?

試しに

output.textContent = `${userId} のフォロワー数: ${user.followers_count}`;

output.textContent = `${userId} のフォロワー数: ${user.description}`;

に変えると、下記のように正しく表示されるから、ChatGPT先生のコードは間違っていないと思われるのですが・・。

スクリーンショット 2024-12-20 14.56.34.png

15万人どこ行ったの?? んーミステリー。

というわけで、ChatGPTはQiitaAPIを知っていました。そして闇をあばこ・・・・。

最後までご覧いただきありがとうございました。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?