# プログラミング言語は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でまとめたよ!"