Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require 'net/http'
- require 'uri'
- require 'json'
- require 'csv'
- require 'pry'
- require 'time'
- API_KEY = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" # YoutubeDataAPIのAPI_KEY
- CHANNEL_ID = "UCi88-cFh7m3FKg3rlkEBv_g" # 投稿者のチャンネルID
- MAX_RESULT = 50 # 一度に取得できる動画の情報の数は50まで
- @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
- def date_to_rfc3339(date)
- date.utc.strftime('%FT%TZ')
- end
- # 一度のリクエストで最大50件しか動画の情報を取得できないので、publishedBefore パラメーターに
- # 取得した最後の動画の投稿日+1秒を代入し、それ以前の動画を50件取得する。これを再帰関数で繰り返す
- def retrieve_data(published_before)
- data = get_json(published_before)
- if data.dig('error', 'errors', 0, 'reason') == 'quotaExceeded'
- puts "アクセスできる回数を超えています。24時間お待ちください"
- exit
- end
- # ベースケースの処理。Youtubeの仕様でresultsPerPage==0 は動画を全て取得したときのサイン
- if data['pageInfo']['resultsPerPage'] == 0
- puts "動画の情報の収集が完了しました"
- 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']
- 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, uploader: uploader, 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]) # rfc3339はStringなので時間操作するためにTime型に変更
- next_designated_time = date_to_rfc3339(oldest_published_at + 1) # 投稿時間+1秒に指定することで現在の動画を検索結果に含まない
- retrieve_data(next_designated_time)
- end
- now = date_to_rfc3339(Time.now) # 日時のフォーマットはRFC3339形式
- retrieve_data(now)
- File.open("youtube-list.json", "w") do |f|
- JSON.dump(@video_infos, f)
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement