YouTube Data APIを✅

30日のブシトラさん宅パーティでは「モテスパイラルの体系的な知識」が学べそうで楽しみな23期アルコリズム改良中です。

 

https://www.zeroken.site/

宣伝

ZEROKENをリリースいたしました!

サイトURL

https://www.zeroken.site/

Image from Gyazo

簡単にお酒の強さを測る事ができて、アルハラを予防する事ができるアプリになります!

自分に合ったお酒の飲み方の順番を見つけて自分のペースで飲み会を乗り切ってください!

さて、

年末に下記質問内容を解決できるようなアプリを作りたいと考えています。

質問: ①下記ってそもそも技術的に可能? ◆やりたいこと ⇨python(javaでも)とYouTube Data APIを使って、YouTubeでチャンネル内の動画再生回数が合計100未満のチャンネルをリストアップする

②この流れでやりたいことできそう? 1.YouTubeに存在するチャンネルのIDを条件付きで取得

⇨ 視聴回数100回未満 2.取得したチャンネルIDをリスト化 3.それぞれのチャンネルIDの ・チャンネル名 ・登録者数 ・チャンネルの視聴回数

そのために、ざっくりとYoutube Data APIからデータを取ってくる方法を学習していきたいと思います。友人にかっこいい姿を見せたいという気持ちでがんばります笑

APIとは

application programming interfaceの略。アプリとアプリを繋げる接合部分。

既存のサービスが提供するAPIRailsやLarabelなどのバックエンドフレームワークを使って叩く事が多い。

このAPIを叩くという言葉は厳密にはリクエスレスポンスに分類される。

アプリケーション(ユーザー)が外部API(プロバイダ)に対してデータのリクエスを実行。外部API(プロバイダ)はレスポンスとしてJSONを吐き出す。

Json.perse(response.data)や().to_jsonのようなメソッドを使ってRailsJsonを解析し、フロントで使えるようにしている。

これは20期の青木さんがめちゃくちゃに分かりやすく説明してくれているqiita記事を参考にして理解を深めた。

やっぱり図解されていると分かりやすい。

Youtube Data APIとは

Youtubeで使われているデータを外部アプリで使ってもらうために作られたInterface。

Railsを使ってYoutubeデータにアクセスする事ができるらしい。

簡単な流れは以下の通り

Rails(バックエンド)⇨Youtube Data API ⇨Rails(コントローラー)⇨Viewのscript(フロントエンド)⇨Viewのhtml(フロントエンド)

  1. Rails(バックエンド)⇨Youtube Data API

Railsがリクエストを出している(APIを叩く)

  1. Youtube Data API ⇨Rails(コントローラー)

Youtube Data APIがレスポンス(JSON形式)を返している

  1. Rails(コントローラー)⇨View(フロントエンド)

解析したJSONをrender :jsonなどでフロントエンドフレームワーク(VueやReact)に渡している

  1. Viewのhtml(フロントエンド)

jsで加工したJSONをtemplateタグ内でそれっぽく加工している。

0. APIキーの取得

Youtube Data APIで遊ぶ前に、まずは**認証情報の作成(APIキーの作成)**が必要。下記記事を参考にしてAPIキーを取得していきたい。

【Youtube】APIキーの取得手順(2021/04/08時点のキャプチャ) - Qiita

1. Railsを使ってAPIを叩く

先程APIを叩くとは、RailsAPIプロバイダに対して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回再生されているらしいですね。。

Youtube: APIを使って詳細な検索結果を取得する

他にも絞り込み条件はたくさんあるみたいだから学習して年末には冒頭に記したアプリを作成したいと思う!

  • 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を叩くの楽しそう!!