Raspberry pi 如果',则重新加载页面;不可用';?

Raspberry pi 如果',则重新加载页面;不可用';?,raspberry-pi,reload,chromium,Raspberry Pi,Reload,Chromium,我有一个独立的Raspberry Pi,它显示来自另一台服务器的网页 30分钟后通过网页上的JavaScript重新加载 在某些情况下,服务器在很短的时间内无法访问,Chromium显示通常的此网页不可用消息,并停止重新加载 (因为页面中没有JavaScript触发重新加载) 在这种情况下,我怎么能在几秒钟后重新加载网页 现在我想到了通过AJAX获取网站结果,并在当前页面中替换它们(如果它们可用)。我看到了三种解决方案: 在iframe中加载页面(如果未被阻止),并检查内容/响应) 用java创

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

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

在某些情况下,服务器在很短的时间内无法访问,Chromium显示通常的
此网页不可用
消息,并停止重新加载 (因为页面中没有JavaScript触发重新加载)

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

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

我看到了三种解决方案:

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

  • 用java创建简单的浏览器(使用webview,即使您不懂这种语言,也不难)

  • 为你的浏览器创建插件

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

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

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


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



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

    我喜欢的方法是每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脚本)

    注意:

    这只是你所需要的基本信息,因为我不知道你所需要的具体信息。但你也应该考虑尝试

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

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

    如果未访问网站,Chromium显示错误,则应按照您的要求执行此操作

    ,我认为无法通过代码执行任何操作。另一种解决方案可能是使用以一定间隔重新加载网站或通过加载网站。考虑到这一点,为什么不通过AJAX加载内容呢?如果服务器应答,它将返回结果,否则您可以重试。当你得到一些输出时,用获取的内容替换当前内容,每个人都很高兴这绝对是可能的——但是ping更简单。使用AJAX,1)如果请求数据有效,则可以使用该数据;2)如果成功获取数据,则只需重新加载页面。如果您不熟悉javascript,那么第一个选项就很复杂。(2) 这意味着与我建议的方法相比,您的数据使用率将提高一倍。因此,为了简单起见,我更喜欢ping:)这是我自己使用的方法。
    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);