因此,我正在尝试从您必须登录的网站自动下载图像。登录表单位于每个页面上(在浏览器中单击“登录”,然后出现一个 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/