Windows下使用hook添加任务完成通知(定制你的个性化通知)

Update:iflow v0.5.2版本更新了会话完成的弹窗通知提示,如果只需要完成的弹窗提示,可以无需自己配置了,默认就有了,如果想要其他的弹窗提示,例如授权等,可以使用下述方式。


之前看过大佬分享的添加hook发送通知的教程,奈何要么是Mac环境的,要么执行sh脚本在我这里一直无法执行触发,今天试了下,通过第三方的BurnToastNotification,执行python脚本的方式可以触发了,定制一个属于你的iflow弹出通知。

首先需要一个能够调用windows系统通知中心的插件,我这里选择了BurnToastNotification,Github地址:Windos/BurntToast: Module for creating and displaying Toast Notifications on Microsoft Windows 10.

好处是

  • 安装简单,一行命令即可安装成功
Install-Module -Name BurntToast
  • 定制化强,可以定制你的通知的标题,内容,属性文字,图标,声音,甚至是添加延迟提醒等交互操作。

具体步骤:

  1. 先按照官方说明,在命令行安装好BurnToastNotification。
  2. 然后配置你的通知提醒的python脚本,代码我用AI生成的 :smiley: ,放下边了:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Stop hook脚本-任务完成通知

import subprocess
import os

def send_notification():
    """发送任务完成通知"""
    try:
        # 构建PowerShell命令,我这里加了个图标文件,配置了通知的标题,内容和属性文字,通过powsershell命令调用BurnToastNotification来发送弹出通知
        ps_command = (
            "New-BurntToastNotification -AppLogo ~/.iflow/hooks/iflow.png "
            "-Text 'Mission Complete!','iflow任务完成' -Attribution 'Powered by Samael'"
        )
        
        # 执行PowerShell命令[6,7,8](@ref)
        result = subprocess.run(
            ["powershell", "-Command", ps_command],
            capture_output=True,
            text=True,
            timeout=30
        )
        
        if result.returncode == 0:
            print("通知发送成功")
        else:
            print(f"通知发送失败: {result.stderr}")
            
    except subprocess.TimeoutExpired:
        print("PowerShell命令执行超时")
    except FileNotFoundError:
        print("未找到powershell命令,请确保在Windows系统中运行")
    except Exception as e:
        print(f"执行过程中发生错误: {e}")

def main():
    """主函数"""
    send_notification()

if __name__ == "__main__":
    main()

上边的python脚本中,我在powershell命令调用burnToastNotification发送系统通知时,加了个图标文件(如果你不改图标文件的话,BurnToast会用它默认的一个图标),也放到python文件同一个目录下了,就是~/.iflow/hooks/目录,如下图:

  1. 最后一步,在你的iflow的settings.json中,添加hook配置,我这里用~/.iflow/目录不生效(命名py中能用不知道为啥),所以我就改成完整路径了,小伙伴们可以根据你的情况来修改路径。
  "hooks": {
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "python c:/Users/26933/.iflow/hooks/stop.py"
          }
        ]
      }
    ],
    "Notification": [
      {
        "matcher": ".*permission.*",
        "hooks": [
          {
            "type": "command",
            "command": "python c:/Users/26933/.iflow/hooks/notification.py"
          }
        ]
      }
    ]
  }

最后的实际效果是这样 :grinning_face:

notification

在通知中心中也会有记录:

2 个赞

感谢分享!

妙啊,我也一直想使用hook,感谢分享!!

1 个赞

感谢大佬 :+1:

成功,但是不会python,直接用的powershell 脚本

Notify-IflowSuccess.ps1

Import-Module BurntToast -ErrorAction Stop
New-BurntToastNotification -Text “iflow finish”, “iflow success” -Silent

开心 :drooling_face:

1 个赞

可以可以,实现了就好,甚至更简单,棒 :wink:

请问大佬上面的stop.py里脚本内容是什么呀?只配置了notification发现不行欸

这个:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Stop hook脚本-任务完成通知

import subprocess
import os

def send_notification():
    """发送任务完成通知"""
    try:
        # 构建PowerShell命令,我这里加了个图标文件,配置了通知的标题,内容和属性文字,通过powsershell命令调用BurnToastNotification来发送弹出通知
        ps_command = (
            "New-BurntToastNotification -AppLogo ~/.iflow/hooks/iflow.png "
            "-Text 'Mission Complete!','iflow任务完成' -Attribution 'Powered by Samael'"
        )
        
        # 执行PowerShell命令[6,7,8](@ref)
        result = subprocess.run(
            ["powershell", "-Command", ps_command],
            capture_output=True,
            text=True,
            timeout=30
        )
        
        if result.returncode == 0:
            print("通知发送成功")
        else:
            print(f"通知发送失败: {result.stderr}")
            
    except subprocess.TimeoutExpired:
        print("PowerShell命令执行超时")
    except FileNotFoundError:
        print("未找到powershell命令,请确保在Windows系统中运行")
    except Exception as e:
        print(f"执行过程中发生错误: {e}")

def main():
    """主函数"""
    send_notification()

if __name__ == "__main__":
    main()

其实我stop.py和notification.py基本一样,就是具体的提示文案改了下

感谢解答,不过我发现是因为我的脚本配置错了。我用的是pwsh这个程序,所以

[“powershell”, “-Command”, ps_command],

应该换成

[“pwsh”, “-Command”, ps_command],

2 个赞

现在官方已经有这个功能咯~欢迎大家测试体验

  • 增加通知:在对话整体结束之后,提示用户结束,可以查看结果

    • macOS:首次出现 terminal-notifier 弹窗,需要用户手动选择允许通知,或者在"设置" => "通知"中允许 terminal-notifier 通知

    • Windows:"专注模式"无法弹出弹窗,会收缩在任务栏右下角的通知面板中,需要用户允许 SnoreToast 后续才会收到通知弹窗

1 个赞

希望未来能增加更多的,比如授权提醒,等待回答等等~

1 个赞
"Notification": [      {        "matcher": "*",        "hooks": [          {            "type": "command",            "command": "python c:/Users/26933/.iflow/hooks/notification.py"          }        ]      }    ]

试试这个

试过,只能hook授权啥的,无法hook计划模式的反问之类的

那太难受了,最近我还发现:Scavenge (reduce) (interleaved) 4061.6 (4098.3) → 4055.8 (4067.3) MB, pooled: 0 MB, 3.09 / 0.09 ms (average mu = 0.975, current mu = 0.960) allocation failure;
[46884:00000144B3481000] 1830864 ms: Mark-Compact (reduce) 4767.3 (4778.8) → 4766.8 (4777.8) MB, pooled: 0 MB, 23.43 / 0.00 ms (+ 2.8 ms in 0 steps since start of marking, biggest step 0.0 ms, walltime since start of marking 286 ms) (average mu = 0.966

node内存都不够用了,感觉像是优化的问题,没有正确释放

是的,cli还好一点点,acp的有人说mcp会残留node进程,桌面端启动一次就会新建一堆node进程,退出不会清理,多启动几次就爆内存了,还需要优化