You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Ubuntu/Orange Pi5终端获取Kiosk模式Chromium的打开标签页

问题描述
  • 核心需求:开发PowerShell脚本管理数字显示屏,目标是仅当Kiosk模式下Chromium的当前标签页与目标URL不一致时才执行刷新,替代当前每30分钟强制重启的糟糕体验。
  • 当前痛点:无法通过终端/命令获取Kiosk模式下Chromium的活跃标签页;尝试BroTab工具因Ubuntu与Chromium兼容问题失败;手动启动浏览器时历史记录会更新,但终端启动时不更新。
  • 待完善功能:添加错误日志与邮件通知机制;将脚本重构为模块化函数;优化保活逻辑。
当前未完成脚本
##SCRIPT TO RERESH AND MANAGE PI BOXES FOR DISPLAYS##
$getr=$null;

##SET VARIABLES TO GET DATES AND FOR SPECIFIC TIMES IN REGARDS TO UPDATES
$Calendar = Get-Date
$updatestart = Get-Date -Hour 11 -Minute 55
$updatecutoff = Get-Date -Hour 12 -Minute 01

##SET VARIABLES FOR PI INSTRUCTIONS
$exitchrome = "killall -9 chromium-browser &>/dev/null; exit;" ##QUITS BROWSER AND EXITS SCRIPT - HAS TO BE DONE AS CANNOT BE RUN WITH FOLLWOING COMMANDS

Get-Content -Path "C:\temp\ip.txt" | Foreach-Object { ##LOOP THROUGH CONTENTS OF TEXT FILE - IP.TXT
$textfile = $_;

$pos = $textfile.IndexOf("|") ## LOOK FOR PIPE CHARECTER IN TEXT FILE     
$link_string = $textfile.Substring($pos+1) ##CONTENTS AFTER PIPE CHARECTER
$ip = $textfile.Substring(0, $pos) ##CONTENTS BEFORE PIPE CHARECTER
echo $ip

$chrome = "DISPLAY=:0 chromium-browser " + $link_string + " --kiosk --disable-session-crashed-bubble --disable-infobars &>/dev/null &" ##STARTS BROWSER IN KIOSK MODE ON DESKTOP WITH THE DEFINED URLS - ALL ON SCREEN MESSAGES DISABLED

##PLAY CODE##
    $i = 0
    $c = 0
    $w = 1
$wb_chk = "cat -e ~/.config/chromium/Default/Sessions/Tabs_* | sed -e 's/\^@/\n/g' -e '/_\/chrome/d' | grep -Po '(http|https)://\K.*' | sort -u" ##CHECK BROWSER FOR OPEN TABS ASSIGNED TO VARIABLE
$wb_chk_res = ssh orangepi@"$ip" -X "$wb_chk" | Out-String

foreach($url_array in -split $link_string)
{
    $url_array_pos = $url_array.IndexOf("/") ## LOOK FOR CHARECTER RETRUN IN VARIABLE    
    $url_array = $url_array.Substring($url_array_pos+2) ##REMOVE CONTENTS AFTER CHARECTER RETRUN
    $i++

foreach($wbl_chk in -split $wb_chk_res)
{
    $w++
    if ($wbl_chk -eq $url_array) {
    $c++
    }
}
}

echo "$w websites were checked"
echo "There are $c live on the display"
echo "$c websites match the $i URLS in the config file"

##PLAY CODE##

If ($Calendar.Day -eq '28' -AND $Calendar.TimeOfDay -gt $updatestart.TimeOfDay -AND $Calendar.TimeOfDay -lt $updatecutoff.TimeOfDay) { ##IF END OF THE MONTH, RUN UPDATES
ssh -p 222 pi@"$ip" -X "sudo apt-get update; sudo apt-get upgrade -y; sudo reboot;"
Start-Sleep -s 60
}

##CEHCK DISPLAY RES - CANNOT TO GET TO WORK AS A FUCNTION...
$getr = ssh orangepi@"$ip" -X "xrandr -display :0.0;" | Out-String
$res_pos = $getr.IndexOf(",") ## LOOK FOR COMMA CHARECTER IN VARIABLE    
$getr = $getr.Substring($res_pos+2) ##REMOVE CONTENTS AFTER COMMA CHARECTER
$res_pos = $getr.IndexOf(",") ## LOOK FOR COMMA CHARECTER IN VARIABLE    
$getr = $getr.Substring(0, $res_pos) ##REMOVE CONTENTS BEFORE COMMA CHARECTER
$res_pos = $getr.IndexOf(" ") ## LOOK FOR CHARECTER RETRUN IN VARIABLE    
$getr = $getr.Substring($res_pos+1) ##REMOVE CONTENTS AFTER CHARECTER RETRUN

$uptime = ssh orangepi@"$ip" -X "awk '{print $1}' /proc/uptime" | Out-String
$up_pos = $uptime.IndexOf(" ") ## LOOK FOR CHARECTER RETRUN IN VARIABLE    
$uptime = $uptime.Substring(0,$up_pos) ##CONTENTS AFTER CHARECTER RETRUN
echo $uptime
echo $getr

if ($uptime -lt "1800.00" -Or $getr -ne "1920 x 1080") {
echo "Forcing Display Resolution";
ssh orangepi@"$ip" -X "sudo service lightdm restart;"
Start-Sleep -s 10;
ssh orangepi@"$ip" -X "$chrome";
Start-Sleep -s 10;
ssh orangepi@"$ip" -X "$exitchrome";
Start-Sleep -s 10;
$getr=$null;
}

$MATICS = select-string -pattern "xxx.my.leadermes.com" -InputObject $link_string ##LOOK FOR MATICS URL FOR SYNTHEIC MOUSE CLICKS
if ($MATICS -ne $null)
{
$getr = ssh orangepi@"$ip" -X "xrandr -display :0.0;" | Out-String
$res_pos = $getr.IndexOf(",") ## LOOK FOR COMMA CHARECTER IN VARIABLE    
$getr = $getr.Substring($res_pos+2) ##CONTENTS AFTER COMMA CHARECTER
$res_pos = $getr.IndexOf(",") ## LOOK FOR COMMA CHARECTER IN VARIABLE    
$getr = $getr.Substring(0, $res_pos) ##CONTENTS BEFORE COMMA CHARECTER
$res_pos = $getr.IndexOf(" ") ## LOOK FOR CHARECTER RETRUN IN VARIABLE    
$getr = $getr.Substring($res_pos+1) ##CONTENTS AFTER CHARECTER RETRUN
echo "MATICS ON DISPLAY";
ssh orangepi@"$ip" -X "$exitchrome";
ssh orangepi@"$ip" -X "$chrome";

if ($getr -eq "1920 x 1080") {
echo "$getr live";
Start-Sleep -s 15
ssh orangepi@"$ip" -X "DISPLAY=:0 xdotool key Return; exit;"
Start-Sleep -s 20
ssh orangepi@"$ip" -X "DISPLAY=:0 xdotool key Tab Tab space mousemove 220 60 click 1; exit;"
Start-Sleep -s 20
ssh orangepi@"$ip" -X "DISPLAY=:0 xdotool mousemove 1860 180 click 1 mousemove 1920 1080; exit;"
$getr=$null;
}
}

else
{
echo "MATICS IS NOT ON THIS DISPLAY";
ssh orangepi@"$ip" -X "$exitchrome";
ssh orangepi@"$ip" -X "$chrome";
}
}
解决方案与优化建议

1. 核心问题:Kiosk模式Chromium标签页检测

方案一:利用Chromium远程调试接口

这是最可靠的方案,不受启动方式影响:

  • 修改Chromium启动命令,添加远程调试参数:
    DISPLAY=:0 chromium-browser $link_string --kiosk --disable-session-crashed-bubble --disable-infobars --remote-debugging-port=9222 --remote-debugging-address=0.0.0.0 &>/dev/null &
    
  • 在PowerShell中通过HTTP请求获取标签页信息:
    try {
        $tabs = Invoke-RestMethod -Uri "http://$ip`:9222/json" -ErrorAction Stop
        $currentUrls = $tabs | Where-Object { $_.type -eq 'page' } | Select-Object -ExpandProperty url
    }
    catch {
        Write-Error "无法连接到Chromium远程调试接口:$_"
        $currentUrls = @()
    }
    
    此方法可直接获取所有活跃标签页的完整URL,用于和目标URL对比。

方案二:修正会话文件读取逻辑

如果不想启用远程调试,可修复原有会话文件读取问题:

  • 确认Chromium运行用户:执行ps aux | grep chromium-browser查看实际运行用户,将命令中的~替换为用户目录(比如/home/orangepi)。
  • 强制Chromium写入会话:在检测标签页前发送信号让Chromium保存会话:
    pkill -SIGUSR1 chromium-browser
    sleep 2
    
  • 优化正则匹配:原命令的URL提取逻辑可能不完整,改用更稳定的正则:
    cat ~/.config/chromium/Default/Sessions/Tabs_* | strings | grep -E 'https?://[^"]+' | awk -F'"' '{print $2}' | sort -u
    

2. 脚本模块化重构

将重复逻辑封装为函数,提升可读性和维护性:

# 获取显示分辨率
function Get-DisplayResolution {
    param([string]$Ip)
    $output = ssh orangepi@$Ip -X "xrandr -display :0.0" 2>&1 | Out-String
    $match = [regex]::Match($output, '\b(\d+ x \d+)\b')
    return $match.Success ? $match.Groups[1].Value : $null
}

# 执行Orange Pi命令并处理错误
function Invoke-PiCommand {
    param([string]$Ip, [string]$Command)
    try {
        return ssh orangepi@$Ip -X $Command 2>&1 | Out-String
    }
    catch {
        Write-Log "IP $ip 执行命令失败:$Command,错误:$_"
        return $null
    }
}

# 写入日志
function Write-Log {
    param([string]$Message, [string]$LogPath = "C:\temp\display_manager.log")
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    Add-Content -Path $LogPath -Value "[$timestamp] $Message"
}

# 发送告警邮件
function Send-AlertEmail {
    param([string]$Subject, [string]$Body)
    Send-MailMessage -From "display-alert@yourdomain.com" -To "admin@yourdomain.com" `
        -Subject $Subject -Body $Body -SmtpServer "smtp.yourdomain.com"
}

3. 优化保活逻辑

仅在必要时重启Chromium,避免强制刷新:

# 对比目标URL与当前标签页
$targetUrls = $link_string -split '\s+' # 根据实际分隔符调整
$urlsMatch = Compare-Object -ReferenceObject $targetUrls -DifferenceObject $currentUrls -IncludeEqual -ExcludeDifferent

if ($urlsMatch.Count -eq $targetUrls.Count) {
    Write-Log "IP $ip 的标签页与目标一致,无需重启"
}
else {
    Write-Log "IP $ip 的标签页不匹配,执行重启"
    Invoke-PiCommand -Ip $ip -Command $exitchrome
    Start-Sleep -Seconds 5
    Invoke-PiCommand -Ip $ip -Command $chrome
}

# 分辨率与uptime检查整合到保活逻辑中
$resolution = Get-DisplayResolution -Ip $ip
$uptime = [double](Invoke-PiCommand -Ip $ip -Command "awk '{print $1}' /proc/uptime")

if ($uptime -lt 1800 -or $resolution -ne "1920 x 1080") {
    Write-Log "IP $ip 分辨率异常或系统运行时间过短,强制修复"
    Invoke-PiCommand -Ip $ip -Command "sudo service lightdm restart"
    Start-Sleep -Seconds 10
    Invoke-PiCommand -Ip $ip -Command $chrome
}

4. 其他注意事项

  • 确保Orange Pi开放9222端口(如果用远程调试),或配置防火墙允许本地访问。
  • 配置Orange Pi用户免密sudo,避免脚本执行时需要输入密码。
  • 定期清理Chromium缓存,避免Kiosk模式下出现加载异常。

内容的提问来源于stack exchange,提问作者M.Atkinson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 11:42:34