# プログラミング言語はRubyなのでパソコンにRubyをインストールしてね # このファイルを実行したら youtube-info.csv ってファイルができるからエクセルなどで開いて # タイトル、動画リンク、サムネリンクなどを簡単に表にまとめられるよ # !!注意!!!!!!!!! # このままだと動きません!! # YoutubeAPI を用意する必要があるので # https://hi3103.net/notes/web/1271 # このサイトの手順でAPIっていう英数字の羅列を取得してください。 # その後、下のAPI_KEY = "" の ""の中に入力してください # (例) API_KEY = "ABCDEF123451hW4RU7a0YXMrUUUAAAAqwer_AAAA" API_KEY = "" CHANNEL_ID = "UCi88-cFh7m3FKg3rlkEBv_g" # 投稿者のチャンネルID。デフォルトは尊師のチャンネル MAX_RESULT = 50 require 'net/http' require 'uri' require 'json' require 'csv' require 'pry' require 'time' @video_infos = [] # 引数の日時より前に投稿された動画の情報を取得しハッシュで返す def get_json(published_before) base_url = "https://www.googleapis.com/youtube/v3/search?key=#{API_KEY}&channelId=#{CHANNEL_ID}&part=snippet&order=date&maxResults=#{MAX_RESULT}&publishedBefore=" url = base_url + published_before uri = URI.parse(url) http = Net::HTTP.new(uri.host, uri.port) json = Net::HTTP.get(uri) result = JSON.parse(json) result end def rfc3339_to_date(rfc3339) time = rfc3339.scan(/\d+/) Time.parse("#{time[0]}-#{time[1]}-#{time[2]} #{time[3]}:#{time[4]}:#{time[5]}") end # 一度のリクエストで最大50件しか動画の情報を取得できないので、publishedBefore パラメーターに # 取得した最後の動画の投稿日を代入し、それ以前の動画を50件取得する。これを再帰関数で繰り返す def retrieve_data(published_before) data = get_json(published_before) if data.dig('error', 'errors', 0, 'reason') == 'quotaExceeded' puts "アクセスできる回数を超えています。しばらくしてから試してください" exit end # ベースケースの処理。Youtubeの仕様でresultsPerPageが0になったときが動画を全て取得したときのサイン if data['pageInfo']['resultsPerPage'] == 0 return end data['items'].each do |video| title = video['snippet']['title'] uploader = video['snippet']['channelTitle'] video_id = video['id']['videoId'] video_url = "https://www.youtube.com/watch?v=#{video_id}" thumbnails = video['snippet']['thumbnails']['high']['url'] published_at = video['snippet']['publishedAt'] # video_id.nil? だけなら非公開の動画なのか投稿者の情報なのかがわからない。 if video_id.nil? if video['id']['kind'] == "youtube#video" puts "非公開の動画なのでスキップ" next end if video['id']['kind'] == "youtube#channel" puts "チャンネル情報なのでスキップ" next end end video_info = {title: title, video_url: video_url, thumbnails: thumbnails, published_at: published_at} @video_infos.push(video_info) end oldest_published_at = rfc3339_to_date(@video_infos.last[:published_at]) next_published_at = (oldest_published_at + 1).utc.strftime('%FT%TZ') retrieve_data(next_published_at) end now = Time.now.utc.strftime('%FT%TZ') # 日時のフォーマットはRFC3339形式 retrieve_data(now) CSV.open("youtube-info.csv", "w") do |csv| header = @video_infos[0].keys.map { |k| k.to_s} @video_infos.each do |video_info| csv << video_info.values end end puts "動画情報をCSVでまとめたよ!"