ruby - OpenUri 导致 401 未经授权的 HTTPS URL 错误

标签 ruby authentication https screen-scraping

我添加的功能是从需要使用带身份验证的 HTTPS 连接的源中抓取 XML 页面。我正在尝试使用 Ryan Bates 的 Railscast #190 解决方案,但遇到了 401 身份验证错误。

这是我的测试 Ruby 脚本:

require 'rubygems'
require 'nokogiri'
require 'open-uri'

url = "https://biblesearch.americanbible.org/passages.xml?q[]=john+3:1-5&version=KJV"
doc = Nokogiri::XML(open(url, :http_basic_authentication => ['username' ,'password']))
puts doc.xpath("//text_preview")

这是我运行脚本后控制台的输出:

/usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:799:in `connect': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:799:in `block in connect'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/timeout.rb:54:in `timeout'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/timeout.rb:99:in `timeout'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:799:in `connect'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:755:in `do_start'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:744:in `start'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/open-uri.rb:306:in `open_http'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/open-uri.rb:775:in `buffer_open'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/open-uri.rb:203:in `block in open_loop'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/open-uri.rb:201:in `catch'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/open-uri.rb:201:in `open_loop'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/open-uri.rb:146:in `open_uri'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/open-uri.rb:677:in `open'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/open-uri.rb:33:in `open'
from scrape.rb:6:in `<main>'

在我的研究中,我看到一篇帖子建议在 1.9.3 中可以使用以下选项:

doc = Nokogiri::XML(open(url, :http_basic_authentication => ['username' ,'password'], :ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE))

但是,这也不起作用。我将不胜感激解决这一挑战的一些见解。

最佳答案

给定的 URL 将被重定向到 /v1/KJV/passages.xml?q[]=john+3%3A1-5,HTTP 状态代码为 302 Found . OpenURI 理解重定向,但出于安全原因自动删除身份验证 header (可能)。 (*)

如果您直接访问 "http://biblesearch.americanbible.org/v1/KJV/passages.xml?q[]=john+3%3A1-5",您将获得预期结果。 :-)

(*) 你可以在open-uri.rb中找到:

if redirect
  ### snip ###
  if options.include? :http_basic_authentication
    # send authentication only for the URI directly specified.
    options = options.dup
    options.delete :http_basic_authentication
  end

关于ruby - OpenUri 导致 401 未经授权的 HTTPS URL 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13763399/

相关文章:

ruby-on-rails - protected 方法 'update'调用了#<Project

authentication - MVC 5 中 "returnUrl"的值在哪里设置?它总是带我到/主页/索引

ssl - Meteor 自动路由到 https

ruby-on-rails - Rails - 如何获取访问者的IP地址?

ruby - `singleton` 方法驻留在 Ruby 中的什么位置?

android - 使用摘要式 HTTP 身份验证 : “Cannot retry streamed HTTP body” 改造 POST 请求

java - 在 Java EE 中实现 HTTPS

ruby - 如何让 Sinatra 通过 HTTPS/SSL 工作?

ruby - 如何从 Rails 中的代码解析和发送整个复杂的 XML

Swift:反斜杠点 "\."是什么意思?