Accnotify - A Bark-compatible notification push server with RSA encryption
1.4K
Accnotify 是一款 Android 消息或者电脑消息推送的工具,可以把自动化脚本、监控告警和平台通知发送到手机或者电脑。支持文字、链接、图片、消息历史,以及 GitHub、GitLab、飞书、钉钉、企业微信等平台的通知接入。
支持 Android 8.0 及以上版本。从 发布页面 下载 APK,在手机上安装并打开。
https://an.trah.cn。如需使用其他服务器,在“设置”中添加并选择服务器地址。电脑端目前处于测试阶段,暂非正式版。
支持 Windows 和 macOS,使用流程和手机差不多,可以独立接收,也可以和多台手机、电脑共用一个推送 ID。
电脑端同样支持多服务器管理、公用 ID 与密钥、设备重置和注销、Markdown 消息、分组筛选、图片预览与保存、复制及清空历史,以及主题设置、使用教程和手动检查更新。图片直接分享取决于系统支持情况,桌面系统通知的图片与分组能力存在限制,详见 电脑端说明。
“系统权限”里有“保活设置”和“通知权限” 按照说明配置即可
不同手机的设置名称可能不同,但权限都差不多。无障碍可能会造成部分软件异常,但由于国内系统的限制,不开启会更容易被杀,能不开自然是最好。设置里的“前台常驻通知”也可以按需开启,实际效果看手机系统。
id 可以更新消息,带 delete 可以删除消息,下面有示例。历史保存在各台设备本地,绑定不会合并或同步以前的记录。
使用首页复制的 Push 链接作为接收地址。以下地址和设备密钥均为占位示例,请替换为自己的链接。
向 Push 链接发送 POST 请求,使用 JSON 填写标题和正文:
curl -X POST 'https://你的服务器/push/你的设备密钥' \
-H 'Content-Type: application/json' \
-d '{"title":"任务完成","body":"备份已完成"}'
正文中的 \n 表示换行。标题可以省略。
也可以使用 Bark 风格的 GET 链接;中文和特殊字符需要进行 URL 编码:
https://你的服务器/push/你的设备密钥/标题/正文
可使用 markdown 代替正文,支持 JSON、表单和查询参数;同时传入 body 时优先使用非空的 markdown。消息详情会渲染 Markdown 格式。
{
"title": "任务状态",
"markdown": "**备份完成**\n\n- 文件:12 个\n- 状态:成功",
"group": "work"
}
id 是自定义的消息名称:不填则新增,相同则更新,不同则分别保存。支持 JSON、表单和 URL 参数。
{"id":"backup-status","title":"备份任务","body":"正在备份"}
{"id":"backup-status","title":"备份任务","body":"备份已完成"}
{"id":"backup-status","delete":"1"}
依次向 Push 链接 POST 上面三个请求,效果为新增、更新、删除。也可以直接使用链接:
https://你的服务器/push/你的设备密钥/备份任务/正在备份?id=backup-status
https://你的服务器/push/你的设备密钥/备份任务/备份已完成?id=backup-status
https://你的服务器/push/你的设备密钥?id=backup-status&delete=1
?,后续用 &;中文和特殊字符需要 URL 编码。同名字段以 URL 中的非空值为准,POST 也可将参数放在 URL 中。id 必须是字符串,最长 256 字节,与设备 ID、接口返回的 message_id 不同。id、delete 与消息内容一起加密,不放在密文外。在 JSON 中添加 url 或 image:
{
"title": "监控通知",
"body": "点击打开链接查看详情",
"url": "https://example.com/status",
"image": "https://example.com/image.png"
}
图片支持可访问的图片链接,也支持 data:image/png;base64,... 格式的数据。系统通知会先显示文字,图片加载成功后再显示大图;加载失败或图片超过 8 MB 时仍保留文字通知。还可以使用 group 为消息指定分组。
将首页复制的 Webhook 链接填入平台通知设置,选择 POST、application/json。Accnotify 会自动整理平台消息,并保留原始内容。平台名称加在密钥后、? 参数前:
| 平台 | 追加路径 |
|---|---|
| GitHub | /github |
| GitLab | /gitlab |
| Docker Hub | /docker |
| Gitea / Forgejo | /gitea / /forgejo |
| 飞书 / Lark | /feishu |
| 钉钉 | /dingtalk |
| 企业微信 | /wecom |
例如 Forgejo,每次新增通知:
https://你的服务器/webhook/你的设备密钥/forgejo
若要固定更新一条消息、只发电脑并归入 work 分组:
https://你的服务器/webhook/你的设备密钥/forgejo?id=repo-status&target=pc&group=work
Webhook 支持与 Push 相同的消息参数。平台通知的参数放在 URL 中,平台数据自带的 id 等字段不会作为消息控制参数。
| 参数 | 作用 |
|---|---|
id、delete | 更新或删除消息 |
target | 指定接收设备 |
group | 分组,平台通知默认 webhook |
title、body | 替换自动整理的标题、正文 |
markdown | Markdown 正文,优先于 body |
url、image、icon | 打开链接、图片、图标 |
sound、badge | 提示音、整数角标;效果取决于客户端和系统支持 |
通用 Webhook(不追加平台路径)会尝试自动识别平台,也接受 Push 格式 JSON、普通表单、multipart 表单和纯文本;URL 编码表单的 payload 字段可携带平台 JSON。GET 请求通过查询参数传内容,不支持 /标题/正文 路径。
Go 和 Cloudflare 均支持以上用法。发送端加密方式见下文,密文中的平台数据不会自动整理。
需要测试接口时,可下载 接口测试页,用浏览器打开。推送、定向发送、更新删除、加密、Webhook、设备绑定和连接都能测,也能生成独立的电脑测试设备。后台接口需要把测试页放在后台同源地址下打开。
手机和电脑都可以独立使用,也可以在同一个服务器上共用 ID,支持多台手机、多台电脑。每台都有自己的设备标识、RSA 密钥和收件状态,移除一台不会影响其他设备。
手机在“设置 → 设备与消息提醒 → 绑定已有 ID”里粘贴已有设备的 Push 链接,点击“发送验证码”。到确认设备的历史消息里找验证码,填回发起设备,点击“确认绑定”就行。验证码 5 分钟有效;“同 ID 的设备”里可以查看标识、移除设备或解除绑定。绑定后原来的独立链接失效,本地历史保留。
默认全部推送,想指定范围就加 target:
target | 发给谁 |
|---|---|
不填或 all | 同一个 ID 下的全部设备 |
pc(也支持 desktop) | 全部电脑 |
mobile | 全部手机 |
| 某台设备的标识 | 只发给这台设备 |
比如只推送给全部电脑:
{"body":"任务完成","target":"pc"}
JSON、表单和链接都可以带 target,Webhook 也可以加 ?target=pc。首页“Push 链接(仅本机)”已经带了本机标识,直接复制就能用。没有对应设备时会返回错误。
推送 ID 是 32 位大小写英文字母和数字。设备标识是另一回事,用来区分具体哪台手机或电脑,改设备名称不会改变它。
手机在“设置 → 设备与消息提醒 → 消息提醒规则”里设置,电脑在设置里调整。可以关闭通知、只在工作日或指定星期和时段提醒,也可以设置每日静默、节假日静默、自定义静默和上班日期。比如只在工作日 8 点到 17 点提醒。
关闭提醒或静默时,消息照样进历史,只是不弹通知,恢复后也不会补弹。按本机时间判断,结束早于开始表示跨午夜,开始和结束一样表示全天。
节假日在设置里手动点击“获取本年度节假日”,从 Timor 获取全年数据并缓存,不会自动请求或重试。再次获取会先确认,失败保留旧数据;也可以导入本地日历。没有本年度数据时,工作日先按周一到周五算,自定义日期可以覆盖日历。
首页“系统权限 → 通知权限”会打开手机的通知设置,可以分别调整各类消息的提示音、振动和静音,具体选项看手机系统。
| 通知渠道 | 发送时的 group 值 |
|---|---|
| 普通消息 | 不填写,或使用其他分组名称 |
| 重要提醒 | important 或 重要提醒 |
| 工作通知 | work 或 工作通知 |
| 生活通知 | life 或 生活通知 |
例如,发送 {"title":"备份失败","body":"请检查备份任务","group":"important"} 会使用“重要提醒”渠道。发送端加密消息也按解密后的 group 选择渠道;各渠道初始使用系统默认提示音,可以在系统设置中自行修改。
为兼容 Bark,接口接受 sound 和 badge 参数,但客户端不使用它们指定提示音或角标数量。声音由手机系统的通知渠道设置决定,角标显示由手机系统管理。
设置里可以选白、蓝、绿、红、粉、黑主题,以及浅色、深色或跟随系统。默认白色,“关于项目”(电脑端为“关于”)里可以手动检查更新,只提示适用于当前平台的正式安装包。“学习怎么用”里有使用说明和测试模板,也能测试只推电脑或只推手机。
支持保存多个服务器,切换后回首页同步连接。首页点击 ID 可以切换“私有随机 ID”和“公用 ID”,私有 ID 可以重新生成。“通用信息设置”里统一管理本机的公用 ID 和公用秘钥,添加服务器时可选择复用。这里的公用 ID 是本机在不同服务器间复用,跨设备共用要走验证码绑定。
设备操作只影响当前服务器上的本机:
已绑定的设备重置或注销后,其他成员继续使用原来的共用 ID;独立设备的旧链接会失效。共用 ID 时,想切换首页 ID,需要先解除绑定。
服务端可以用 Go 自建,也可以部署到 Cloudflare,后者见 Cloudflare 说明。客户端按全新安装设计。Go 服务端启动时会自动补齐旧数据库的设备字段,保留原有设备和推送地址。升级前请备份数据库。
Go 版有 admin 后台,可以看推送统计、设备在线状态和实时日志,也能给指定设备或全部设备发消息、更新和删除消息。设备列表会显示手机/电脑、唯一标识和推送 ID 分组,支持搜索和分页。
Go 服务端使用 Go 1.27.3 构建,Docker 构建镜像同步固定为该版本;本地编译需要 Go 1.27.3 或更高版本。
后台默认不开,配置至少 12 个字符的 ACCNOTIFY_ADMIN_PASSWORD 后启用。默认用户名 admin,访问 http://你的服务器:8081/admin/;推送接口还是 8080。Docker 部署配置见 Compose 示例,Cloudflare 版没有这个后台。
如需在发送前加密消息,可在首页打开“发送端加密密钥”,生成或输入密钥并保存,再让发送脚本使用同一密钥。密钥按服务器地址分别加密保存在本机,覆盖安装会保留。首次启动自动生成并保存一把公用秘钥;添加或编辑服务器时可勾选“复用公用秘钥”,也可在密钥弹窗中勾选同名选项填入后保存。复用是持续关联,公用秘钥更新后自动生效;未选择复用时,各服务器使用各自配置的密钥。
此功能需要发送脚本主动配合,设置密钥后,普通推送和 Webhook 不会自动变成发送端加密。更换密钥时,需要同步更新发送脚本。配置方法见 发送端加密说明。
普通推送由服务器按各台设备的公钥加密后投递,服务器仍可读取消息内容。建议使用 HTTPS,并通过 POST 或 Webhook 发送敏感内容。Push 链接、Webhook 链接和设备密钥都可以用于向你的设备发送消息,请妥善保管。
服务器接受请求不代表设备已经收到,各台设备分别确认收件。离线消息仅在发送后的 5 分钟内等待补发,超过有效期后不会补发。
遇到问题可提交 Issue,说明手机型号、Android 版本、应用版本和复现步骤。截图与日志中请隐藏设备密钥、推送链接和消息中的个人信息。
Content type
Image
Digest
sha256:9a0c62a46…
Size
14.2 MB
Last updated
19 days ago
docker pull trah01/accnotify-server