Tự động làm mới cho Midori


11

Tôi đang sử dụng Raspberry Pi để tạo kiosk web không tương tác - một trang web cụ thể (đo từ trạm giám sát từ xa) sẽ được hiển thị trên màn hình ở chế độ toàn màn hình, nội dung được làm mới thường xuyên thông qua AJAX.

Bây giờ có khá nhiều giải pháp để biến Raspberry thành một ki-ốt và tôi khá chắc chắn rằng tôi sẽ có thể làm điều đó tốt, nhưng kiosk nên không cần bảo trì. Đặc biệt là trong trường hợp mất điện, sau đó bật lại, nhưng bằng cách nào đó, cơ sở hạ tầng bộ định tuyến / modem / mạng không hoàn toàn xuất hiện trực tuyến.

Trong tình huống đó, Midori sẽ đưa ra một trang về "không thể kết nối" hoặc một cái gì đó tương tự và nó sẽ bị kẹt như thế này cho đến khi ai đó quay vòng nguồn một lần nữa - vì trang web bao gồm cơ chế autorefresh của chính nó không tải được!

Bây giờ làm cách nào tôi có thể buộc Midori tải trang khi mạng khả dụng trở lại hoặc có hiệu ứng tương tự (tự động làm mới luôn sau mỗi 15 phút hoặc lâu hơn, hoặc tiếp tục làm mới cho đến khi trang tải hoặc một cái gì đó tương tự.)?

Nếu tùy chọn đó không có sẵn cho Midori, bạn có thể đề xuất một số giải pháp khác không?


Tôi chưa có quyền truy cập vào Pi ngay bây giờ và cả Midori, nhưng có lẽ Midori có hỗ trợ dbus? Bạn có thể thử chạy qdbus(từ gói libqt4-dbus) hoặc một số công cụ tương tự và tìm Midori trong đó. Sau đó, rất có thể bạn có thể kích hoạt làm mới trang.
Arne

Thậm chí tốt hơn: Có vẻ như Midori có một cái gì đó được xây dựng . Có lẽ bạn có thể thử điều đó và gửi một câu trả lời ở đây.
Arne

Là câu trả lời của tôi không hữu ích? Bạn có muốn tôi viết một tập lệnh bash thay vì Python không? Nếu bạn cần sử dụng crontab, có lỗi nào bạn có thể trả lời không?
xxmbabanexx

@xxmbabanexx: Nó rất hữu ích và tôi chắc chắn sẽ chấp nhận nó nếu không có cái nào tốt hơn xuất hiện. Tôi đã tìm thấy một giải pháp thay thế mà tôi sẽ đăng một khi được phát triển đầy đủ. Tôi vẫn hy vọng ai đó đưa ra giải pháp không thực hiện làm mới nếu trang hoạt động tốt nhưng nếu điều đó không xảy ra, câu trả lời của bạn là hoàn toàn chấp nhận được và tôi sẽ chấp nhận.
SF.

@sf. Cảm ơn thông tin bổ sung. Khi tôi hoàn thành bài tập về nhà toán học, tôi sẽ chỉnh sửa tập lệnh của mình để bao gồm kiểm tra kết nối mạng.
xxmbabanexx

Câu trả lời:


6

Giả sử rằng bạn có Python trên hệ thống của mình, có một giải pháp thay thế cron. Tôi đã tạo một tập lệnh Python 2.7.3 nhanh chóng để tải lại Midori cứ sau 5 phút.

#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. 

Nếu bạn cần thay đổi lượng thời gian nghỉ ngơi, chỉ cần thay đổi rest_timebiến.

Tập lệnh mới

Như bạn nói rằng bạn cần chương trình "thông minh", tôi đã chỉnh sửa nó để làm cho nó trở nên như vậy. Khi sử dụng chương trình này, vui lòng không mở Midori bằng tay; mở nó từ kịch bản. Tôi có một thói quen kỳ lạ là bị rơi do Trình quay số nhanh nếu bạn làm khác. Nó cũng chạy trên Python 2.7.3. Nếu bạn không muốn thực hiện tất cả các bản sao đó và dán, vui lòng truy cập pastebin của mã.

"""
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

Chỉ trong trường hợp bất kỳ ai đi qua và đang tìm kiếm một câu trả lời cập nhật, Midori hiện có một tùy chọn dòng lệnh --inactivity-reset=SECONDS(hoặc -iviết tắt).

Kết hợp với -atùy chọn, bạn có thể đạt được trình duyệt khởi động lại liên tục ở chế độ kiosk mỗi x giây.

ví dụ

midori -a http://www.google.com/ -i 120 -e Toàn màn hình

Sẽ mở http://www.google.com/ trong cửa sổ toàn màn hình và làm mới trang sau 2 phút không hoạt động. ( -ethực hiện một lệnh)


4

Tôi quyết định tiếp cận nó từ một khía cạnh khác, chủ yếu là độc lập với trình duyệt.

Trình duyệt được khởi động ở chế độ kiosk, chỉ vào một tài liệu cục bộ cụ thể:

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>

Bây giờ trong tệp này, giá trị thời gian chờ được điều chỉnh để chứa hai ô tự động bình thường của trang từ xa cộng với một số và reload_urlđược đặt thành URL của nó.

Trang từ xa có một đoạn được thực thi mỗi khi việc làm mới của nó được thực hiện chính xác:

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

Nếu có bất cứ điều gì xấu xảy ra - trang không tải được, tải dưới dạng 404 hoặc lỗi hoặc javascript của nó dừng vì bất kỳ lý do gì hoặc một số chuyển hướng không tặc đẩy chúng tôi đến một trang khác, nếu hai thông báo làm mới liên tiếp không đến, khung theo dõi sẽ đặt lại URL đến bản gốc, tự động thực hiện tải lại.

Lưu ý, thử ... bắt là để ngăn sự cố với các trình duyệt cũ hơn có thể không hỗ trợ postMessage. Đây sẽ không phải là vấn đề với kiosk vì chúng tôi kiểm soát môi trường và luôn có thể đảm bảo trình duyệt phù hợp sẽ được sử dụng. OTOH, trên các máy tính khách ngẫu nhiên không có khung nghe các thông báo, thao tác postMessage sẽ không hoạt động miễn là nó không gây ra lỗi hủy tập lệnh, do đó, hãy thử..catch.


3

Tôi sử dụng xdotool để mô phỏng phím nhấn 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

và sau đó trong crontab của tôi, tôi chạy kịch bản đó mỗi phút

 */1 *   *   *   *    /home/pi/bin/refresh_kiosk.sh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.