youtubeAPIを使用して自身で高評価をした動画を取得する

前提

Ruby on Railsを使用して、youtubeの自分が高評価した動画の取得を試みているのですがターミナル上でエラーが出ていて解決できません。

実現したいこと

動画のidを取得してブラウザに高評価した動画を表示させること。

発生している問題・エラーメッセージ

エラーメッセージ #<Net::HTTPBadRequest 400 Bad Request readbody=true> {"error"=>"invalid_request", "error_description"=>"Missing required parameter: code"}

該当のソースコード

application_controller class ApplicationController < ActionController::Base require 'net/http' require 'uri' # require 'json' CLIENT_SECRET = Rails.application.credentials.client_secret[:client_secret_key] @service = Google::Apis::YoutubeV3::YouTubeService.new @service.key = Rails.application.credentials.google1[:api_key1] end

該当のソースコード

controller #リダイレクト先でアクセストークンを取得 def get_access_token @response_hash = URI.decode_www_form(request.fullpath).to_h @redirect_code = @response_hash['/token?code'] 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 headers = { 'Content-Type' => 'application/x-www-form-urlencoded' } params = { code: "#{@redirect_code}", client_id: "クライアントID", client_secret: "#{CLIENT_SECRET}", redirect_uri: "http://localhost:3000/token", 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) end

該当のソースコード

controller APIの呼び出し def youtube_iine @access_token = "上記のコードで取得したアクセストークン" uri = URI.parse( "https://www.googleapis.com/youtube/v3/videos?part=snippet &maxResults &myRating=like", ) https = Net::HTTP.new(uri.host, uri.port) https.use_ssl = true https.verify_mode = OpenSSL::SSL::VERIFY_NONE headers = { 'Authorization' => "Bearer #{@access_token}" } req = Net::HTTP::Get.new(uri.request_uri) req.initialize_http_header(headers) @response = https.request(req) @response1 = @response.body.force_encoding('UTF-8') @response2 = JSON.parse(@response1) @items = @response2 end

該当のソースコード

get_access_tokenのview <%= link_to '動画に高評価をつけます。', youtube_iine_path %> <%= link_to 'OAuth認証', 'https://accounts.google.com/o/oauth2/auth? client_id=取得したクライアントID& redirect_uri=http://localhost:3000/token& scope=https://www.googleapis.com/auth/youtube& response_type=code& access_type=offline' %>

該当のソースコード

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

試したこと

・まず適当に作成したviewからget_access_tokenのviewに画面遷移してcontrollerを動かしています。

・次にget_access_tokenからOAuth認証をするためのリンクでアクセストークンを取得するようにしてリダイレクト先は同じviewに返しています。

・アクセストークンを取得した後にget_access_tokenに配置してあるパスでyoutube_iineの画面に遷移させています。

・そこでAPIの呼び出しを動かす処理を走らせています。

・どうしてもAPIの呼び出しの際に取得したアクセストークンをyoutube_iineのアクションで使うやり方がわからなかったので、アクセストークンを取得した際にコードに直接アクセストークンを打ち込んでいます。

・この状態で高評価をした動画の取得をしようとするとターミナルでエラーが起きますが、レスポンスとして高評価をした動画の情報が@itemsのインスタンス変数の中に入っています。

・リクエストができていないというエラーなのになぜレスポンスとして帰ってきているのかが検討がつきません。

補足情報

・コードの書き方などは初心者なので上手には書けていません。
・色々不甲斐ない部分が多々あるかと思います。
・環境変数にAPIキーやクライアントシークレットキーは入れてあります。
・エラーが解消できないこととリクエストが送れていないはずなのにレスポンスが返って来ていることが理解できていません。

・必要な情報は思いつく限り記入していますが足りない場合は追加記述します。
・どうかご教示お願いいたします。

コメントを投稿

0 コメント