【问题标题】:Reload page if 'not available'?如果“不可用”重新加载页面?
【发布时间】:2014-10-11 01:41:17
【问题描述】:

我有一个独立的 Raspberry Pi,它显示来自另一台服务器的网页。

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

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

在这种情况下,如何在几秒钟后仍然重新加载网页?

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

【问题讨论】:

  • 如果无法访问网站并且 Chromium 显示错误,我认为无法通过代码执行任何操作。其他解决方案可能是使用addon,它会以一定的时间间隔重新加载网站或通过automated script 加载网站。

标签: raspberry-pi reload chromium


【解决方案1】:

通过 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);

这应该按照您的要求工作

【讨论】:

    【解决方案2】:

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

    优点是脚本可以每 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 超时,这样您就不会运行多个 wget。
    • 创建某种形式的回退,这样您就不会在远程服务器出现问题时敲打它
    • 如果页面超过 40 分钟,最好在页面上显示一些消息,以便查看者知道遇到了问题。
    • 您可以使用 chromium 刷新插件从本地拉取页面
    • 如果您想添加其他/更改的格式(例如替换 css 文件?),您可以在下载页面后使用脚本来更改页面。

    【讨论】:

      【解决方案3】:

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

      现在,如果 ping 成功,请重新加载页面。如果不成功,请再等待 30 秒,然后再次 ping 通。连续这样做,基本上会让你等到服务器再次打开(即你可以ping它)

      我觉得这比自己制作java浏览器和浏览器插件要简单得多。


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


      注意 - 这假设您的服务器确实无法访问......而不仅仅是 html 页面不可用(存在微小但明显的差异)

      【讨论】:

      • 考虑到这一点,但为什么不通过 AJAX 加载内容呢?如果服务器回答,它将返回结果,否则您可以重试。在你得到一些输出时,用获取的内容替换当前内容,每个人都很高兴
      • 这绝对是可能的 - 但 ping 更简单。使用 AJAX,1) 如果请求数据有效,您可以使用它;或者 2) 如果数据成功获取,则只需重新加载页面。如果您不太了解 javascript,第一个选项会很复杂。 (2) 表示与我建议的方法相比,您的数据使用量将增加一倍。所以,为了简单起见,我更喜欢 ping :)
      • 这是我自己使用的方法。
      【解决方案4】:

      我看到了三个解决方案:

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

      2. 用java创建简单的浏览器(没那么难,即使你不懂这种语言,使用webview)

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-21
        • 1970-01-01
        • 2015-01-21
        • 1970-01-01
        相关资源
        最近更新 更多