Ruby on Railsでニコニコ動画のコンテンツ検索APIを使用して、動画の検索を行う
- 2019.08.03
- Rails

今回はニコニコ動画のapiをRubyで使用する方法について紹介します。
※下記でYoutubeやDailymotionのAPIについても紹介しています
Ruby on RailsでYouTube Data API (v3)を使用して、動画の検索を行う
Ruby on RailsでDailymotionのAPIを使用して、動画の検索を行う
niconico コンテンツ検索APIを使用して動画の検索結果を取得する
使用するApiはniconico コンテンツ検索APIです。
https://site.nicovideo.jp/search-api-docs/search.html
こちらのapiについては、動画検索機能を使用する場合、事前の登録なども必要とせず、YouTube Data Apiと比較すると分かりやすかったです。
基本的には、Apiのエンドポイントにアクセスしてデータを取得します。
では早速、検索キーワード「こぶしファクトリー」でデータを取得してみましょう。
上記URLにアクセスすると以下のようなデータが取得できるかと思います。(細かい部分は異なっているかもしれませんが、、、)
1 |
{"meta":{"status":200,"totalCount":206,"id":"bc362b9a-9ff0-43fd-8635-f483e9d5a2f9"},"data":[{"startTime":"2015-11-13T01:04:14+09:00","lengthSeconds":346,"contentId":"sm27575788","title":"C\C 赤い日記帳","thumbnailUrl":"https://tn.smilevideo.jp/smile?i=27575788"},{"startTime":"2015-11-13T02:58:19+09:00","lengthSeconds":590,"contentId":"sm27576313","title":"Challenger Opening Medley","thumbnailUrl":"https://tn.smilevideo.jp/smile?i=27576313"},{"startTime":"2016-04-28T16:09:31+09:00","lengthSeconds":547,"contentId":"sm28727792","title":"Loving you Too much / ヤッタルチャン / やったろうぜ!","thumbnailUrl":"https://tn.smilevideo.jp/smile?i=28727792"}]} |
こちらが、Apiで取得できるデータです。
フィルターの指定について
エンドポイントにアクセスする際には、検索キーワードやフィルターを指定します。
フィルターの指定は「&」で区切りながら行う仕組みとなり、上記URLは以下のように分解されます。
q=こぶしファクトリー
→検索キーワード
・targets=title,description,tags
→検索対象のフィールド(例:キーワード検索機能を使う場合は、タイトルや動画説明文、タグを指定すると良さそう)
・fields=contentId,title,startTime,lengthSeconds,thumbnailUrl
→取得したいデータの指定
・filters[viewCounter][gte]=10000
→条件にフィルターをかける(左記の場合は再生回数10000回以上)
・_sort=-viewCounter
→ソート順。昇順または降順かを’+’か’-‘で指定する(左記の場合は「再生回数が多い順」を表している)
・_limit=3
→取得するコンテンツの最大数。最大:100
・_context=your_service_name
→自身のサービス名を指定する場所。(用途が分からないが、できるだけ記載してくださいと指定されているためとりあえず記載)
詳細は公式リファレンスを参照してください。
実際に使用したコード
1 2 3 4 5 6 7 8 9 10 11 12 13 |
def find_nicovideos(serch_keyword) #日本語を含むURLを読み込むと「URI must be ascii only」のエラーが表示されるため、ASCII 文字列に対応する形にする。 URI.encode("https://api.search.nicovideo.jp/api/v2/video/contents/search?q=#{serch_keyword}&targets=title,description,tags&fields=contentId,title,startTime,lengthSeconds,thumbnailUrl&filters[startTime][gte]=#{Time.current.ago(1.week).strftime("%Y-%m-%dT%H:%M:%S")}&filters[startTime][lt]=#{Time.current.strftime("%Y-%m-%dT%H:%M:%S")}&_sort=-viewCounter&_offset=0&_limit=100&_context=your_service_name") #コンテンツ検索APIで時刻を利用する場合、「2014-01-01T00:00:00」←この形式でないと取得できないため、strftimeで修正 nicojson = Net::HTTP.get(URI.parse(url)) #文字列からhash形式に変換 nicohash = JSON.parse(nicojson) #ニコ動のJSONデータは、キー名がシンボルではなく文字列になっているため[:data]ではなく["data"]で参照 @nicodates = nicohash["data"] puts "@nicodatesの結果は下記です。" puts @nicodates end |
コードを順番に解説していきます。
まず、Rubyで日本語を含むURLを読み込んだ場合、「URI must be ascii only」のエラーが表示されます。
そのため、URI.encodeメソッドを利用してASCII 文字列に対応する形にします。
https://loumo.jp/wp/archive/20180628110033/
次に、コンテンツ検索APIで投稿日時のフィルター等を利用する場合、日時が「2014-01-01T00:00:00」←このような形になっていないと、取得することができません。
※公式のサンプルでは、「2014-01-01T00:00:00+09:00」のように+09:00が付いている状態で記載されていましたが、エンドポイントアクセス時に+09:00が含まれていると、「Invalid format: \”09:00″ is malformed at \”09:00\”」と表示されて取得することができませんでした。
そのため、strftime(“%Y-%m-%dT%H:%M:%S”)と記載し、+09:00が付いていない文字列形式で設定します。
その後、Net::HTTP.getでHTMLのボディを取得→ハッシュに変換という流れで、Rubyでも使うためのデータ形式に修正しています。
ちなみに、今回初めてNet::HTTPに関連するメソッドを触ったのですが、こちらの解説が分かりやすいと感じました。
https://magazine.rubyist.net/articles/0013/0013-BundledLibraries.html
find_nicovideos(“こぶしファクトリー”)を実行してみたところ、以下のようなデータを取得することが出来ました。
1 2 3 |
@nicodatesの結果は下記です。 {:startTime=>"2019-08-02T09:54:02+09:00", :lengthSeconds=>125, :contentId=>"sm35481359", :title=>"ダンス部 1 '19冬", :thumbnailUrl=>"https://nicovideo.cdn.nimg.jp/thumbnails/35481359/35481359.81665678"} {:startTime=>"2019-08-02T10:48:02+09:00", :lengthSeconds=>121, :contentId=>"sm35481396", :title=>"ダンス部 2 '19冬", :thumbnailUrl=>"https://nicovideo.cdn.nimg.jp/thumbnails/35481396/35481396.49260521"} |
使用するためのデータを上手く取得できています。
投稿者データの取得について
上記のメソッドでは、投稿者データを取得することはできません。
投稿者データを取得するための方法は下記のブログで解説されているため、こちらを参照して進めました。
※使用したコードは参照先とほぼ変わらないため、省略します
上記をもとに投稿者情報も取得し、Youtube Data Apiと同じようにViewで良い感じに表示させると、下記のようになります。
※上記の動画は、タイトルではなく、タグや説明文に「こぶしファクトリー」の文字列が含まれておりましたが、上手く拾っています。
良い感じに表示できました。
-
前の記事
Ruby on RailsでYouTube Data API (v3)を使用して、動画の検索を行う 2019.08.02
-
次の記事
Ruby on RailsでDailymotionのAPIを使用して、動画の検索を行う 2019.08.04