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

为什么ruby mechanize gem在登录后会给出403响应?,ruby,mechanize,Ruby,Mechanize,所以,我正在尝试从一个你必须登录的网站自动下载图像。登录表单位于每个页面上(在浏览器中单击“登录”并出现javascript幻灯片显示表单)。我使用下面的代码登录,当我到达agent.get(“”)时,抛出403错误。当我登录到浏览器并访问“”时,不会发生这种情况,因此发生了什么,我如何才能避免这种情况 path = "http://www.example.com/some_path" agent = Mechanize.new page = agent.get(path) do |page

所以,我正在尝试从一个你必须登录的网站自动下载图像。登录表单位于每个页面上(在浏览器中单击“登录”并出现javascript幻灯片显示表单)。我使用下面的代码登录,当我到达agent.get(“”)时,抛出403错误。当我登录到浏览器并访问“”时,不会发生这种情况,因此发生了什么,我如何才能避免这种情况

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(可以共享或代理)、端口(无法在多个请求中生存)、用户代理(不唯一)等进行跟踪显然不起作用。通常,登录会话是使用cookie实现的-web客户端会获得一个cookie形式的会话令牌,当在后续请求中返回给服务器时,该令牌会通知服务器该请求所属的会话,从而允许服务器跨其他无状态web请求跟踪登录

还有其他方法,但它们主要是通过另一种方式(自定义头、获取URL参数等)来解决传递此令牌的问题,除了AWS使用等签名web请求(很酷,但对于web登录来说并不常见)之外。总而言之,会话cookie是目前最常见的实现

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


从cdn我猜他们在检查用户代理或参考


Mechanize应该正确设置referer,这样就离开了用户代理。

但是我的用户代理被设置了-他们还会阻止某些浏览器吗?很好,你可能是对的。人们在清理自己的URL时有一种倾向,那就是大嚼相关数据;很想知道,否则,www.example.com如何授权对cdn.com的请求。请尝试将用户代理和引用设置为浏览器发送并查看的相同标题。我将用户代理设置为与浏览器发送的相同标题。此外,似乎没有设置引用器(使用HTTPTrace Chrome插件),但是通过浏览器请求传递了3个cookie(在代理中找不到),而在Mechanize请求中没有传递。Cookie:_gat=1__asc=CXXXX93714XD2BAAC454F6888C__auc=4da96ae114aacd6123456e8e8b4_ga=GA1.2.141234142.1123438953这是什么意思?我在浏览器中看到cookie,但无法通过Mechanize代理变量访问它们。您可以忽略favicon.ico请求。听起来像是一些javascript正在使用CDN设置cookie。Mechanize不能做到这一点,所以最好切换到能做到这一点的位置,例如watir webdriver。