1

我需要在整个工作日期间打开一个网页。我使用 Mechanize 在 Ruby 中编写了一个脚本,它工作正常,但是,当脚本结束时页面关闭。

我找到了一种使用无限循环和的方法sleep(x),但我仍然认为这不是一个好方法。恐怕会占用太多内存。

有什么方法可以让会话保持打开状态,直到我手动结束脚本?

这是我的代码:

require 'rubygems'
require 'mechanize'

def autoOpen (loginname, loginpasswd)
    p = Mechanize.new
    p.agent.http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    page = p.get('https://www.webpage.com/index.cgi')
    logpage = page.form_with(:method => "POST")
    logpage.username = loginname
    logpage.password = loginpasswd
    succpage = logpage.submit(logpage.button_with(:name => 'Submit'))
end

while 1 == 1
    if false == system('ping www.webpage.com > tmp')
        autoOpen('username', 'password')
    end
    sleep(1)
end

实际上,即使我添加了无限循环,它也不起作用。

正如@theTinMan 所说,Mechanize 只是打开页面并获取内容/对象,它不能在页面中。

有解决办法吗?

4

1 回答 1

3

您可以尝试的一件事是使用Watir打开浏览器窗口。

Watir 不像机械化。Mechanize 是一个页面解析器,它可以让你填写表单并提交它们,作为一个附带功能,它可以查看页面的 DOM 以查找内容。

相反,Watir 告诉浏览器如何像用户一样行事,因此打开页面、单击按钮、获取字段内容或在字段中输入文本都是可行的。这可能会使您的代理系统误以为您实际上正在使用该页面。

但是,实际上,我认为您正在尝试破解一个可能会让您感到惊讶的系统。如果写了一个代理,我会观察会话是否有流量通过。如果没有我会关闭它。代理服务器是网络服务器,资源也有限,所以如果有很多人打开会话而不使用它,这些资源就会被浪费。因此,如果简单地打开浏览器页面不是真正的解决方法,请不要感到惊讶。

相反,也许您需要了解有关该特定代理的更多信息,并查看是否可以通过它打开隧道,并通过对远程主机的 ping 或定期请求保持其打开。

同样,您告诉我们的内容几乎不足以给您任何可用的答案。听起来你对你试图愚弄的代理不够了解,所以你的未来会有很多实验。

作为 Ruby 编码技巧,我将您的代码编写得更像:

require 'rubygems'
require 'mechanize'

def auto_open(name, password)
  p = Mechanize.new
  p.agent.http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  logpage = p.get('https://www.webpage.com/index.cgi').form_with(:method => "POST")
  logpage.username = name
  logpage.password = password
  logpage.submit(logpage.button_with(:name => 'Submit'))
end

while true
  if system('ping -c1 www.webpage.com > /dev/null')
    sleep(1)
  else
    auto_open('username', 'password')
  end
end

该代码仍然无法工作,但它更像 Ruby。

此外,您可能想查看使用ping -i 60 www.webpage.com > /dev/null. -i n意思是“在 ping 之间等待n几秒钟”。

于 2013-02-26T14:41:34.810 回答