自动刷新Midori


11

我正在使用Raspberry Pi创建一个非交互式的信息亭-特定的网页(来自远程监控站的测量结果)以全屏模式显示在屏幕上,内容经常通过AJAX刷新。

现在有很多解决方案可以将Raspberry变成自助服务终端,我敢肯定我可以做到这一点,但是自助服务终端应该完全免维护。尤其是在断电后又重新启动的情况下,但由于某种原因,路由器/调制解调器/网络基础设施并没有完全联机。

在这种情况下,Midori会显示一个有关“无法连接”或类似内容的页面,并且它将被卡住,直到有人再次上电为止,因为包括其自身的自动刷新机制的网页无法加载!

现在,当网络再次可用或具有类似效果(总是每15分钟左右自动刷新一次,或保持刷新直到页面加载之类的东西)时,如何强制Midori加载页面?

如果Midori无法使用该选项,您可以推荐其他解决方案吗?


我现在没有Pi的访问权限,也没有Midori的访问权限,但是Midori可能有dbus支持?您可以尝试运行qdbus(从package libqt4-dbus)或其他类似工具,然后在其中寻找Midori。然后,您很可能可以触发页面刷新。
Arne 2013年

更好的是:Midori似乎内置了一些东西。也许您可以尝试在此处发布答案。
Arne 2013年

我的回答有用吗?您要我编写bash脚本而不是Python吗?如果您需要使用crontab,是否可以解决任何错误?
xxmbabanexx

@xxmbabanexx:这很有用,如果没有更好的出现,我一定会接受的。我找到了另一种解决方案,一旦完全开发,将发布该解决方案。我仍然希望有人提出一种解决方案,如果页面工作正常就不会刷新,但是如果这种情况没有发生,您的回答将是完全可以接受的,我会接受的。
SF。

@sf。感谢您提供其他信息。完成数学作业后,我将编辑脚本以包括网络连接检查。
xxmbabanexx

Answers:


6

假设您的系统上装有Python,则可以使用的替代方法cron。我创建了一个快速的Python 2.7.3脚本,它将每5分钟重新加载一次Midori。

#This program reloads midori every 5 minutes

#Redifine the variables below as you see fit

rest_time = 300 #Rest time is set to 300 seconds (5 minutes) 


import subprocess as sub #Imports terminal commands (needed for reload)
from time import sleep #Import sleep (allows an infinite loop to become dormant)

while True: #This is an infinite loop. This means that our script won't stop.
    sub.call(["midori", "-e", "Reload"]) #This forwards our command to the terminal
    sleep(rest_time) #Wait rest_time second(s), then start the loop again. 

如果您需要更改休息时间,只需更改rest_time变量。

新剧本

正如您说的那样,您需要该程序“智能”,我对此进行了编辑。使用该程序时,请不要手动打开Midori。从脚本中打开它。如果您不这样做,我有一个习惯因速拨器而崩溃。它还可以在Python 2.7.3上运行。如果您不想全部复制和粘贴,请访问我的代码的pastebin。

"""
Midori Kiosk Reloader.
Created by xxmbabanexx

NOTE: This program opens Midori automatically. DO NOT OPEN IT MANUALLY, SIMPLY CLICK ON THIS PROGRAM.

KEYS

1 = Connection Complete. All is well.

0 = Connection Incomplete. Something is wrong.
"""


#Change these variables to your liking.

host = "www.google.com" #Put your desired host URL/IP between the quotes

port = 80 #Set to default port of 80. If your host uses something else, please change it.

recheck_time = 10 #The number of seconds the program will wait to ping the server. Change this at your leisure. 

page_to_open_to = "www.google.com" #This is the webpage the kiosk will open to. Put the url between the quotes.


#Excersise caution when changing these vars.

last = -1 #undefined state
up = -1 #Undefined state



"""
#---------------- Main code. Do NOT touch unless you KNOW what you are doing. ------------
"""
#Import modules

import subprocess as sub
from time import sleep
import socket
import threading

sub.Popen(["midori", "-a", page_to_open_to]) #open midori


#Check if internet is up
addr = (host, port) #the connection addr


while True:
    last = up #reset checking var
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #create socket
    try: #attempt to ping, change vars
        s.connect(addr)
        up = 1
        print "\n"
    except socket.error: #if error when pinging, change vars
        up = 0
        print "\n"

    print "LAST CHECK:", last
    print "CURRENT CHECK:", up
    if last == 0 and up == 1:
        print "Reloading Midori.\n"
        sub.call(["midori", "-e", "Reload"])
    s.close()


    sleep(recheck_time)

8

万一有人来找新的答案,Midori现在有一个命令行选项--inactivity-reset=SECONDS(或-i简称为命令行)。

结合使用该-a选项,您可以每隔x秒以信息亭模式实现不断重启的浏览器。

例如

midori -a http://www.google.com/ -i 120 -e全屏

闲置2分钟后,将在全屏窗口中打开http://www.google.com/并刷新页面。(-e执行命令)


4

我决定从另一个角度来处理它,主要是独立于浏览器。

浏览器以信息亭模式启动,指向特定的本地文档:

watchdog.html

<!DOCTYPE html>
<html>
    <head>
        <title>Monitoring</title>
        <script type="text/javascript">
        <!--
        var reload_url="http://example.org/watched.html";
        var to = 10000;  // Watchdog timeout: 10s.
        var wd;
        var ifr;
        function setup_watchdog()
        {
            ifr=document.getElementById("frame1");
            window.onmessage = function(e){
                if (e.data == 'tyrp') {
                    window.clearTimeout(wd);
                    wd = window.setTimeout(wdf,to);
                }
            };
            ifr.src = reload_url;
            wd = window.setTimeout(wdf,to);
        }

        function wdf()
        {
            ifr.src = reload_url;
            wd = window.setTimeout(wdf,to);
        }
        // -->
        </script>
    </head>
    <body onload="setup_watchdog()" style="margin: 0; overflow: hidden;">
        <iframe id="frame1" src="#" 
        style="position:absolute; left: 0px; width: 100%; top: 0px; height: 100%; margin:0; padding:0; border:0px none transparent;"></iframe>
    </body>
</html>

现在,在此文件中,已将超时值调整为包含远程页面的两个常规自动刷新以及一些刷新,并将reload_url其设置为URL。

远程页面有一个片段,每次刷新正确执行时都会执行:

try {
    window.top.postMessage('tyrp', '*');
} catch(e){}

如果发生任何不良情况-该页面无法加载,无法加载404或错误或它的javascript出于某种原因而停止,或者某个劫持重定向将我们推到另一个页面,如果两个连续的刷新消息未能到达,则看门狗框架会重置URL到原始文件,然后自动执行重新加载。

请注意,try ... catch可以防止可能不支持postMessage的旧版浏览器出现问题。由于我们控制环境,并且始终可以确保使用正确的浏览器,因此信息亭不会有问题。OTOH,在不带框架侦听消息的随机客户端计算机上,postMessage操作为空操作,只要它不会导致脚本中止错误,请尝试..catch。


3

我使用xdotool模拟f5按键

pi@data-integrity-pi ~/log $ cat ~/bin/refresh_kiosk.sh
DISPLAY=:0 xdotool search --name ci-monitor windowactivate --sync key F5 >> ~/log/tmp.log 2>&1

然后在我的crontab中,每分钟运行一次该脚本

 */1 *   *   *   *    /home/pi/bin/refresh_kiosk.sh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.