รีเฟรชอัตโนมัติสำหรับ Midori


11

ฉันใช้ Raspberry Pi เพื่อสร้างเว็บตู้แบบไม่โต้ตอบ - หน้าเว็บเฉพาะ (วัดจากสถานีตรวจสอบระยะไกล) เพื่อแสดงบนหน้าจอในโหมดเต็มหน้าจอเนื้อหารีเฟรชผ่าน AJAX

ตอนนี้มีวิธีแก้ปัญหาเล็กน้อยที่จะทำให้ราสเบอร์รี่เป็นตู้และฉันค่อนข้างแน่ใจว่าฉันจะสามารถทำได้ดี แต่ตู้ควรจะบำรุงรักษาฟรี โดยเฉพาะอย่างยิ่งในสถานการณ์ที่ไฟฟ้าดับแล้วกลับมาอีก แต่โครงสร้างพื้นฐานของเราเตอร์ / โมเด็ม / เครือข่ายก็ไม่ได้ออนไลน์

ในสถานการณ์ดังกล่าว Midori จะปรากฏหน้าเกี่ยวกับ "ไม่สามารถเชื่อมต่อ" หรืออะไรทำนองนั้นและมันจะติดอยู่เช่นนี้จนกว่าจะมีใครซักคนรอบพลังงานอีกครั้ง - เนื่องจากหน้าเว็บรวมถึงกลไกการโหลดอัตโนมัติเองไม่สามารถโหลดได้!

ตอนนี้ฉันจะบังคับให้ Midori โหลดหน้าเว็บได้เมื่อเครือข่ายพร้อมใช้งานอีกครั้งหรือบางสิ่งที่มีลักษณะคล้ายกัน (รีเฟรชอัตโนมัติทุก ๆ 15 นาทีหรือมากกว่านั้นหรือจะรีเฟรชจนกว่าจะโหลดหน้าเว็บหรืออะไรทำนองนั้น)

หากตัวเลือกนั้นใช้ไม่ได้กับ Midori คุณสามารถแนะนำวิธีแก้ปัญหาอื่น ๆ ได้ไหม?


ตอนนี้ฉันยังไม่สามารถเข้าถึง Pi และ Midori ได้ แต่ Midori อาจสนับสนุน dbus อยู่ใช่ไหม คุณสามารถลองใช้งานqdbus(จากแพ็คเกจlibqt4-dbus) หรือเครื่องมือที่คล้ายกันและมองหา Midori ในนั้น จากนั้นส่วนใหญ่คุณสามารถเรียกการรีเฟรชหน้า
Arne

ดียิ่งขึ้น: ดูเหมือนว่า Midori มีบางอย่างในตัว บางทีคุณสามารถลองและโพสต์คำตอบได้ที่นี่
Arne

คำตอบของฉันไม่เป็นประโยชน์หรือไม่? คุณต้องการให้ฉันเขียนสคริปต์ทุบตีแทน Python หรือไม่? หากคุณต้องการใช้ crontab มีข้อผิดพลาดใดบ้างที่คุณสามารถตอบกลับได้?
xxmbabanexx

@xxmbabanexx: มันมีประโยชน์และแน่นอนฉันจะยอมรับมันหากไม่มีสิ่งใดที่ดีกว่า ฉันพบโซลูชันสำรองซึ่งฉันจะโพสต์เมื่อพัฒนาเต็มที่ ฉันยังหวังว่าจะมีใครบางคนออกมาพร้อมกับโซลูชันที่ไม่สามารถรีเฟรชได้หากหน้าเว็บนั้นใช้งานได้ดี แต่ถ้าไม่เกิดขึ้นคำตอบของคุณก็เป็นที่ยอมรับอย่างสมบูรณ์และฉันจะยอมรับมัน
เอสเอฟ

@sf ขอบคุณสำหรับข้อมูลเพิ่มเติม เมื่อฉันทำการบ้านคณิตศาสตร์เสร็จฉันจะแก้ไขสคริปต์เพื่อรวมการตรวจสอบการเชื่อมต่อเครือข่าย
xxmbabanexx

คำตอบ:


6

cronสมมติว่าคุณมีงูหลามในระบบของคุณมีทางเลือกที่จะ ฉันได้สร้างสคริปต์ Python 2.7.3 อย่างรวดเร็วซึ่งจะโหลด Midori ทุกๆ 5 นาที

#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 ด้วยตนเอง เปิดจากสคริปต์ ฉันมีนิสัยแปลก ๆ ในการหยุดทำงานเนื่องจาก Speed ​​Dialer ถ้าคุณทำอย่างอื่น มันยังทำงานบน 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 เต็มหน้าจอ

จะเปิดhttp://www.google.com/ในหน้าต่างเต็มหน้าจอและรีเฟรชหน้าเว็บหลังจากไม่มีการใช้งาน 2 นาที ( -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 หรือข้อผิดพลาดหรือจาวาสคริปต์หยุดไม่ว่าด้วยเหตุผลใดก็ตามหรือการเปลี่ยนเส้นทางไฮแจ็คบางส่วนผลักเราไปยังหน้าอื่นหากข้อความรีเฟรชติดต่อกันสองรายการ กลับไปเป็นต้นฉบับซึ่งจะทำการโหลดซ้ำโดยอัตโนมัติ

หมายเหตุการลอง ... catch คือการป้องกันปัญหากับเบราว์เซอร์รุ่นเก่าซึ่งอาจไม่สนับสนุน postMessage สิ่งนี้จะไม่เป็นปัญหากับคีออสก์เนื่องจากเราควบคุมสภาพแวดล้อมและสามารถมั่นใจได้ว่าจะใช้เบราว์เซอร์ที่ถูกต้องเสมอ OTOH บนคอมพิวเตอร์ไคลเอนต์แบบสุ่มที่ไม่มีเฟรมฟังข้อความการดำเนินการ postMessage นั้นไม่มีการ op ตราบใดที่มันไม่ทำให้เกิดข้อผิดพลาดในการยกเลิกสคริปต์จึงลอง ..


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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.