Rumix2(Windows用Ruby)でFlickrの画像をまとめてダウンロード・バックアップ
公開日:
:
プログラミング
以前、書いた「RubyでFlickrの画像をまとめてダウンロード・バックアップしておく」はLinux環境だったので、Windows環境でも試してみました。
目次
Ruby on WindowsとしてRumix2を選択
Windows上でRubyを簡単にインストールできるのはRumix(ruby.morphball.net)ではないかなと思い選択。インストール用のファイルをダウンロード、展開、rumix_install.exeをダブルクリックでインストールは簡単。
下準備的なもの。FlickrのAPIキー取得
「RubyでFlickrの画像をまとめてダウンロード・バックアップしておく」の「ブラウザでAPIキーとシェアドシークレットを取得」をお読みのうえ、APIキーとシェアドシークレットを取得しておいて下さい。
必要となるgemのインストール
Rumixランチャーより「コマンドライン端末を開く」
1 2 3 |
gem install flickraw gem install flickraw-cached gem install fileutils |
HTTPS接続に難儀する
FlickrAPIは2014年6月27日以降はSSL接続が必須となり(Flickr API Going SSL-Only on June 27th, 2014 | code.flickr.com)、FlickRawも現バージョンではSSL接続がデフォルトですので、SSLを使います。
さて、auth.rb(もうちょい↓に記載)を実行してみる段になり苦労します。エラー表示からぐぐっていくと、どうやらSSLで使用する証明書のパスがハードコーディングされているのです!Luisで検索したら多くのトホホが。。。
ruby on rails – How to solve "certificate verify failed" on Windows? – Stack Overflow
このため、SSL証明書のパスを環境変数で明示的に指示しなければなりません。
Download http://curl.haxx.se/ca/cacert.pem into c:\railsinstaller\cacert.pem
Go to your Computer -> Advanced Settings -> Environment Variables
Create a new System Variable:Variable: SSL_CERT_FILE
Value: C:\RailsInstaller\cacert.pem
とりあえず、テスト。
1 2 3 4 5 6 7 8 9 10 |
$ set SSL_CERT_FILE=c:\rumix\cacert.pem [C:system32] $ echo %SSL_CERT_FILE% c:\rumix\cacert.pem [c:\rumix] $ cd c:\rumix [c:\rumix] $ ruby auth.rb このURLをブラウザで開いて認証プロセスを完了させてください : https://api.flickr.com/services/oauth/authorize?oauth_token=xxx&perms=delete 認証完了後、ブラウザに表示された数字を含む文字列を下にペーストしてください |
となり、動作しそうです。
SSL対策まとめ
- モジラ用?のルート証明書をダウンロード
- 適当なフォルダにダウンロードしてきた上記cacert.pemを移動
- 移動したcacert.pemへのパスを環境変数に設定
- 環境変数の設定の仕方。コントロール パネル\システムとセキュリティ\システムから「システムの詳細設定」→「環境変数」→「新規」。変数名→SSL_CERT_FILE、変数値→c:\rumix\cacert.pem(←例)
- 念のためWindowsを再起動
auth.rbを実行
「RubyでFlickrの画像をまとめてダウンロード・バックアップしておく」を参考にauth.rbを作成。参考までに再掲。文字コードはUTF-8/LFにしておきました。auth.rbはアクセストークン、アクセスシークレットを取得するためだけのスクリプトです。
auth.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
require 'flickraw' FlickRaw.api_key="api_key_here" FlickRaw.shared_secret="api_secret_here" token = flickr.get_request_token auth_url = flickr.get_authorize_url(token['oauth_token'], :perms => 'delete') puts "このURLをブラウザで開いて認証プロセスを完了させてください : #{auth_url}" puts "認証完了後、ブラウザに表示された数字を含む文字列を下にペーストしてください" verify = gets.strip begin flickr.get_access_token(token['oauth_token'], token['oauth_token_secret'], verify) login = flickr.test.login puts "認証完了 ユーザ名-> #{login.username} token-> #{flickr.access_token} secret-> #{flickr.access_secret}" rescue FlickRaw::FailedResponse => e puts "認証失敗 : #{e.msg}" end |
api_key_hereとapi_secret_hereは「RubyでFlickrの画像をまとめてダウンロード・バックアップしておく」の「ブラウザでAPIキーとシェアドシークレットを取得」により取得したものです。
Rumixのコマンドライン環境上ckw(Rumixをコマンドラインで動かすコマンドライン環境=ckw、シェル=NYAOSと理解)で実行しますと、
1 2 3 |
$ ruby auth.rb このURLをブラウザで開いて認証プロセスを完了させてください : https://api.flickr.com/services/oauth/authorize?oauth_token=xxxxxxxxxxxxxxxx&perms=delete 認証完了後、ブラウザに表示された数字を含む文字列を下にペーストしてください |
Rumixの窓はこのままさわらない(auth.rb実行ごとに返ってくるトークンが異なるので要注意)。
上記oauth_tokenの値xxxxxxxは固有の文字列で返って来ます。https://~deleteをコピーして、ブラウザで開きます。Rumixのコンソール(nkw)でコピーする方法が分からなかったのですが、調べてみるとマウスで選択終了時にクリップボードに入っているようです。
「OK, I’LL AUTHORIZE IT」をクリック。3桁-3桁-3桁の数字が返ってくるので、この文字列をckwに貼り付けます。
1 2 3 |
xxx-xxx-xxx 認証完了 ユーザ名-> xxxxx token-> xxxxxxxxxxxxxxxxxx secret-> xxxxxxxxxxxxxxxx [c:\rumix] |
これでようやく認証作業完了(xxxの桁数は適当に再現)。
Flickrからファイルをとってくる
「RubyでFlickrの画像をまとめてダウンロード・バックアップしておく」の「Ruby+FlickRawで画像を取得」のところと同様です。
- FlickRaw.api_key 最初の行程で取得したもの
- FlickRaw.shared_secret 同上
- flickr.access_token auth.rbを使って取得したもの
- flickr.access_secret 同上
- user_idはhttps://www.flickr.com/iconbuilder/の自分のアイコンの画像URLである「https://s.yimg.com/pw/images/buddyicon00.png#8桁の数字@アルファベットと数字2桁」の最後の8桁の数字@アルファベット1文字数字2文字の部分です。
- base_dir 保存先
- 35行目でWindowsのフォルダに不的確な文字をアンダースコアに置換していますが、もともとLinux用に作ったものなのでWindows用にはもっと多くの不的確な文字があるかも。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# -*- coding: utf-8 -*- FlickrawOptions = { :lazyload => true, :timeout => 2 } require 'flickraw-cached' require 'open-uri' require 'fileutils' #設定 FlickRaw.api_key="api_key_here" FlickRaw.shared_secret="api_secret_here" flickr.access_token = "token_here" flickr.access_secret = "access_secrete_here" user_id = "xxxxxxxx@xxx" base_dir = "./hogehoge/" url_size = 'url_o' #ここまで設定 #urlとディレクトリを指定しファイルを保存 #ディレクトリの存在をチェックし、なければ作成する def save_file(url,dir) FileUtils.mkdir_p(dir) unless File.exist?(dir) open(dir + File.basename(url), 'wb') do |file| open(url) do |data| file.write(data.read) end end end #user_idの所有するset内のオリジナルサイズの写真をbase_dirに保存する #ディレクトリ名に不適な文字をアンダースコアで置き換える def fetch_photos_of_sets(user_id, base_dir, url_size) set_list = flickr.photosets.getList :user_id => user_id set_list.each do |photo_set| dir_save = base_dir + photo_set.title.gsub(/[?"\<>*|]/,"_") + '/' photo_list = flickr.photosets.getPhotos :photoset_id => photo_set.id, :extras => url_size photo_list.photo.each do |photo| photo_url = photo.url_o p photo_url save_file(photo_url, dir_save) end # sleep 1 end end #ログインIDにおけるセットに所属していない写真をダウンロード #保存ディレクトリはbase_dir下のnot_in_set/に決め打ち def fetch_photos_not_in_set(user_id, base_dir, url_size) list = flickr.photos.getNotInSet(:extras => url_size) list.photo.each do |photo| dir_save = base_dir + 'not_in_set/' p photo.url_o save_file(photo.url_o, dir_save) end end #main begin fetch_photos_of_sets(user_id, base_dir, url_size) fetch_photos_not_in_set(user_id, base_dir, url_size) end |
このブログで関連すると思われる他の投稿
- PREV
- Flickr APIがSSL接続のみになる?
- NEXT
- B&Hから個人輸入した配送記録(UPS)