職業選択の自由

職業を選択するまでの過程。

ニコニコ動画のサムネイルを一括ダウンロードするRubyスクリプト

ニコニコ動画には、動画のサムネイルと概要情報を小窓にして埋め込める機能がある。見た事がある人も多いだろう。

[サンプル]

今回、こういう埋め込みがたくさんあるページからこの画像だけ持ってくる作業を自動化した。実行環境は Ruby2.3.3 (やや古いが)、HTMLの解析にお馴染み nokogiri を使っている。

サムネイルの中身

小窓の正体は <iframe> である。中身を覗くとこういうアドレスの埋め込みになっている。

https://ext.nicovideo.jp/thumb/sm3504435

これは普通のURLなので、やろうと思えばブラウザでアクセスできる(見た目は悪いが)。

さて、欲しい画像はこの中にある。つまり <iframe> からこのアドレスだけ持ってきて、改めてアクセスする必要がある。やや荒いが

parser
  .xpath('//iframe')
  .map { |iframe| iframe.attribute('src').value }
  .select { |iframe_url| iframe_url.match %r(http://ext.nicovideo.jp/thumb/sm\d+) }

とした(他に <iframe> があるとも限らんので)。

画像の特定

改めて http://ext.nicovideo.jp/thumb/sm\d+ の中身を見てみると、サムネイル画像のURLは

https://tn.smilevideo.jp/smile?i=3504435

となっていることが分かる(これで例のミクちゃんが見られるよ!)。普通の <img> タグなので取得は簡単。

# URLの読み込み→Nokogiri は事前にやっておく→ thumb_parser
thumb_img_src = thumb_parser.xpath('//img[@class="video_img"]').attribute('src').value

これで画像のURLが取得できる。

画像ダウンロード

ここまでやったんだから画像のダウンロードまで自動化したい。URLの画像データをローカルに保存するには open-uri を使う。 (Stackoverflow さんいつもありがとうございます)。画像ファイルの形式は一見分かりにくいが .jpg なので

open(thumb_img_src) do |image|
  file_id = thumb_img_src.scan(/\d+$/)[0]
  File.open("images/smile_#{file_id}.jpg", 'wb') do |file|
    file.puts(image.read)
  end
end

とすれば images/ 以下に画像がずらっとダウンロードされる。ヤッタ!

f:id:strviola:20180126234852p:plain

成果物

といったコードを書いたのでGistに公開した。

ニコニコ動画サムネイルダウンローダ · GitHub

ここで題材として使わせてもらったのはこのブログ記事になる。

swiftfox.blog6.fc2.com

で、これで取ってきた画像をなんやかんやして

の画像を作った訳ですよ!

まじかああああああもう10年(略

以上、いろんな意味で10年の歳月を実感する記事でした。