如果'不可用,请重新加载页面&#39 ;?

时间:2014-08-18 07:32:09

标签: raspberry-pi reload chromium

我是一个独立的Raspberry Pi,它显示来自其他服务器的网页。

它会在30分钟后通过网页上的JavaScript重新加载。

在某些情况下,服务器无法在很短的时间内到达,而Chromium会显示通常的This webpage is not available消息,并停止重新加载 (因为页面中没有JavaScript会触发重新加载)。

在这种情况下,我怎样才能在几秒钟后重新加载网页?

现在我有想法通过AJAX获取网站结果,并在当前页面中替换它,如果它们可用。

4 个答案:

答案 0 :(得分:5)

不是每隔几分钟刷新一次网页,你可以做的就是使用javascript ping服务器(pingjs是一个很好的库,可以做到这一点)

现在,如果ping成功,请重新加载页面。如果不成功,请再等30秒再次ping它。连续执行此操作,基本上会让您等到服务器再次打开(即您可以ping通)

我认为与制作自己的java浏览器和制作浏览器插件相比,这是一种更简单的方法。

额外信息:您应该使用指数函数或超时检查来避免不必要的处理开销。即第一次发现ping失败,等待30秒,第二次等待30 *(2 ^ 1)秒,第三次等待30 *(2 ^ 2),依此类推,直到达到最大值。 / p>

注意 - 这假设您的服务器确实无法访问...而且不仅仅是html页面不可用(这里有一个很小但很明显的区别)

答案 1 :(得分:2)

我最喜欢的方法是每隔30分钟使用脚本在本地复制网页,并将铬指向本地副本。

优点是脚本可以每30秒运行一次,并检查在最后30分钟内是否发生了成功的页面拉动。如果是,那么什么都不做。如果否,则可以继续尝试拉动它。与此同时,浏览器将设置为每5秒刷新一次页面,但由于它正在拉动本地页面,因此每次刷新几乎不起作用。然后,您可以检测它已拉回的内容是否包含所需的内容。

此方法假设您的目标是避免每隔几秒刷新一次页面,从而减少远程页面的负载。

使用这些选项抓取整个页面....

# exit if age of last reload is less than 1800 seconds (30 minutes)
AGE_IN_SECS=$(( $( perl -e 'print time();' ) - $(stat -c "%Y" /success/directory/index.html) ))
[[ $AGE_IN_SECS -lt 1800 ]] && exit

# copy whole page to the current directory
cd /temporary/directory
wget -p -k http://www.example.com/

然后你需要以某种方式测试页面,以确保你有你需要的东西,例如(使用bash脚本)....

RESULT=$(grep -ci "REQUIRED_PATTERN_MATCH" expected_file_name )
[[ $result -gt 0 ]] && cp -r /temporary/directory/* /success/directory
rm -rf /temporary/directory/*

注意:

这只是你需要的基础,因为我不知道你需要什么的具体细节。但你也应该考虑尝试......

  • 确保wget超时,这样就不会有多个wgets在运行。
  • 创建某种形式的后退,以便在遇到问题时不用锤击远程服务器
  • 理想情况下,如果页面超过40分钟,则会在页面上显示一些消息,以便观看者知道正在遇到问题。
  • 您可以使用铬刷新插件从本地提取页面
  • 如果要添加其他/更改的格式(例如,替换css文件?),您可以使用脚本在下载后更改页面。

答案 2 :(得分:1)

我看到了三个解决方案:

  1. 在iframe中加载页面(如果没有阻止),并检查内容/响应。

  2. 在java中创建简单的浏览器(不是很难,即使你不懂这种语言,使用webview)

  3. 为您的浏览器创建插件。

答案 3 :(得分:0)

通过javascript重新加载页面非常简单:

function refresh() {
  var xhr = new XMLHttpRequest();
  xhr.onreadystatechange = function() {
    if (xhr.readyState == 4 && xhr.status === 200)
      document.body.innerHTML = this.responseXML.body;
    else
      setTimeout('refresh', 1500);
  };

  xhr.open('GET', window.location.href);
  xhr.responseType = "document"
  xhr.send();
}

setInterval('refresh', 30*60*1000);

这应该按照您的要求运作