ruby - 为什么ruby mechanize gem在登录后给出403响应?

标签 ruby mechanize

因此,我正在尝试从您必须登录的网站自动下载图像。登录表单位于每个页面上(在浏览器中单击“登录”,然后出现一个 javascript 幻灯片以显示该表单)。我使用下面的代码登录,当我到达 agent.get( "http://cdn.com/some_image.jpg ") 时,会抛出 403 错误。当我登录浏览器并访问“http://cdn.com/some_image.jpg”时,这不会发生,那么发生了什么,我该如何解决呢?

path = "http://www.example.com/some_path"

agent = Mechanize.new

page = agent.get(path) do |page|
      form = page.form_with(action: "http://www.example.com/authorize")
      username_field = form.field_with(name: "username")
      username_field.value = "some_user"
      password_field = form.field_with(name: "password")
      password_field.value = "password"
      form.submit
    end

agent.get( "http://cdn.com/some_image.jpg" ).save "some_image.jpg" unless File.exist?("some_image.jpg")

最佳答案

想一想:您提交了一个登录请求,然后是一个对图像的请求。服务器如何知道您是第一个请求登录的人?通过 IP(可以共享或代理)、端口(通常不会在多个请求中存活)、用户代理(不是唯一的)等进行跟踪显然是行不通的。通常,登录 session 是使用 cookie 实现的——Web 客户端会以 cookie 的形式获得一个 session token ,当在后续请求中将其返回给服务器时,会将请求所属的 session 通知服务器,从而允许服务器以通过其他无状态的 Web 请求跟踪登录。

还有其他方法,但它们主要解决以另一种方式传递此 token 的问题(自定义 header 、GET URL 参数等) - 除了 AWS 使用等签名 Web 请求的显着异常(exception)(很酷,但对于 Web 登录来说并不常见) .总而言之, session cookie 是迄今为止最常见的实现。

因此,我建议您看一下这篇文章,因为似乎有一种方法可以在 mechanize gem 中管理 cookie,以供后续请求使用。

Maintaining cookies between Mechanize requests

关于ruby - 为什么ruby mechanize gem在登录后给出403响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27749182/

相关文章:

ruby - 需要 'mechanize' gem 问题

javascript - 将 html 参数放入 Rails 数组参数中

Ruby Marshal.dump 对看起来相同的东西给出不同的结果

ruby - 如何使用 mechanize/nokogiri 获得简单但格式化的 html?

ruby - 无法从元素访问 href

python - 如何在 Python 中从 Mechanize 获取当前 URL?

Ruby 计数数组中字符串中的匹配项数

ruby-on-rails - ActiveRecord 中的零个或一个关联

ruby-on-rails - 由于 ruby​​racer 依赖性,Rails Twitter Bootstrap gem bundle 安装失败?

php - 在客户端缓存 PHP 脚本输出