YouTubeAPIを叩く

# ザックリ開発することになった経緯
- 知り合いからYouTubeの情報を集めたいと依頼がくる
- 暇だったんで話を聞いてみる（面白そうなので無償で引き受けることに）
- 仕様：以下のデータをチャンネルごとにまとめて出力
  - チャンネル名
  - チャンネル作製日（年月日）
  - チャンネル登録者数
  - アップロードした動画、配信の数
  - 過去最新10件の（動画、アーカイブ、ショート）平均再生数
 - 作ったシステムは自由に動かしていい

特に開発環境の指定が無かったので、GASで実装していくことにしました。
理由はデータの入出力が楽だからです。

# 今回の仕様
1. スプレッドシートから検索対象になるチャンネルIDを取得
1. チャンネルIDからチャンネルデータを取得
1. 対象チャンネルのアップロードリストを取得
1. アップロードリストから10件分の動画データを取得
1. スプレッドシートに出力

対象チャンネルの過去10件分の平均再生数取得がちょっと大変でした。
YouTubeAPIには、そのような機能はなかったので。
なので、2～4の工程を行う必要があったんですね。

# チャンネルデータの取得
チャンネルデータは以下のリクエストを叩いて取得します。
[チャンネルリスト取得: https://www.googleapis.com/youtube/v3/channels](https://developers.google.com/youtube/v3/docs/channels/list?hl=ja&apix=true#try-it)

こちらGetパラメータにチャンネルIDが必要なのですが
**「チャンネルIDってどれよ？」** ってなりますよね。

**チャンネルIDはchannel/以降にあります。
（画像だと「UCZf__ehlCEBPop-_sldpBUQ」）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870946/3d723014-678c-b161-b4b9-af47ad385969.png)

コレが全部、共通表示だと嬉しいのですが…
チャンネルによってはチャンネルIDが乗ってない場合があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870946/c1163c71-7df6-03a4-0553-f230680d669b.png)
そんなときは、**投稿動画を開いてchannelIDを探します。**
ディベロッパーツールを開いて「channelId」を検索します。
（contentがチャンネルIDとなります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870946/5034e7ef-2b2b-2a77-c636-bbbee0f9f7e7.png)
では、APIを叩きましょう。
以下がパラメータを指定してAPIを叩く処理になります。

```.js
//gas
let url = "https://www.googleapis.com/youtube/v3/channels";
url += "?part=snippet,statistics,contentDetails";
url += "&id="+id;
url += "&key="+apiKey;

//APIを叩く
const response = UrlFetchApp.fetch(url);
//レスポンス
const json = JSON.parse(response);

//今回、必要になるデータ
console.log("チャンネル名:"+json.items[0].snippet.title);
console.log("チャンネル作製日:"+json.items[0].snippet.publishedAt);
console.log("チャンネル登録者数:"+json.items[0].statistics.subscriberCount);
console.log("アップロードした動画の数"+json.items[0].statistics.videoCount);

console.log("アップロードプレイリストID:"+json.items[0].contentDetails.relatedPlaylists.uploads);
```

文字列を連結して渡してる簡単な操作ですね。
partパラメータはチャンネルリソースを指定してます。
今回の例でいうところのitems[0]以降のものですね。

アップロードプレイリストIDが取得できたので、こちらを使って
過去10件分の動画IDを取得していきます。

# プレイリストから動画IDを取得
プレイリストのデータは以下のリクエストを叩いて取得します。
[プレイリスト取得: https://www.googleapis.com/youtube/v3/playlists](https://developers.google.com/youtube/v3/docs/playlists/list?hl=ja)

では、APIを叩きましょう。
以下がパラメータを指定してAPIを叩く処理になります。

```.js
//gas
let url = "https://www.googleapis.com/youtube/v3/playlistItems";
url += "?part=snippet";
url += "&playlistId=" + id;
url += "&maxResults=" + limit;
url += "&key="+apiKey;

//APIを叩く
const response = UrlFetchApp.fetch(url);
//レスポンス
const json = JSON.parse(response);

//今回、必要なデータ(動画ID)
json.items[i].snippet.resourceId.videoId
```

maxResultsパラメータは最大50まで指定できます。
動画IDが取れましたので、それぞれ再生数を取得します。

# 動画情報の取得
動画のデータは以下のリクエストを叩いて取得します。
[動画データの取得: https://www.googleapis.com/youtube/v3/videos](https://developers.google.com/youtube/v3/docs/videos/list?hl=ja)

では、APIを叩きましょう。
以下がパラメータを指定してAPIを叩く処理になります。

```.js
//gas
let url = "https://www.googleapis.com/youtube/v3/videos";
url += "?part=snippet,statistics";
url += "&key="+apiKey;
url += "&id=" 

//idを入れ込む(カンマ区切り)
for(let i=0; i<ids.length; i++){
  url += ids[i];
  if(i<ids.length-1){
    url += ",";
  }
}

//APIを叩く
const response = UrlFetchApp.fetch(url);
//レスポンス
const json = JSON.parse(response);

//今回、必要なデータ(再生数)
Number(json.items[i].statistics.viewCount);
```

idパラメータはカンマ区切りで複数指定できます。
コレで必要なデータは全て取得できました。
後は加工してスプレッドシートに書き込むだけです。

実際にシステムを動かすと、仕様に沿ったデータを出力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870946/07bb0493-190c-e1a6-7718-b9fe758f8b8e.png)
以上！
質問、依頼等がありましたらTwitterにてお話、聞きます。
[Twitter: Don't Pray Debug](https://twitter.com/DebugDon)