YouTube Data APIを✅
30日のブシトラさん宅パーティでは「モテスパイラルの体系的な知識」が学べそうで楽しみな23期アルコリズム改良中です。
宣伝
ZEROKENをリリースいたしました!
サイトURL
簡単にお酒の強さを測る事ができて、アルハラを予防する事ができるアプリになります!
自分に合ったお酒の飲み方の順番を見つけて自分のペースで飲み会を乗り切ってください!
さて、
年末に下記質問内容を解決できるようなアプリを作りたいと考えています。
質問: ①下記ってそもそも技術的に可能? ◆やりたいこと ⇨python(javaでも)とYouTube Data APIを使って、YouTubeでチャンネル内の動画再生回数が合計100未満のチャンネルをリストアップする
②この流れでやりたいことできそう? 1.YouTubeに存在するチャンネルのIDを条件付きで取得
⇨ 視聴回数100回未満 2.取得したチャンネルIDをリスト化 3.それぞれのチャンネルIDの ・チャンネル名 ・登録者数 ・チャンネルの視聴回数
そのために、ざっくりとYoutube Data APIからデータを取ってくる方法を学習していきたいと思います。友人にかっこいい姿を見せたいという気持ちでがんばります笑
APIとは
application programming interfaceの略。アプリとアプリを繋げる接合部分。
既存のサービスが提供するAPIをRailsやLarabelなどのバックエンドフレームワークを使って叩く事が多い。
このAPIを叩くという言葉は厳密にはリクエストとレスポンスに分類される。
アプリケーション(ユーザー)が外部API(プロバイダ)に対してデータのリクエストを実行。外部API(プロバイダ)はレスポンスとしてJSONを吐き出す。
Json.perse(response.data)や().to_jsonのようなメソッドを使ってRailsがJsonを解析し、フロントで使えるようにしている。
これは20期の青木さんがめちゃくちゃに分かりやすく説明してくれているqiita記事を参考にして理解を深めた。
やっぱり図解されていると分かりやすい。
Youtube Data APIとは
Youtubeで使われているデータを外部アプリで使ってもらうために作られたInterface。
Railsを使ってYoutubeデータにアクセスする事ができるらしい。
簡単な流れは以下の通り
Rails(バックエンド)⇨Youtube Data API ⇨Rails(コントローラー)⇨Viewのscript(フロントエンド)⇨Viewのhtml(フロントエンド)
Youtube Data APIがレスポンス(JSON形式)を返している
- Rails(コントローラー)⇨View(フロントエンド)
解析したJSONをrender :jsonなどでフロントエンドフレームワーク(VueやReact)に渡している
- Viewのhtml(フロントエンド)
jsで加工したJSONをtemplateタグ内でそれっぽく加工している。
0. APIキーの取得
Youtube Data APIで遊ぶ前に、まずは**認証情報の作成(APIキーの作成)**が必要。下記記事を参考にしてAPIキーを取得していきたい。
【Youtube】APIキーの取得手順(2021/04/08時点のキャプチャ) - Qiita
1. Railsを使ってAPIを叩く
先程APIを叩くとは、RailsがAPIプロバイダに対してHTTPリクエストを出すことと述べさせていただいた。
Youtube Data APIはエンドポイントを多く提供している。
- Cannnels:
GET [<https://www.googleapis.com/youtube/v3/channels>](<https://www.googleapis.com/youtube/v3/channels>)
ユーチューバーのチャンネルデータを取得できる
- Videos
GET <https://www.googleapis.com/youtube/v3/videos
>
YouTubeに上がっている動画を取得する事ができる
- Activities
POST <https://www.googleapis.com/youtube/v3/activities
>
Youtubeのアクティビティデータを取得する事ができる。
Railsの設計
現段階だと全然わからないが、完成形は以下のような形になる事が想定される。
#!/usr/bin/ruby
require 'rubygems'
gem 'google-api-client', '>0.7'
require 'google/api_client'
require 'google/api_client/client_secrets'
require 'google/api_client/auth/file_storage'
require 'google/api_client/auth/installed_app'
require 'trollop'
# This OAuth 2.0 access scope allows for full read/write access to the
# authenticated user's account.
YOUTUBE_SCOPE = '<https://www.googleapis.com/auth/youtube>'
YOUTUBE_API_SERVICE_NAME = 'youtube'
YOUTUBE_API_VERSION = 'v3'
def get_authenticated_service
client = Google::APIClient.new(
:application_name => $PROGRAM_NAME,
:application_version => '1.0.0'
)
youtube = client.discovered_api(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION)
file_storage = Google::APIClient::FileStorage.new("#{$PROGRAM_NAME}-oauth2.json")
if file_storage.authorization.nil?
client_secrets = Google::APIClient::ClientSecrets.load
flow = Google::APIClient::InstalledAppFlow.new(
:client_id => client_secrets.client_id,
:client_secret => client_secrets.client_secret,
:scope => [YOUTUBE_SCOPE]
)
client.authorization = flow.authorize(file_storage)
else
client.authorization = file_storage.authorization
end
return client, youtube
end
def main
opts = Trollop::options do
opt :message, 'Required text of message to post.', :type => String
opt :video_id, 'Optional ID of video to post.', :type => String
opt :playlist_id, 'Optional ID of playlist to post.', :type => String
end
# You can post a message with or without an accompanying video or playlist.
# However, you can't post a video and a playlist at the same time.
if opts[:video_id] and opts[:playlist_id]
Trollop::die 'You cannot post a video and a playlist at the same time'
end
Trollop::die :message, 'is required' unless opts[:message]
client, youtube = get_authenticated_service
begin
body = {
:snippet => {
:description => opts[:message]
}
}
if opts[:video_id]
body[:contentDetails] = {
:bulletin => {
:resourceId => {
:kind => 'youtube#video',
:videoId => opts[:video_id]
}
}
}
end
if opts[:playlist_id]
body[:contentDetails] = {
:bulletin => {
:resourceId => {
:kind => 'youtube#playlist',
:playlistId => opts[:playlist_id]
}
}
}
end
# Call the youtube.activities.insert method to post the channel bulletin.
client.execute!(
:api_method => youtube.activities.insert,
:parameters => {
:part => body.keys.join(',')
},
:body_object => body
)
puts "The bulletin was posted to your channel."
rescue Google::APIClient::TransmissionError => e
puts e.result.body
end
end
main
Implementation: Videos | YouTube Data API | Google Developers
【Ruby on Rails】最もわかりやすいYouTube API 使い方 - Qiita
2. JSONの加工
レスポンスを加工していく必要がある。
1でVideosエンドポイントを利用し、コントローラーの作成に成功したと仮定する。
その状況下でAPIを叩くことに成功した場合に返ってくるJSONの例は下記の通り。
API レスポンス:
{
"kind": "youtube#videoListResponse",
"etag": "\\"UCBpFjp2h75_b92t44sqraUcyu0/sDAlsG9NGKfr6v5AlPZKSEZdtqA\\"",
"videos": [
{
"id": "7lCDEYXw3mM",
"kind": "youtube#video",
"etag": "\\"UCBpFjp2h75_b92t44sqraUcyu0/iYynQR8AtacsFUwWmrVaw4Smb_Q\\"",
"snippet": {
"publishedAt": "2012-06-20T22:45:24.000Z",
"channelId": "UC_x5XG1OV2P6uZZ5FSM9Ttw",
"title": "Google I/O 101: Q&A On Using Google APIs",
"description": "Antonio Fuentes speaks to us and takes questions on working with Google APIs and OAuth 2.0.",
"thumbnails": {
"default": {
"url": "<https://i.ytimg.com/vi/7lCDEYXw3mM/default.jpg>"
},
"medium": {
"url": "<https://i.ytimg.com/vi/7lCDEYXw3mM/mqdefault.jpg>"
},
"high": {
"url": "<https://i.ytimg.com/vi/7lCDEYXw3mM/hqdefault.jpg>"
}
},
"categoryId": "28"
},
"contentDetails": {
"duration": "PT15M51S",
"aspectRatio": "RATIO_16_9"
},
"statistics": {
"viewCount": "3057",
"likeCount": "25",
"dislikeCount": "0",
"favoriteCount": "17",
"commentCount": "12"
},
"status": {
"uploadStatus": "STATUS_PROCESSED",
"privacyStatus": "PRIVACY_PUBLIC"
}
}
]
}
波括弧にたくさんネストされてわけわからなくなってますね。
【Python】YouTube APIを使った「再生順、更新順(再生数下限あり)」動画リスト取得(コピペでOK) - Qiita
3. 検索結果を絞る
先程2で取得したレスポンスデータを加工するには、下記のように記述する必要がある。
const responsData = { #レスポンスデータをresponsDataとして定義。
"kind": "youtube#videoListResponse",
"etag": "\\"UCBpFjp2h75_b92t44sqraUcyu0/sDAlsG9NGKfr6v5AlPZKSEZdtqA\\"",
"videos": [
{
"id": "7lCDEYXw3mM",
"kind": "youtube#video",
"etag": "\\"UCBpFjp2h75_b92t44sqraUcyu0/iYynQR8AtacsFUwWmrVaw4Smb_Q\\"",
"snippet": {
"publishedAt": "2012-06-20T22:45:24.000Z",
"channelId": "UC_x5XG1OV2P6uZZ5FSM9Ttw",
"title": "Google I/O 101: Q&A On Using Google APIs",
"description": "Antonio Fuentes speaks to us and takes questions on working with Google APIs and OAuth 2.0.",
"thumbnails": {
"default": {
"url": "<https://i.ytimg.com/vi/7lCDEYXw3mM/default.jpg>"
},
"medium": {
"url": "<https://i.ytimg.com/vi/7lCDEYXw3mM/mqdefault.jpg>"
},
"high": {
"url": "<https://i.ytimg.com/vi/7lCDEYXw3mM/hqdefault.jpg>"
}
},
"categoryId": "28"
},
"contentDetails": {
"duration": "PT15M51S",
"aspectRatio": "RATIO_16_9"
},
"statistics": {
"viewCount": "3057",
"likeCount": "25",
"dislikeCount": "0",
"favoriteCount": "17",
"commentCount": "12"
},
"status": {
"uploadStatus": "STATUS_PROCESSED",
"privacyStatus": "PRIVACY_PUBLIC"
}
}
]
}
#視聴数をyoutubeViewDataとして定義
const youtubeViewData = responsData["videos"][0]["statistics"]["viewCount"]
console.log( responsData["kind"])
console.log(youtubeViewData )
#expected output
> "youtube#videoListResponse"
> "3057"
どうやらこの動画は3057回再生されているらしいですね。。
他にも絞り込み条件はたくさんあるみたいだから学習して年末には冒頭に記したアプリを作成したいと思う!
date
– リソースを作成日の新しい順に並べます。rating
– リソースを評価の高い順に並べます。relevance
– リソースを検索クエリの関連性が高い順に並べます。このパラメータのデフォルト値です。title
– リソースをタイトルのアルファベット順に並べます。videoCount
– アップロード動画の番号順(降順)にチャンネルを並べます。viewCount
– リソースを再生回数の多い順に並べます。
この、viewCountを絞り込み条件にする。
チャンネルに関するAPI
Channels: list | YouTube Data API | Google Developers
Channels | YouTube Data API | Google Developers
statistics.viewCount
unsigned long
statistics.subscriberCount
unsigned long
チャンネルの登録者数。
statistics.hiddenSubscriberCount
boolean
チャンネル登録者数を公開表示するかどうかを指定します。
statistics.videoCount
unsigned long
チャンネルにアップロードされた動画の数。
Search: list | YouTube Data API | Google Developers
api-samples/ruby at master · youtube/api-samples
一言
APIを叩くの楽しそう!!