rubyでSSL接続時のエラーやhttpsの画像が保存できない時の対処法
open-uriなどでcertificate verify failedと怒られる
httpsのサイトにopen-uriなどで接続すると
“certificate verify failed”というエラーが表示されてしまうことがあります。
「証明書検証に失敗しました」ってことですね。
seleniumやnokogiriで画像を保存しようとすると空のファイルが保存される
selenium webdriverやnokogiriで画像を保存しようとすると以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
require 'selenium-webdriver' require 'open-uri' driver = Selenium::WebDriver.for :chrome ###この辺にページでの処理### # 画像のURLを取得 url = driver.find_element(:id, 'gazo').find_element(:tag_name, 'img').attribute("src") # user agentの設定 opt = {} opt['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/XXXXXXXXXXXXX Safari/XXXXXX Vivaldi/XXXXXXXXXX' # ファイルを作って画像を上書き open("image_file.jpg", 'wb') do |output| open(url,opt) do |data| output.write(data.read) end end |
取得元の画像のURLがhttpsだと画像データが取得できずに空のファイルのままになってしまいます。
証明書を取得して読み込む
“certificate verify failed”と怒られているので証明書を取得して保存しましょう。
証明書の保存先はpathの通っているディレクトリか実行ファイルと同じディレクトリが良いと思います。
今回は実行ファイルと同じディレクトリに保存しましょう。
http://curl.haxx.se/ca/cacert.pem
cacert.pemが保存できたら以下のようにコードを変更しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# cacert.pemがあるディレクトリのパス ENV["SSL_CERT_FILE"] = "./cacert.pem" require 'selenium-webdriver' require 'open-uri' # open-sslを使ってみる require 'open-ssl' driver = Selenium::WebDriver.for :chrome ###この辺にページでの処理### url = driver.find_element(:id, 'gazo').find_element(:tag_name, 'img').attribute("src") opt = {} opt['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/XXXXXXXXXXXXX Safari/XXXXXX Vivaldi/XXXXXXXXXX' open("image_file.jpg", 'wb') do |output| open(url,opt) do |data| output.write(data.read) end end |
たった2行の追加で完了です。
cacert.pemがパスの通ったディレクトリにあるのであれば
1 |
ENV["SSL_CERT_FILE"] = "./cacert.pem" |
この行は必要ありません。
どうですか?ちゃんといけましたね!
もしかしたら’open-ssl’は要らないかもしれません。試してみてくださいね。