さんだすメモ

さメモ

技術ブログでは、ない・・・

    動画

準備

ブラウザを操作できるようにします。

  • selenium-webdriverをインストールする
  • geckodriverをダウンロードしてpathを設定する(Firefoxの場合に必要みたい)

手順

ログインする

require 'selenium-webdriver'

# Firefoxを使う
driver = Selenium::Webdriver.for :firefox

# ロード完了まで少なくとも30秒は読み込みをする
driver.manage.timeouts.page_load = 30

# ログインページを開く
driver.navigate.to("https://account.---------.jp/login")

# フォームに入力
input_mailtel = driver.find_element(:id, 'input__mailtel')
input_mailtel.send_keys mail_tel

# フォームに入力
input_password = driver.find_element(:id, 'input__password')
input_password.send_keys password

# クリックして送る
login_button = driver.find_element(:id, 'login__submit')
login_button.click()

動画ページ

require 'selenium-webdriver'
require 'json'

# 動画ページにアクセス
driver.get("https://www.nicovideo.jp/watch/#{video_id}")

# Cookieを取得
all_cookies = driver.manage.all_cookies

# ffmpeg用にCookieを書き直す
# 各Cookieを区切るのには\nを使う
cookies = all_cookies.map { |hash_cookie|
  "#{hash_cookie[:name]}=#{hash_cookie[:value]};path=#{hash_cookie[:path]};domain=#{hash_cookie[:domain]}"
}.join("\n")

# ソースから動画の情報を抜き出す
js_initial_watch_data = driver.find_element(:id, 'js-initial-watch-data')
hash_apidata = JSON.parse(js_initial_watch_data.attribute('data-api-data'))

# 各種情報を取り出す
url = hash_apidata['video']['smileInfo']['url']
title = hash_apidata['video']['originalTitle']
date = hash_apidata['video']['postedDateTime']
filepath = "?????"

ffmpegを使う

system "ffmpeg -cookies \"#{cookies}\" -i #{url} -c copy \"#{filepath}\""

補足

hash_apidata['video']['smileInfo']['isSlowLine']trueのときはかなり遅くなります。falseにしたいなら深夜の時間を選ぶか会員になればok。

最後に

ブラウザで動画のページを開いておき、さらにCookieを持っていればsmileInfoのurlから再生できることがわかったので、ブラウザを制御できるselenium-webdriverを使いました。

net/httpでリクエストを送り、ストリーミングで受け取る方法もあります。ただし、制限をかけてくるので体感1.5倍~2倍程度の速さになり、随分時間がかかります。ページを開いたときやシークしたときは制限されないので、何かしら工夫したら改善しそうですが、わからないことがたくさんあるので諦めました。

ブラウザを操作できるのはすごく便利なんですが、リクエストなどの小回りは効かないので響は無理かなと思います。