ntfy Topic Publish
ntfy 以主题为基本投递地址,客户端订阅同一主题即可接收消息。本文依据 ntfy 官方文档整理,核验日期为 2026-09-08;未对公共服务执行真实发送验证。
- 已选择
ntfy.sh公共服务或自己的 ntfy 基础地址。 - 已创建难以猜测的主题名;需要隐私时已启用用户和访问控制。
- 客户端已订阅目标主题。
- 确定服务地址,例如
https://ntfy.sh或自建地址。 - 创建主题名并在客户端订阅。
- 自建或受保护主题配置访问令牌。
- 向
/{topic}发送纯文本请求,再增加标题、优先级或动作头。
| 字段 | 必需 | 说明 |
|---|---|---|
NTFY_BASE_URL | 是 | 公共或自建服务地址 |
NTFY_TOPIC | 是 | 主题名;公共服务中主题名本身不是可靠认证 |
NTFY_TOKEN | 受保护主题 | Bearer 访问令牌 |
JavaScript 示例需要 Node.js 20 或更新版本;Python 示例需要安装 requests。
curl -X POST 'https://ntfy.sh/NTFY_TOPIC' \ -H 'Title: 连通性测试' \ -d '通知渠道连通性测试'const baseUrl = process.env.NTFY_BASE_URL ?? 'https://ntfy.sh';const url = new URL(encodeURIComponent(process.env.NTFY_TOPIC), `${baseUrl.replace(/\/$/, '')}/`);const response = await fetch(url, { method: 'POST', headers: { Title: '连通性测试' }, body: '通知渠道连通性测试',});
if (!response.ok) throw new Error(`HTTP ${response.status}`);console.log(await response.json());import osfrom urllib.parse import quoteimport requests
base_url = os.getenv("NTFY_BASE_URL", "https://ntfy.sh").rstrip("/")topic = quote(os.environ["NTFY_TOPIC"], safe="")response = requests.post( f"{base_url}/{topic}", headers={"Title": "连通性测试"}, data="通知渠道连通性测试".encode("utf-8"), timeout=15,)response.raise_for_status()print(response.json())受保护主题增加 Authorization: Bearer NTFY_TOKEN。
检查服务响应中的消息 ID、主题和时间,并确认至少一个已订阅客户端收到通知。自建服务还应检查反向代理和 WebSocket/SSE 连接。
- 公共主题可能被他人猜测或订阅,敏感通知应使用访问控制或自建服务。
- Token 只放在服务端,主题名也避免包含业务或个人信息。
- 附件、点击链接和动作 URL 需要单独评估外部访问风险。
请求成功但客户端无消息:检查服务地址和客户端订阅的主题是否完全一致。
401 或 403:确认访问令牌和主题权限。
自建服务连接异常:检查反向代理是否支持流式连接及正确转发请求头。