一个本地运行在 macOS 上的桌面工具,用来读取网页报警列表,整理成消息,并通过企业微信自动发送。
当前版本是 SwiftUI macOS 壳层 + 内置 Python 子进程服务。构建后的 .app 会把 Python worker 和依赖一起放进 App bundle,支持打包成 .dmg 给内部用户分发。
- 持续轮询目标网页,按单条串行方式处理报警
- 从页面表格读取报警字段,按报警类型白名单过滤,并结合项目内规则表与详情浮窗字段生成企业微信消息
- 自动切换到企业微信,搜索群聊并发送消息
- 可选地在发送前后回到网页处理同一条报警
- 把真正完成闭环的报警写入归档
- 把失败条目标记为
需人工介入,避免后续轮询反复撞同一条
当前自动流程的固定顺序是:
抓取 1 条 -> 按报警类型白名单过滤 -> 按规则表匹配报警规则 -> 打开详情读取报警信息并拼文案 -> 正式执行时先确认处理 -> 发送企业微信 -> 正式执行时再关闭同条 -> 满足条件时归档
- macOS
- 已安装 Google Chrome
- 已安装企业微信
推荐分发文件是:
dist/AlertBridge.dmg
用户双击打开 DMG 后,把 AlertBridge.app 拖到 Applications 即可。
如果 macOS 第一次打开时提示无法验证开发者,右键 AlertBridge.app 选择 打开,再按系统提示确认。
如果这台机器需要改代码或重新打包,先在项目目录执行:
- 打开终端,进入项目目录
- 执行:
chmod +x ./scripts/setup_mac.sh
./scripts/setup_mac.sh这个脚本会自动处理下面这些事:
- 检查 macOS 开发工具是否可用
- 检查 Homebrew 是否已安装
- 检查
python3是否已安装,不存在时自动安装 - 创建项目内
.venv - 安装
requirements.txt里的依赖 - 构建当前机器可用的
AlertBridge.app
如果脚本提示缺少 Homebrew 或 Xcode Command Line Tools,按它打印的命令先安装,再重新执行一次同一个脚本即可。
程序通过 Chrome DevTools 远程调试接口读取页面,默认连接地址是:
http://127.0.0.1:9222
使用前先完整退出 Chrome,然后执行:
open -na "Google Chrome" --args --remote-debugging-port=9222如果你更习惯直接执行 Chrome 二进制,也可以用:
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --remote-debugging-port=9222启动后,在浏览器里打开下面地址,如果能看到 JSON 响应,就说明远程调试已经开启:
http://127.0.0.1:9222/json/version
也可以打开下面这个页面查看 Chrome 是否已经暴露远程调试目标:
chrome://inspect/#remote-debugging
注意:
- 如果 Chrome 之前没有完全退出,新的远程调试参数可能不会生效
- 如果你把调试端口改成了别的值,需要在应用的
Chrome 调试地址里同步修改 - 如果目标页面需要登录,请在这个已开启远程调试的 Chrome 窗口里先完成登录
企业微信自动输入和窗口切换依赖 macOS 辅助功能权限。
打开路径:
系统设置 -> 隐私与安全性 -> 辅助功能
把 AlertBridge.app 加入允许列表。
如果这个权限没开,企业微信自动化大概率不能正常工作。
也可以直接在 Finder 里双击:
仓库根目录下的 AlertBridge.app
如果是第一次打开,macOS 可能会要求你右键应用后选择“打开”。
当前不是旧版的“左边表单 + 右边日志”布局,而是单窗口主视图配三个底部抽屉。
窗口顶部中间有两个页签:
抓取归档
默认进入 抓取 页。
第一次打开且还没有抓取记录时,中间会看到空状态卡片:
配置:打开配置抽屉开始:启动自动监控
启动过一次后,右上角会常驻 开始 / 停止 按钮,用来控制自动监控。
抓取 页按状态分组展示当前记录:
需人工介入已抓取已发送
每条记录会尽量按结构化字段显示,优先展示:
车牌号所属企业报警规则
项目根目录固定有一份规则表:
./alarm_rule_mapping.csv
程序会按里面的 报警规则 匹配发送文案、通知人、处理模版和处理方式。
项目根目录还有一份企业共享群路由表:
./enterprise_group_mapping.csv
表头为:
企业名称,目标群聊
当目标群模式选择 企业名称 时,程序会先用报警里的 所属企业 精确匹配这张表。命中后发送到 目标群聊;未命中时仍按原逻辑发送到同名企业群。
如果某条记录进入 需人工介入,会显示失败阶段和原因,并带一个 标记已处理 按钮。
点 标记已处理 后:
- 这条人工介入记录会从列表里移除
- 这条报警的冻结状态会解除
- 后续轮询如果再次读到它,会重新按正常流程处理
归档 页按日期分组展示历史归档。
只有同时满足下面两个条件,报警才会进入这里:
- 已开启
读取后自动处理告警条目 - 执行模式是
正式执行
也就是只有真正完成网页里的 确认处理 和 关闭 后,才会写入归档。
右上角从左到右是:
配置调试日志
三个按钮互斥,同一时间只会展开一个底部抽屉。
点右上角 配置 按钮后,会展开配置抽屉。
这里包含当前版本真正生效的配置项:
抓取页面地址抓取字段报警类型白名单目标群名称读取后自动处理告警条目执行模式通知人处理方式
点右上角 保存 才会把当前修改同步给后端服务。
应用会带一个内置默认地址,但文档里不展示具体值。
程序会优先确保 Chrome 已连接并打开这里填写的目标页面。实际使用时,请改成你自己的业务页面地址。
默认值:
车牌号, 所属企业, 报警规则
这是读取表格时优先抽取和展示的字段名。字段名最好和页面表头基本一致。
发送企业微信时,真正参与拼文案的占位符值会从“查看详情”浮窗左侧报警信息里读取,不直接依赖这里的展示字段。
默认值:
疲劳驾驶报警, 超速报警, 离线报警, 离线位移
只有 报警类型 命中这里配置的条目才会进入后续发送和处理流程,其他报警会被直接忽略。
这里其实是一个目标群匹配模式,不是手输群名输入框。当前有两个选项:
测试企业名称
含义如下:
测试:固定发送到企业微信群测试企业名称:先按报警里的所属企业精确匹配enterprise_group_mapping.csv,命中则发送到表内目标群;未命中则搜索同名企业微信群
是:会继续处理刚才那一条报警。正式执行时顺序是先打开详情并确认处理,再发送企业微信,发送成功后回网页点击关闭否:只发送企业微信,不回网页处理
安全演练:会打开详情并读取报警信息来生成消息,但会跳过确认处理的识别与点击,也不会点击关闭正式执行:会真正点击确认处理和关闭,并且只有两步都完成后才会归档
发送后如果继续处理网页告警,会把这里的内容填进对应表单。
默认值:
安全负责人
如果 alarm_rule_mapping.csv 里命中了对应报警规则,这里的默认值会被规则表中的 通知人 覆盖。
发送后如果继续处理网页告警,会把这里的内容填进对应表单。
默认值:
微信/企业微信
如果 alarm_rule_mapping.csv 里命中了对应报警规则,这里的默认值会被规则表中的 处理方式 覆盖。
配置抽屉底部有 3 个危险操作:
清空记录:清空抓取记录和抓取日志,不删配置清空归档:删除全部归档内容和归档文件清空人工介入:删除全部需人工介入条目并解除冻结
这些操作都有确认弹层。
点右上角 调试 按钮后,会展开调试抽屉。
这里有一个 Chrome 调试地址 输入框,默认是:
http://127.0.0.1:9222
下面是当前版本实际可用的调试动作:
和主界面的 开始 / 停止 是同一件事。
启动后,程序会按固定间隔持续轮询目标页面。当前轮询间隔是 15 秒。
每轮会:
- 读取当前页面
- 去重并锁定待处理报警
- 一条一条串行发送
- 按配置决定是否继续网页处理
已经发送过的条目会跳过;已经进入 需人工介入 的条目也会跳过,直到你手动清理或标记完成。
作用:
- 连接 Chrome
- 打开目标页
- 读取 1 条报警
- 发送企业微信消息
- 按当前配置决定是否继续处理同一条网页报警
特点:
- 这是单条串行联调
- 会写抓取日志
- 不会写入
归档页 - 过程中失败会转成
需人工介入
作用:
- 不读网页
- 直接向目标群发送一条固定样例消息
固定样例内容是:
报警通知
车牌号:测试车牌
所属企业:测试企业
报警规则:测试规则
特点:
- 用来验证企业微信自动化链路
- 不读取 Chrome
- 不写抓取归档
作用:
- 打开目标页
- 测试页面侧边栏的展开和收回
这个动作只验证页面交互链路,不发消息。
作用:
- 读取 1 条报警
- 打开详情
- 填写
通知人和处理方式
特点:
- 不发送企业微信消息
- 固定按安全方式执行
- 不会点击
确认处理 - 不会写入
归档页
点右上角 日志 按钮后,会展开操作日志抽屉。
这里有几个常用控制:
清空:清空当前界面里的日志显示Debug: 开/关:控制是否收集普通操作日志全部 / 仅错误:切换日志过滤条件
注意当前实现里:
Debug: 关时,默认主要收集错误日志Debug: 开时,普通操作过程日志也会进入这里
如果你要排查完整执行链路,先把 Debug 打开。
- 打开应用
- 在
配置里确认目标群名称模式 - 打开
调试 - 点击
测试发送消息 - 去企业微信确认是否发出
- 打开
配置 - 确认
抓取页面地址和抓取字段 - 先把
执行模式设为安全演练 - 按需要设置
通知人和处理方式 - 打开
调试 - 点击
读取网页测试 - 在
抓取页和日志抽屉观察结果
- 先完成上面的单步联调
- 在
配置里确认是否要开启读取后自动处理告警条目 - 只有确认网页处理链路已经稳定后,再切到
正式执行 - 点击主界面
开始或调试抽屉里的启动监控
~/Library/Application Support/AlertBridge/captures
~/Library/Application Support/AlertBridge/archive
~/Library/Application Support/AlertBridge/manual_review
~/Library/Application Support/AlertBridge/settings.json
登录密码不写入 settings.json,由 macOS Keychain 保存。
先检查:
- 企业微信是否已安装并可正常启动
- macOS 辅助功能权限是否已打开
- 企业微信窗口是否能被正常切到前台
先检查:
- Chrome 是否安装在默认位置
- 目标页面是否已经登录
抓取页面地址是否正确抓取字段是否和页面表头名称基本一致Chrome 调试地址是否可用
去 日志 抽屉,把 Debug 打开。
这是正常的,只有真正完成网页里的 确认处理 和 关闭 才会归档。下面任一情况都不会写归档:
- 只做
测试发送消息 - 只做
读取网页测试 - 关闭了
读取后自动处理告警条目 - 当前还是
安全演练
这一节面向需要改代码和重新编译应用的开发者。普通使用者可以直接跳过。
python3 -m venv .venv
./.venv/bin/python -m pip install -r requirements.txt构建脚本默认使用仓库内的 .venv/bin/python。如果你要改用别的 Python,可以在编译前设置环境变量:
ALERTBRIDGE_PYTHON_BIN=/your/python/path
当前构建流程会复用仓库里的 assets/app_icon.png 生成 AppIcon.icns,并把 Python worker 与依赖复制进 App bundle。
./scripts/build_swiftui_app.sh编译完成后,应用产物位于仓库根目录:
./AlertBridge.app
构建脚本会把下面内容一起打进 App bundle:
Contents/Resources/pythonContents/Resources/alertbridge-pythonContents/Resources/AppIcon.icns
App 启动时会优先使用 bundle 内的 Python worker;开发调试时仍保留本地项目路径 fallback。
./scripts/package_dmg.sh打包完成后,分发产物位于:
./dist/AlertBridge.dmg
DMG 里包含:
AlertBridge.appApplications快捷方式
python3 -m venv .venv
./.venv/bin/python -m pip install -r requirements.txt
./scripts/build_swiftui_app.sh
./scripts/package_dmg.sh当前构建目标是 Apple Silicon macOS 13+:
arm64-apple-macos13.0
内部使用时不需要上架 App Store。当前签名是 ad-hoc 签名,所以首次打开可能需要右键选择 打开。
swiftui-shell/:SwiftUI macOS 壳层和界面alertbridge_service/:SwiftUI 与 Python 服务之间的 JSON 桥接入口app/:状态管理、控制器、日志、归档、人工介入存储browser/:Chrome 页面连接、读取和页面操作wecom/:企业微信自动发送逻辑scripts/:初始化、构建和 DMG 打包脚本
当前版本重点已经切到可用性和串行闭环,暂时没有做这些:
- 系统托盘
- 数据库持久化
- 更复杂的调度策略
- 更细粒度的业务去重规则