準備
ブラウザを操作できるようにします。
手順
ログインする
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倍程度の速さになり、随分時間がかかります。ページを開いたときやシークしたときは制限されないので、何かしら工夫したら改善しそうですが、わからないことがたくさんあるので諦めました。
ブラウザを操作できるのはすごく便利なんですが、リクエストなどの小回りは効かないので響は無理かなと思います。