在KDE Plasma 5中如何定期解析托盘通知并触发外部命令?
在KDE Plasma 5中如何定期解析托盘通知并触发外部命令?
我来帮你梳理一个可行的方案,刚好适配你需要的「定期扫描通知历史、匹配关键词后触发命令」的需求——毕竟系统自带的单事件绑定命令确实不够灵活,没法覆盖多来源的通知。
核心思路
KDE Plasma的通知历史是通过DBus接口对外暴露的,我们可以用命令行工具调用这个接口获取最近的通知,再用脚本解析内容、匹配关键词,最后通过cron定期运行这个脚本就行。
步骤1:编写解析通知的脚本
首先你需要安装两个工具:qdbus(KDE自带的DBus命令行工具,一般默认就有)和jq(用来解析JSON格式的通知数据,需要手动安装)。比如在Debian/Ubuntu系可以跑sudo apt install jq,openSUSE用sudo zypper install jq。
然后创建一个脚本(比如notification_parser.sh),内容如下:
#!/bin/bash # 配置部分 KEYWORD="VERY_IMPORTANT_MSG!!!!!!" # 要匹配的关键词 TRIGGER_COMMAND="echo '检测到重要通知,已触发命令' >> ~/notification_trigger.log" # 触发的外部命令 HISTORY_COUNT=10 # 每次扫描最近N条通知 PROCESSED_IDS_FILE=~/.processed_notification_ids # 存储已处理过的通知ID,避免重复触发 # 初始化环境变量(确保脚本能访问KDE的DBus会话) USER_UID=$(id -u) export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$USER_UID/bus" export DISPLAY=:0 # 初始化已处理ID文件 [ ! -f "$PROCESSED_IDS_FILE" ] && touch "$PROCESSED_IDS_FILE" # 获取最近的通知历史 NOTIFICATIONS=$(qdbus org.kde.plasma.notifications /Notifications org.kde.plasma.notifications.GetHistory "$HISTORY_COUNT") # 遍历每条通知,检查匹配情况 echo "$NOTIFICATIONS" | jq -r '.[] | "\(.id)|\(.summary)|\(.body)"' | while read LINE; do # 拆分通知ID、标题、内容 NOTIFICATION_ID=$(echo "$LINE" | cut -d'|' -f1) NOTIFICATION_SUMMARY=$(echo "$LINE" | cut -d'|' -f2) NOTIFICATION_BODY=$(echo "$LINE" | cut -d'|' -f3) # 跳过已经处理过的通知 if grep -q "^$NOTIFICATION_ID$" "$PROCESSED_IDS_FILE"; then continue fi # 检查标题或内容是否包含关键词 if [[ "$NOTIFICATION_SUMMARY" == *"$KEYWORD"* || "$NOTIFICATION_BODY" == *"$KEYWORD"* ]]; then # 执行触发命令 eval "$TRIGGER_COMMAND" # 标记该通知为已处理 echo "$NOTIFICATION_ID" >> "$PROCESSED_IDS_FILE" fi done
给脚本加上可执行权限:
chmod +x ~/notification_parser.sh
步骤2:测试脚本
先手动发一条测试通知:
notify-send "VERY_IMPORTANT_MSG!!!!!!"
然后运行脚本:
~/notification_parser.sh
之后查看日志文件~/notification_trigger.log,如果里面有新增的内容,说明脚本正常工作了。
步骤3:用cron定期运行脚本
现在配置cron让脚本定期执行,比如每5分钟跑一次:
- 打开cron编辑界面:
crontab -e
- 添加一行任务(注意替换成你的脚本路径):
*/5 * * * * /home/你的用户名/notification_parser.sh
- 保存退出即可。
额外说明
- 如果你的KDE会话的DISPLAY不是
:0(比如多显示器或远程桌面),可以在终端里跑echo $DISPLAY获取正确的值,然后修改脚本里的export DISPLAY=:0。 - 如果你不需要避免重复触发,可以删掉脚本里关于
PROCESSED_IDS_FILE的部分,简化逻辑。 qdbus获取的通知历史包含所有通知,不管是已读还是未读,完全符合你需要扫描「最近N条通知」的需求。
备注:内容来源于stack exchange,提问作者user1847935
相关产品推荐
相关产品推荐

