Halo2Bark
把 Halo 站点的关键事件实时推送到 Bark,新评论、新回复和账号安全告警第一时间到 iPhone。
🏠 主页:https://wuqishi.com
📦 仓库:https://github.com/NoEggEgg/Halo2Bark
🐛 反馈:https://github.com/NoEggEgg/Halo2Bark/issues
当前版本 v1.2.0,要求 Halo 2.26.0 及以上。已在 Halo 2.27.1 验证安装、启停、配置和 8 类核心事件。
特性
覆盖 8 类事件
| 事件 | 默认 | 说明 |
|---|---|---|
| 新评论 | ✅ | 覆盖文章、独立页面及第三方注册的评论主体 |
| 新回复 | ✅ | 含引用回复 |
| 评论待审核 | ✅ | 站点开启评论审核时生效 |
| 回复待审核 | ✅ | 站点开启评论审核时生效(Halo 的审核设置对回复同样生效) |
| 新设备登录 | ✅ | 安全事件,含系统、浏览器、IP、时间 |
| 文章发布 | — | 多人协作站点适用 |
| 新用户注册 | — | 便于监控异常注册 |
| 文章删除 / 取消发布 | — | 多人协作站点适用 |
安全事件会叫醒你
新设备登录走 Bark 的「重要警告」级别,响铃 30 秒,并且忽略系统的静音与免打扰。也就是说,账号安全的告警不会被你错过。这类事件的级别固定为「重要警告」,不能改,也不参与合并、不受静默时段约束、不占用限流配额。这几项故意不开放配置,免得被误设成低优先级后安全告警失去意义。
不刷屏
同一类事件在合并窗口(默认 2 分钟,可选 1 / 2 / 5 分钟)内集中出现时,会合并成一条摘要;评论爆发刚开始时会先收到一条「🔥 评论爆发中」,随后的合并摘要会原地替换这条过程通知,整场爆发在手机上只占两条。每分钟最多 20 条,超出的会暂存,等这一分钟结束再补发一份聚合摘要;暂存有上限,极端爆发下会丢弃最旧的并记录日志。不想要合并的话,可以把合并窗口设为「关闭」,每条实时送达——限流与免打扰时段仍然生效,刷屏保护不会因此失效。还能设免打扰时段,安全事件照常穿透。
其他能力
- 多设备:最多 20 台;同一 Bark 服务地址下自动批量推送,一台出问题不影响其他设备。指向官方服务时按其单次 10 台的限制自动分批,全部设备都能收到。
- 设备健康有回音:某台设备连续两轮投递失败时,会通过其他投递成功的设备发送故障告警。恢复后,收到告警且仍启用的设备会收到同一 id 的「✅ 推送已恢复」更新,原地替换故障告警;刚恢复的设备也会收到恢复确认。设备改名不影响状态关联,移除或禁用的设备不再接收恢复更新。
- 每台设备独立服务地址:官方服务与自建服务可以混用。
- 点击直达:跳转链接由 Halo 的永久链接和评论主体接口自动拼出,主题路由改了也不会失效,不用你手填站点地址。收到「评论待审核」「回复待审核」点进去就是审核列表,「文章已删除」点进去是回收站——每个事件都落到你最可能要去的管理页。Halo 2.27 起,评论 / 回复通知的链接还会带上 Halo 的统一评论锚点(
#halo-comment=…),点击直达那条评论或回复的位置(需要主题支持解析;老主题自动退化为跳文章页)。 - 私密内容有标注:在 Console 被设为私密的评论 / 回复(公众不可见),通知正文首行会标注「🔒 私密」,避免误当作公开讨论处理。
- 加密推送:正文可以加密,Bark 服务端解不开;密钥配错时插件会暂停全部推送,并在设备「测试」按钮上直接报出错误。
- 消息归档:通知在 Bark App 里保留 1 / 7 / 30 天或永久,能回看,所以插件不用自己再做一个通知历史页。
- 分组按类别拆分:实际分组是「站点名称 · 安全 / 互动 / 普通」,在 iOS 通知中心可以单独静音某一类。
- 零前端:配置页由 Halo 原生渲染,不额外加载前端资源。
安装
- 下载
.jar文件 - Halo Console → 插件 → 上传安装
- 进入插件设置,填好 Bark 服务地址和设备 Key
需要 Halo 2.26.0 及以上。
配置
全部配置在插件设置页完成,分两个标签页。
推送配置
| 配置项 | 默认值 |
|---|---|
| 接收设备 | 空(设备名称 + 设备 Key + Bark 服务地址;每台设备可指向不同的 Bark 服务端,上限 20 台) |
| 通知分组 | 空(使用站点名称;实际下发为「站点名称 · 安全 / 互动 / 普通」) |
| 默认图标 | 空(使用站点 Logo) |
| 默认提示音 | 空(填 Bark App 的铃声名称,留空用默认铃声;名字不存在时回退到默认提示音) |
| App 角标 / 角标数字 | 关 / 空(开启后按设定数字显示,不累加;填 0 清除角标) |
| 互动类 / 普通类事件级别 | 时效性 / 普通(可选 普通 / 时效性 / 重要警告 / 静默) |
| 安全事件响铃 30 秒 | 开 |
| critical 告警音量 | 空(0–10,留空用系统默认) |
| 消息归档 / 保留时长 | 开 / 7 天(可选 1 / 7 / 30 天 / 永久) |
| 点击通知跳转 | 跳转链接 |
| 自动复制内容 / 复制内容 | 关 / 空(留空则复制通知正文) |
| 内容长度 / 合并窗口 | 200 / 2 分钟(合并窗口可选 关闭 / 1 / 2 / 5 分钟,关闭后逐条实时送达) |
| 静默时段 | 关(默认 23:00–07:00,支持跨天) |
| 加密推送 / 算法 / 模式 / 填充 / 密钥 | 关 / AES128 / CBC / pkcs7 / 空(密钥长度由算法决定:16 / 24 / 32 字节,按 UTF-8 计) |
每台设备都有独立的「测试」按钮:先用这块设备当前表单里的值确认服务可达(会返回版本号),再确认设备凭据有效。测试消息按你的全局配置下发——提示音、图标、分组、角标等外观参数与普通类事件级别都会生效,点一次就能同时验证链路和预览最终效果;只有归档例外,测试消息不进 Bark 归档。部分子项(告警音量、角标数字、归档保留时长、复制内容、静默时间、加密参数)要先把对应开关勾上才会出现。
推送事件
8 类事件各自一个开关。级别由「推送配置」页的「互动类 / 普通类事件级别」统一决定;安全类固定为「重要警告」,改不了。
运行状态
想知道「配置是否生效、有没有丢通知」,可以查询插件的只读状态端点(Console 管理员身份):
curl -s -H "Authorization: Bearer <你的个人令牌>" https://你的站点地址/apis/console.api.bark.wuqishi.com/v1alpha1/bark/status
返回字段的含义:
| 字段 | 含义 |
|---|---|
deliverable |
配置是否可用于投递;false 表示推送已全部暂停 |
blockingIssues |
阻断级问题列表,非空即停止全部推送(目前仅加密错误) |
warnings |
提示级问题,不影响投递 |
deviceCount |
配置中的设备总数 |
deliverableDeviceCount |
当前具备投递条件的设备数 |
dispatcher.queueDepth |
投递队列当前排队的任务数 |
dispatcher.dropped |
队列溢出丢弃的累计条数 |
noise.overflowDropped |
限流暂存溢出丢弃的累计条数 |
noise.quietDropped |
免打扰暂存溢出丢弃的累计条数 |
failedEvents |
处理异常导致丢失的事件累计条数 |
lastDelivery |
最近一次投递摘要;null 表示尚未投递过 |
各项丢弃计数为 0、blockingIssues 与 warnings 为空,即插件处于健康状态。个人令牌在 Console 右上角头像菜单的「个人令牌」中创建。
常见问题
通知图标没显示成我想要的?
Bark App 只认 PNG / JPEG 图标;SVG、WebP、AVIF 都不会显示,会回退到 Bark 默认图标。插件默认用站点 Logo 作为图标,如果站点 Logo 本身是 SVG,同样会回退。想自定义就传一张正方形 PNG(128×128 以上)。
开了加密后收不到通知?
加密密钥必须和 Bark App(首页 → 推送加密 → 加密设置)里的算法、模式、填充、密钥完全一致。配错时插件会暂停全部推送,点设备上的「测试」按钮会直接报出具体错误。
只有加密会停止全部推送;其他配置问题(比如某台设备的服务地址笔误)只影响那一台设备,不会连累其余设备。
我自己发的评论和回复,为什么没收到通知?
站点操作者自己发出的评论与回复不会推送给自己——包括在他人文章下、以及友链插件、瞬间等第三方评论主体下的互动。其他人的互动照常推送。
「站点操作者」指绑定到 Halo 超级管理员角色(super-role)的账号;只拥有评论管理等其他权限、但不是超级管理员的账号不属于操作者,其互动照常推送。
某台设备的服务地址填错了,其他设备还能收到吗?
能。服务地址是设备级配置,地址不合法时只有那台设备不参与投递,其余设备不受影响。
只有一台设备,还能收到故障告警吗?
故障告警需要由另一台投递成功的设备接收。只有一台设备,或所有设备同时投递失败时,故障期间无法送达告警;连续两轮失败后,设备首次恢复投递成功时仍会收到恢复确认。
有些配置项填完保存后不见了?
部分子项(告警音量、角标数字、归档保留时长、复制内容、静默时间、加密参数)只有在勾选了对应的开关后才会显示,这是 Halo 表单的正常行为,不是被丢掉了。
支持哪些 Halo 版本?
要求 Halo 2.26.0 及以上。已在独立 Halo 2.27.1 实例上验证安装、启停、重载、Secret 配置、配置热更新及 8 类核心事件;推送请求由本地 Mock Bark 服务承接。
数据与隐私
- 数据流向:插件只把通知内容发送到你在设置中填写的 Bark 服务地址。内容可能包含评论正文、
文章标题、评论者显示名与头像地址,以及新设备登录的系统 / 浏览器 / IP / 时间。你使用官方 Bark 服务时,
数据会到达 Bark 官方服务端;使用自建服务时,只到达你自己的服务器。 - 出网信任边界:Bark 服务地址由管理员配置,插件信任该配置并允许指向任意主机——包括内网地址,
这是支持自建 NAS / 内网 Bark 服务的必要设计(不做私网地址拦截;重定向只跟随同源,响应体限 64 KB)。
请勿在不受信任的环境中安装本插件并把服务地址指向内网敏感服务。 - 不收集遥测:插件不向作者或任何第三方发送统计数据、崩溃上报或使用日志;除你配置的 Bark 服务外无其它外部请求。
- 凭据存储:设备 Key 与加密密钥保存在 Halo 的 Secret 资源中,插件配置只保存引用;日志全程掩码,
不会输出完整 Key 或完整请求 URL。 - 加密:开启加密后,正文以密文传输,Bark 服务端无法解密。
- 如何停止 / 清除:在 Console 禁用插件即停止全部推送与后台任务;删除插件会移除其配置。
已创建的密钥(Secret)需在 Console 的密钥列表中另行删除。
开发
./gradlew test # 运行自动化测试
./gradlew build # 运行测试并构建插件 jar → build/libs/
Release 构建会运行完整测试,通过后才会发布插件;测试与覆盖率报告保留 7 天。
仓库与资源说明
这个仓库只放插件源码、构建配置和本说明文件,刻意保持精简:
docs/不入库:PRD.md/DEVELOPMENT.md/AGENTS.md是本地开发参考,不随公开仓库发布。
技术栈
- Halo Plugin API(Spring Boot)
- Java 21 / Gradle
- Bark V2 REST API
License
MIT
作者
子青雨 · wuqishi.com


