QR Send

スマホとPCのChrome間で、URLやテキストをQRコード1回のペアリングで送り合える自作Chrome拡張。アカウント不要・無料。

使ってみる →

rubyでSSL接続時のエラーやhttpsの画像が保存できない時の対処法

Selenium・自動化

open-uriなどでcertificate verify failedと怒られる

httpsのサイトにopen-uriなどで接続すると
“certificate verify failed”というエラーが表示されてしまうことがあります。

「証明書検証に失敗しました」ってことですね。

 

seleniumやnokogiriで画像を保存しようとすると空のファイルが保存される

selenium webdriverやnokogiriで画像を保存しようとすると以下のようになります。

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が保存できたら以下のようにコードを変更しましょう。

# 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がパスの通ったディレクトリにあるのであれば

ENV["SSL_CERT_FILE"] = "./cacert.pem"

この行は必要ありません。

どうですか?ちゃんといけましたね!
もしかしたら’open-ssl’は要らないかもしれません。試してみてくださいね。

コメント

タイトルとURLをコピーしました