第1回 YouTube Data APIを用いて指定したYoutubeチャンネルの新着動画一覧を取得する

# 1. はじめに
この記事では、[「OpenAI APIを用いたYouTube動画の要約とNotionへの保存」](https://qiita.com/Shuto050505/items/64a228c315e24d4f6d3b)というテーマに基づいた連載の第一回目として、YouTube Data APIを使用して毎日決まった時間に指定したYouTubeチャンネルから新着動画一覧を取得する方法について説明します。

https://qiita.com/Shuto050505/items/64a228c315e24d4f6d3b

# 2. YouTube Data APIの設定
まずは、YouTube Data APIを使用するための設定を行います。YouTube Data APIは、YouTubeのデータをプログラムから操作するための公式APIです。動画の検索や情報の取得など、さまざまな操作が可能です。

## 2.1. YouTube Data APIキーの取得
YouTube Data APIを使用するには、まずGoogle Cloud PlatformからAPIキーを取得する必要があります。以下にその手順を示します。

1. Google Cloud Consoleにログインします（Googleアカウントが必要です）。
1. 「プロジェクトを選択」をクリックして新しいプロジェクトを作成します。
1. 左側のメニューから「APIとサービス」->「ライブラリ」を選択します。
1. 「YouTube Data API v3」を検索し、ページに移動して「有効にする」をクリックします。
1. 「APIとサービス」->「認証情報」に移動し、「認証情報を作成」->「APIキー」を選択します。
これでAPIキーが生成され、YouTube Data APIを使用する準備が整いました。

**なお、他の有志の方が詳細な情報を掲載しているため、本記事では詳細な方法の説明は省略します。**

詳細な情報は以下の公式のページを参照してください。
https://developers.google.com/youtube/v3/getting-started?hl=ja

## 2.2. 必要なライブラリのインストール
次に、YouTube Data APIを使用するためのPythonライブラリをインストールします。
ここでは、google-api-python-clientをインストールします。

以下のコマンドでライブラリをインストール：

```bash
pip install google-api-python-client
```

## 2.3. APIキーの環境変数登録方法
APIキーを直接コードに記述すると、コードが公開された際にAPIキーが漏洩するリスクがあります。
このリスクを防ぐためには、APIキーを環境変数としてシステムに登録し、コードからはその環境変数を参照するようにします。
※　ここでは、Mac環境でzshを使用している場合の環境変数の設定方法について説明します。

- ターミナルを開き、~/.zshrcファイルを開きます。.zshrcファイルは、zshの設定を記述するためのファイルです。このファイルが存在しない場合は、新たに作成します。以下のコマンドでファイルを開きます。
```bash
vim ~/.zshrc
```
- .zshrcファイルの末尾に以下のようにAPIキーを環境変数として追記します。
    - YOUR_API_KEYの部分は、取得したAPIキーに置き換えてください。
```bash
export YOUTUBE_API_KEY="YOUR_API_KEY"
```
保存してファイルを閉じ、ターミナルを閉じます。

- 新たにターミナルを開き、以下のコマンドを実行して、環境変数が正しく設定されたことを確認します。

```bash
echo $YOUTUBE_API_KEY
```

これで、YOUTUBE_API_KEYという名前の環境変数としてAPIキーがシステムに登録されました。
Pythonのコードからこの環境変数を参照するには、以下のように `os.environ` を使用します。

```python
import os
api_key = os.environ["YOUTUBE_API_KEY"]
```

この方法を使用すると、APIキーを安全に管理し、コードからも容易に参照することができます。

これで、YouTube Data APIの基本的な設定が完了しました。
次のセクションでは、実際にAPIを使用して特定のYouTubeチャンネルから新着動画を取得する方法について解説します。

# 3. チャンネルIDの調べ方について

YouTube Data APIを使用して特定のYouTubeチャンネルから新着動画の情報を取得するためには、そのチャンネルのIDが必要になります。
ここでは、チャンネルIDを調べる2つの方法を紹介します。

## 3.1. 有志の人が作成したサービスを利用する
YouTubeチャンネルIDを調べるためのWebサイトがいくつか存在します。
例えば下記サイトを利用することで、簡単に調べられます。

https://ilr.jp/tech/485/

## 3.2. YouTube Data APIを使用する
もう1つの方法は、YouTube Data APIを使用してチャンネルIDを取得する方法です。
これには、そのチャンネルの任意の動画のID(動画URLのXXXの箇所)が必要になります。

```
https://www.youtube.com/watch?v=XXXXXXXXXXX　←　VideoID
```

* YouTube Data APIの`videos().list()`メソッドを使用します。このメソッドには、part引数に`snippet`を、id引数に動画のIDを指定します。
* レスポンスからチャンネルIDを取得します。レスポンスの`items`リストの最初の要素の`snippet`フィールドの`channelId`フィールドにチャンネルIDが含まれています。
```python
from googleapiclient.discovery import build

video_id = "XXXXXXXX"

developerKey = os.getenv("YOUTUBE_API_KEY")
youtube = build("youtube", "v3", developerKey=developerKey)

response = youtube.videos().list(
    part="snippet",
    id=video_id
).execute()

channel_id = response["items"][0]["snippet"]["channelId"]

print(video_id)
```

# 4. 指定したチャンネルから新着動画を取得する

指定したチャンネルから新着動画のリストを取得する `get_new_youtube_video_list` 関数について詳しく解説します。

```python
def get_new_youtube_video_list(channel_id, developerKey):
    time_threshold = datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(days=1)
    time_threshold = time_threshold.isoformat()
    
    video_id_list = []
    youtube = build("youtube", "v3", developerKey=developerKey)

    response = youtube.search().list(
        part = "snippet",
        channelId = channel_id,
        maxResults = 10, 
        order = "date", 
        publishedAfter=time_threshold,
        type="video"
    ).execute()

    for item in response["items"]:
        video_id_list.append(item["id"]["videoId"])
    return video_id_list
```

## 4.1. time_thresholdの設定
まず、関数内でtime_thresholdという変数を設定しています。これは昨日の日付をUTC形式で取得しています。このtime_thresholdは、YouTube Data APIのリクエストで使用され、過去1日間にアップロードされた動画のみを取得します。

```python
time_threshold = datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(days=1)
time_threshold = time_threshold.isoformat()
```

## 4.2. YouTube APIクライアントの生成
次に、build関数を使用してYouTube Data APIのクライアントを生成します。
`developerKey`には、取得したYouTube Data APIキーを指定します。
このクライアントを使用して、YouTubeのデータにアクセスします。

```python
youtube = build("youtube", "v3", developerKey=developerKey)
```

## 4.3. 動画一覧の取得
APIクライントを使用して、指定したチャンネルから新着動画の一覧を取得します。このリクエストでは、`part`に"snippet"を、`channelId`に指定したチャンネルIDを、`maxResults`に取得する動画の最大数を、`order`に結果のソート順を、`publishedAfter`に取得する動画のアップロード日時の下限を、`type`に取得するデータの種類を指定します。

```python
response = youtube.search().list(
    part = "snippet",
    channelId = channel_id,
    maxResults = 10,　# 最大取得数
    order = "date", #日付順にソート
    publishedAfter=time_threshold, # いつ以降の取得を取得するか
    type="video"
).execute()
```

## 4.4. 動画IDリストの取得
最後に、取得した動画一覧から各動画のIDを取得し、それを　`video_id_list` に保存します。

```python
for item in response["items"]:
    video_id_list.append(item["id"]["videoId"])
```

これらのステップを経て、指定したチャンネルから新着動画のリストを取得することができます。
取得した動画のリストは、後続の処理で使用します。

# 5. まとめと次のステップ
本記事では、YouTube Data APIを使用した指定したYouTubeチャンネルから新着動画の一覧を取得する方法について説明しました。

次回の記事では、動画の字幕を取得する方法について詳しく解説します。
このプロセスでは、YouTube Data APIをさらに活用し、動画の字幕を取得し、それをテキスト形式で保存します。この字幕のテキストは、OpenAI APIを使用して要約するための入力となります。

次回もお楽しみに！