我给自己搞了个"只响重要消息"的推送通道,开源ntfy世界突然安静了
前两天晚上,我让 AI 跑一个数据整理任务,想着"跑完我再看",然后顺手刷了会儿手机。
你猜怎么着?
刷着刷着就忘了。
第二天早上打开电脑一看——昨晚 11 点就跑完了。
白等一宿不说,后面排着的工作全往后推了一天。
不是通知太少,是通知太多
说实话,现在最不缺的就是消息。
微信群一天 99+,点开一看,全是"收到""好的""+1"。
邮箱 30 封未读,28 封是抄送我的,跟我没半毛钱关系。
App 推送就更离谱了——"XX 给你发了私信""XX 想你了""XX 新功能上线啦"。
我不想知道谁想我了,真的。
结果就是,我练成了一个本事:所有通知,一律无视。
但问题来了。
真正需要我看的那两三条,也被我一并无视了。
![]()
重要的和不重要的,挤在同一个渠道里
这才是问题的根。
不是通知太多,是你没办法区分哪个该看、哪个该扔。
微信群里,领导@你和同事发"哈哈哈"是同一个弹窗。
邮箱里,部署失败告警和营销邮件躺在同一个收件箱。
手机推送栏,AI 任务完成的通知和某宝优惠券并排显示。
你的大脑只能做一个选择:要么全看,累死;要么全不看,漏事。
我选了第三条路——单独开一个通道,只放真正重要的。
我的方案:ntfy,一个极简的推送服务
ntfy 是个开源的消息推送工具,轻量到令人发指。
一个 Docker 容器就能跑起来,没有数据库,没有复杂的后台,甚至连注册都不需要。
它的逻辑特别简单:
你往一个 topic 发消息,订阅了这个 topic 的设备就会收到推送。
就这么回事。
没有算法推荐,没有"猜你喜欢",没有已读未读。
你发什么,我收什么。仅此而已。
我现在怎么用的
给自己定了几条死规矩:
只推这几种情况:
• AI 任务跑完了 → 推
• 任务挂了、报错了 → 推
• 每天精选的技术资讯汇总好了 → 推
• GitHub 上发现值得关注的新项目 → 推
其他一律不推:
• 任务还在跑?不推。
• 常规查询有结果了?不推。
• 没什么新内容?不推。
效果呢?
一天大概响 3 次。每次响,我都确切知道:有事,得看一眼。
不响的时候,我就踏踏实实写代码、开会、摸鱼,心里没有任何负担。
使用ntfy 1.懒人方案:直接用官方公共服务
网址:ntfy.sh
注册一个账号,再添加一个订阅主题即可,这个是通知到你的浏览器的。
![]()
使用
curl -d "Hi" https://ntfy.sh/你建的订阅主题2.手机app官方支持安卓和IOS
![]()
手机去应用商店搜 "ntfy" 装个 App,然后终端里一行命令就能发:
curl -d "任务跑完了" ntfy.sh/你的随机topic名免费额度:每小时 250 条。
个人用,绰绰有余。
注意:topic 名一定要用随机字符串。 别用什么 test、hello,因为 ntfy 的 topic 是公开的,别人订阅同名 topic 就能看到你的消息。
我一般用类似 star-chatgpt-name001 这种。
填写订阅名称
![]()
订阅成功
![]()
3.自托管,完全私有
一台服务器,一条 Docker 命令:
docker 部署服务端
docker run -d \
--name ntfy \
-p 85:80 \
-v /var/cache/ntfy:/etc/ntfy \
binwiederhier/ntfy serve搞定。
想加认证的话,改一下配置文件,把 auth-default-access 设成 deny-all,再创建个用户就行。
自托管的好处:没有频率限制,topic 别人猜不到,数据完全在自己手里。
docker-compose 部署服务端
services:
ntfy:
image: binwiederhier/ntfy
container_name: ntfy
command:
- serve
environment:
- TZ=UTC # optional: set desired timezone
user: UID:GID # optional: replace with your own user/group or uid/gid
volumes:
- /var/cache/ntfy:/var/cache/ntfy
- /etc/ntfy:/etc/ntfy
ports:
- 80:80
healthcheck: # optional: remember to adapt the host:port to your environment
test: ["CMD-SHELL", "wget -q --tries=1 http://localhost:80/v1/health -O - | grep -Eo '\"healthy\"\\s*:\\s*true' || exit 1"]
interval: 60s
timeout: 10s
retries: 3
start_period: 40s
restart: unless-stopped
init: true # needed, if healthcheck is used. Prevents zombie processes4.推送到手表如果你有智能手表,并且智能手表刚好可以安装 ntfy App,然后通知同步到智能手表。
手腕一震,抬起来瞄一眼。
开会的时候不用掏手机,写代码的时候不用切窗口,甚至蹲坑的时候都能第一时间感知。
震了 = 有事。
没震 = 一切正常,该干嘛干嘛。
这种确定性,比 200 条未读通知带来的焦虑感舒服太多了。
脚本推送也很简单
Python 几行代码的事:
import requests
def push(title, body, topic="你的topic", server="https://ntfy.sh"):
requests.post(
f"{server}/{topic}",
json={"message": body, "title": title, "markdown": True}
)# 用法
push("✅ 任务完成", "今日 GitHub Trending 已汇总,共 5 条")
配合 cron 定时任务,或者塞进你现有的自动化脚本里,完事。
最简组合就是 ntfy + cron,连 n8n 都不需要。
踩了几个坑 坑一:中文标题乱码
用 Python 自带的 urllib 发中文,通知栏显示一坨火星文。
原因:urllib 对 header 的 UTF-8 编码处理有 bug。
解法:换 requests 库,或者直接 subprocess 调 curl。别跟 urllib 较劲。
坑二:topic 被人蹭了
最开始我用 test 当 topic 名,结果发现消息发出去没反应——后来才知道,公共服务的 topic 是全局共享的,别人也在用这个名字。
解法:起个足够随机的名字。自托管的话直接开认证,一劳永逸。
坑三:批量推送被限流
写了个脚本一口气推 300 条,推到后面就发不出去了。
官方限制每小时 250 条。
解法:脚本里加个 time.sleep(1),或者干脆自托管,没这破限制。
用了一段时间的真实感受
之前
现在
一天 200+ 通知,全忽略
一天 3 次震动,每次都看
AI 任务跑完不知道,第二天才发现
手腕一震,秒知道
任务失败了过一天才看到
实时收到,马上处理
刷手机"顺便看看有没有消息"
不震就不看,专注干活
最直观的变化:我不再焦虑"是不是漏了什么"。
因为我知道,如果真有重要的事,手表会震。
不震,就是没事。
这种确定感,值了。
最后
"所有消息都重要"等于"所有消息都不重要"。
与其在 200 条通知里大海捞针,不如给自己建一条专属通道,只放那 3 条真正值得你抬手腕的。
工具不复杂,ntfy 一个容器就够。
开源地址:https://github.com/binwiederhier/ntfy
关键是那个原则:重要的事情,值得一个专门的通道。
别让它淹没在"收到""好的"""的海洋里。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.