GPTsでqiitaの記事を取得しラジオとして使う

## はじめに
qiitaの記事を読むのが面倒くさいなとずっと思ってて、実際読んでませんでした。そこで、ニュースラジオとして聞き流せるように、qiitaの記事を取得してくるGPTsを作ったので紹介します。

## 背景
最初は自然言語だけで命令してqiitaから取ってこようと思ってました。
![スクリーンショット (44).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/599d7c9b-0f8b-1c60-cfa4-fb802f955964.png)

これでもある程度良い感じに取ってこれるのですが、日付が実際のものとは異なり、毎日最新情報を得たいニュースラジオとしては欠点でした。
（2024/5/11に実施した。2024/4/22の記事も2022/10/9の記事も、ニュースとして使うには日付が離れすぎている。）
![スクリーンショット (45).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/8c8e2118-1e47-34f4-2929-e2cf8225d924.png)
![スクリーンショット (46).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/8f262026-f6a4-f40e-1213-86f0f4abc16f.png)
![スクリーンショット (47).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/01bcf9db-8492-45b7-7308-544a8693bf1b.png)

何回も試した感じ、qiitaのAPIを使わないと正確な日付は取得できなさそうだったため、今回APIを使った形になります。


## 使い方

#### 使い方の想定
ニュースラジオとして隙間時間に聞き流すのを想定しています。ここで読み上げた記事５つの中から特に興味のあった記事だけ、「記事のリンク」から読みに行くと効率いいなと考えてます。

私にとって便利なものを作ったので、タグ「生成AI」に限定した記事だけを持ってくるようにしています。いいね数などの指定は面倒だったため、何回命令しても「生成AIタグのついた最新記事５つ」だけを毎回取得してくるので、１日１回しか使えない感じになってます。

#### chatGPTウェブ版の場合
「記事を取得」と打ち込めば直近の５つの記事を出してくれてます。その後音声読み上げボタンを押せばラジオとして使えます。
![スクリーンショット (38).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/a79422ac-cdcf-ad55-f64d-36bf91996d36.png)
![スクリーンショット (40).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/a46156eb-a85d-30d7-06a4-ea3fe0c445d7.png)

#### chatGPTアプリ版の場合
右下の音声会話ボタンから「記事を取得」と命令すれば、その後自動でラジオのように読み上げ始めてくれます。「記事を取得」と言ったつもりが「ギジオストク」と聞き取られてますが、まあなんとか動いてくれました。
![Screenshot_20240622-182708.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/5966a0f8-c42c-4a1a-47ed-8ff2844a163c.jpeg)

## 作り方の概要
GPTsのActionsでのAPI連携方法についてはこの記事が参考になると思います。
[【GPTs Actions】GPTsの外部API連携方法](https://qiita.com/eiji-noguchi/items/4d2adb6620b06b72103e)
上の記事で大体の作り方はわかるので、ここでは条件だけを簡単に提示して終わろうと思います。

GPTsの条件はこんな感じ↓
![スクリーンショット (41).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/d660d63a-bdc9-da1b-c993-c4180a5be7c5.png)

スキーマはこんな感じ↓
![スクリーンショット (42).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/8cce86d7-8840-ab19-0770-0ad225bcb7f8.png)

今回は認証なしで取得してきているので１時間に60回という上限があるようです↓
[Qiita の記事一覧 API でも検索クエリに絞り込みオプションが使える](https://qiita.com/yonex/items/d3ade7c1ae9897536b28)

スキーマの詳細↓
```ruby:schema
openapi: 3.1.0
info:
  title: Qiita API
  description: API for accessing Qiita data
  version: 1.0.0
servers:
  - url: https://qiita.com/api/v2
    description: Qiita API v2
paths:
  /tags/{tag_id}/items:
    get:
      operationId: getItemsByTag
      summary: Retrieve items by tag ID
      parameters:
        - name: tag_id
          in: path
          required: true
          schema:
            type: string
          description: ID of the tag
        - name: page
          in: query
          required: false
          schema:
            type: integer
            default: 1
          description: Page number of the results to fetch
        - name: per_page
          in: query
          required: false
          schema:
            type: integer
            default: 20
          description: Number of items per page
      responses:
        '200':
          description: A list of items with the specified tag
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: string
                    title:
                      type: string
                    body:
                      type: string
                    created_at:
                      type: string
                      format: date-time
                    updated_at:
                      type: string
                      format: date-time
                    url:
                      type: string
                      format: uri
        '404':
          description: Not found. The requested resource does not exist.

```

このスキーマを作るのには、ActionsGPTを使いました↓
![スクリーンショット (43).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/ce8cc049-86a7-06b5-df71-0e02875ba71a.png)

## 追記
上記の設定では取得データ量が多く取得失敗することが多かったため、per_page=3にしたり、tag_idの変数をAIに固定してendpointに埋め込んだりしています。

## 展望
タグをユーザー入力により変更できるようにして、AI以外のニュースも取れるようにしたいなと思っています。