質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

0回答

436閲覧

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

machu1021

総合スコア0

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2022/08/04 07:37

前提

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キーやクライアントシークレットキーは入れてあります。
・エラーが解消できないこととリクエストが送れていないはずなのにレスポンスが返って来ていることが理解できていません。

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問