YouTube Data API를 사용하여 과거에 사용자가 높은 평가를 받은 동영상 가져오기

【Rails】YouTube Data API를 이용, OAuth2.0의 인증을 사용해 동영상을 취득



루비 버전 2.5.8
Rails version 6.1.1

rails new 를 한 전제로 이야기를 진행합니다. 자신이 이 api를 사용해 인증 기능을 사용해 동영상을 view에 낼 때까지 꽤 고생했기 때문에 남겨 둡니다.

완성 이미지



・과거에 자신의 계정으로 고평가한 동영상을 view에 표시할 수 있다
・view의 디자인은 여러분 적당히 만들어 보세요. 나는 youtube의 디자인으로 파크리했다.


이 기사에는 7단계가 있습니다.



1 API 키 발급



먼저 apikey를 발행합니다.

이름은 무엇이든 좋지만 YouTube 데이터 API v3에서만 애플리케이션 제한을 사용하지 않고 API 제한을 게시합니다.

2 OAuth 2.0 클라이언트 ID 발급



자격 증명 만들기를 클릭하고 API 키 아래에 있는 OAuth 클라이언트 ID를 선택하여 만듭니다.
리디렉션 URI를 채워 둡니다. 승인을 돌파한 후 어떤 페이지로 되돌아갈지입니다.
나는 개발 환경에서 http://localhost:3000/로 해 두었습니다.

3 gem 세트, 컨트롤러 설정


gem 'google-api-client', '0.9.20', require: 'google/apis/youtube_v3'
gem 'googleauth'

bundle install
컨트롤러에 api, json을 사용할 수 있도록 설명
컨트롤러가 늘어나도 번거롭지 않게 ApplicationController에 일단 쓰고 있습니다
class ApplicationController < ActionController::Base
  require 'net/http'
  require 'uri'
  require 'json'
  CLIENT_SECRET = ENV['CLIENT_SECRET']
  @@service = Google::Apis::YoutubeV3::YouTubeService.new
  @@service.key = ENV['GOOGLE_APP_SECRET']
end

여기에서 가이드에 따라 만들어 가자.



4 view에서 OAuth로 인증 보내기


  <%# アカウント認証するとcode発行 %>
  <%= link_to "このボックスをクリックしgoogleアカウントを認証するとアプリが使えます", "https://accounts.google.com/o/oauth2/auth?client_id=あなたのクライアントID&redirect_uri=リダイレクトURI&scope=https://www.googleapis.com/auth/youtube&response_type=code", class:'side-bar-menu__bottom__oauth'%>

auth? 다음에 매개 변수를 연결합니다. scope는 이번 youtube로 움직이기 때문에 불필요한 것은 붙이지 않고 youtube만으로 해 둡니다.

5 code 매개 변수 처리, 액세스 토큰 획득



그리고 승인을 돌파해 오면 code 파라미터를 돌려주므로 액세스 토큰으로 교환하겠습니다.
def get_access_token
    # OAuth 2.0 の承認を突破した段階でurlのcode=~~の部分を取得
    # redirect_codeは後にアクセストークン、更新トークンと交換
    # リクエスト送信に必要なため
    response_hash = URI.decode_www_form(request.fullpath).to_h
    redirect_code = response_hash['/?code']

    # parseでuriを区切れるようになる
    uri = URI.parse('https://accounts.google.com/o/oauth2/token')
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE

    # POST リクエストを https://accounts.google.com/o/oauth2/token に送信
    headers = { 'Contant-Type' => 'application/x-www-form-urlencoded' }
    params = {
      code: "#{redirect_code}",
      client_id:
        'あなたのクライアントID',
      client_secret: "#{CLIENT_SECRET}",
      redirect_uri: '好きなリダイレクト先',
      grant_type: 'authorization_code',
    }
    req = Net::HTTP::Post.new(uri.path)
    req.set_form_data(params)
    req.initialize_http_header(headers)

    # リクエストのレスポンスからトークン取得
    response = http.request(req)
    @access_token = JSON.parse(response.body)['access_token']
    return @access_token
  end

코드는 아래 스크린 샷의 말한대로입니다.
각 키를 params 해시로 사용하여 요청을 보냅니다.


6 YouTube Data API 호출



동영상 가져오기
다양한 파라미터가 제공됩니다.
my_rating 등은 승인된 요청만을 위해 이러한 방식으로 액세스 토큰을 얻고 처리해야 하는 것 같습니다.

※my_rating,max_results는 바꾸기 쉽도록 변수에 넣고 있습니다만 그렇게 하지 않아도 괜찮습니다.

공식적으로 "액세스 토큰을 Authorization: Bearer HTTP 요청 헤더의 값으로 지정합니다. 이는 권장되는 방법입니다."라고 합니다.

※ 또, 나의 경우는 동영상을 조금이라도 랜덤으로 돌려주고 싶었기 때문에 @items 애초에 50그루도 들어오지 않아도 괜찮습니다.
무과금이라면 1일의 요청량이 정해져 있고 나도 제한되는 날이 계속되어 위축되었으므로
 def youtube_data_api
    get_access_token
    if @access_token
      option = { my_rating: 'like', max_results: 50 }
      uri =
        URI.parse(
          "https://www.googleapis.com/youtube/v3/videos?part=snippet&maxResults=#{
            option[:max_results]
          }&myRating=#{option[:my_rating]}",
        )

      https = Net::HTTP.new(uri.host, uri.port)
      https.use_ssl = true
      https.verify_mode = OpenSSL::SSL::VERIFY_NONE

      headers = { 'Authorization' => "Bearer #{@access_token}" }

      # request_uriはyoutube/v3/videos?part=snippet&maxResults=#{option[:max_results]}&myRating=#{option[:my_rating]}を指す
      req = Net::HTTP::Get.new(uri.request_uri)
      req.initialize_http_header(headers)

      # エンコード→操作しやすいようにハッシュに
      response = https.request(req)
      response = response.body.force_encoding('UTF-8')
      response = JSON.parse(response)
      # ランダムに5つの動画を返す
      @items = response['items'].shuffle[0..4]
      return @items
    end
  end

7 응답을 view에 표시


<% @items.each do |i| %>
  <iframe class="youtube__screen-frame" width="889" height="500" src="https://www.youtube.com/embed/<%= i['id'] %>" frameborder="no"allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<% end %>

참고 사이트
data api 공식 (가이드, 참조)
【Ruby on Rails】 가장 이해하기 쉬운 YouTube API 사용법

좋은 웹페이지 즐겨찾기