在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请求获取标签页信息:
此方法可直接获取所有活跃标签页的完整URL,用于和目标URL对比。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 = @() }
方案二:修正会话文件读取逻辑
如果不想启用远程调试,可修复原有会话文件读取问题:
- 确认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
相关产品推荐
相关产品推荐

