Ruby 机械化can';找不到合适的字段

Ruby 机械化can';找不到合适的字段,ruby,mechanize,Ruby,Mechanize,我正在尝试登录以下站点: Mechanize只能找到字段\uu RequestVerificationToken,而不能找到用户名和密码字段。我使用以下代码来发现字段: require 'rubygems' require 'mechanize' agent = Mechanize.new page = agent.get('https://login.binck.nl/klanten/') form = page.forms.first form.fields.each { |f| put

我正在尝试登录以下站点:

Mechanize只能找到字段
\uu RequestVerificationToken
,而不能找到
用户名
密码
字段。我使用以下代码来发现字段:

require 'rubygems'
require 'mechanize'

agent = Mechanize.new

page = agent.get('https://login.binck.nl/klanten/')
form = page.forms.first
form.fields.each { |f| puts "#{f.name} : #{f.value}" }  
<script type="text/javascript" src="/klanten/Scripts/knockout-2.2.0.js" ></script>
似乎
用户名
密码
字段没有名称,而且网站正在使用Knockout.js,所以可能这就是它不起作用的原因。即使添加了
用户名
密码
字段,网站仍然不允许我登录

form.add_field!('username', 'MY_USERNAME')
form.add_field!('password', 'MY_PASSWORD')

page = agent.submit form

puts page.body

有没有人能解决我如何自动登录此网站的问题?

这不是试图回答所问的问题,但它会帮助您找到解决问题的方法。这是用于任何刮削或表单填充自动化的一般过程,通常只有用于查找特定节点的选择器才会更改

  • 用于检索页面的实际HTML;检索HTML并将其转储到文件中,这样您就可以准确地看到发送的内容,而无需浏览器或任何其他代码:

    require 'open-uri'
    
    File.write('test.html', open('https://login.binck.nl/klanten/').read)
    
    如果您想要的字段在OpenURI检索时不在表单中,那么Nokogiri或Mechanize都不能帮助您,因为Mechanize是在Nokogiri之上构建的,它使用Nokogiri进行解析。在本例中,它们位于HTML中,因此Nokogiri和Mechanize可以找到它们,您只需要知道如何操作:

    <input data-bind="value: $root.username, setFocus:true" type="password"/>
    <input data-bind="value: $root.password" type="password"/>
    
    如果我在IRB中运行该代码,我可以查看返回的节点:

    >> puts doc.css('input[@type="password"]').map(&:to_html)
    
    请参阅:

    <input data-bind="value: $root.username, setFocus:true" type="password">
    <input data-bind="value: $root.password" type="password">
    
    (播放它的教程,特别是第“3/5”页上的教程,查看它在您试图解析的页面中的作用。)

    这就是上面这些东西开始散架的地方

    Mechanize不能将值填充到字段中并提交它们,因为Knockout必须完成它的任务,这需要一个JavaScript解释器。您必须尝试使用WATIR驱动的浏览器来允许它处理JavaScript,这将让Knockout运行,这样它就可以发挥神奇的作用并提交数据。(如果不是HTTPS连接,您可以嗅探用于查找发送的值的线路,但这只是解决方案的一部分,您还必须捕获cookie和会话信息。)

    分解JavaScript也会使任务更加困难,因为它可以是动态的。代码可以在页面加载时加载,也可以在页面加载后的后台加载,这取决于发生的一些触发器,例如单击Submit按钮,因此代码根本不可见。你必须嗅嗅电线或花时间分解他们的代码。不管怎样,工作都会变得更加困难

    嗅探连接的问题是,HTTPS将从浏览器到服务器的正常HTTP流量封装在一个层中,以保护其免受窥探。因此,普通的工具,如和,不能真正帮助,因为它们不是SSL软件。根据您的操作系统,您可能会到达需要的位置


    在他的回答中,@pguardiario说使用或进入HTTPS/SSL层,查看来回传递的实际数据。这些将让您在击倒后看到字段名,SSL层有机会玩一些东西。也许他会进一步阐述他的答案,以便对您提供更多帮助。

    通常您会:

    form['username'] = 'foo'
    form['password'] = 'bar'
    
    但是,这些字段名称不正确。要发现正确的字段名,您需要通过ssl(mitm)代理(如fiddler或charles)来代理浏览器请求,并查看其发送的内容


    看起来您还需要更改
    表单.方法。

    Binck.nl是一个银行网站。它可能有一些安全限制,以防止机器人程序/脚本登录。我不明白为什么要使用开放uri来回答mechanize问题。因为使用mechanize检索HTML只是为了将其转储到磁盘以确认标记是静态的,这是浪费时间。你读过我写的吗?这是为了帮助OP了解如何判断Nokogiri或Mechanize是否是合适的工具。不,我们已经知道Mechanize是合适的工具。开放uri是浪费时间,因为它是一条死胡同。输入标记也错了,它们没有名称,所以不是表单字段。Wireshark无法“嗅探”https流量。你需要一个mitm代理。你经常会发表一些有见地的帖子,但这个答案真的是一个彻底的损失。这里没有什么有用的,只是指向了错误的方向。你是对的,这是一个HTTPs连接,Wireshark帮不上忙,因为SSL管道隐藏了线路上的内容。这对于正常的未加密HTTP连接很有用。同样,这个答案是让用户思考如何处理这些东西。你可能有不同的方向;你有权得到它。OP是一个需要帮助的人,而你似乎已经忽视了这一点;更详细地解释你将如何做,并帮助而不是攻击其他答案。
    form['username'] = 'foo'
    form['password'] = 'bar'