news 2026/9/13 5:36:46

ntfy 如何为通知添加动作按钮并配置 view 与 http 动作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ntfy 如何为通知添加动作按钮并配置 view 与 http 动作

ntfy 如何为通知添加动作按钮并配置 view 与 http 动作

【免费下载链接】ntfySend push notifications to your phone or desktop using PUT/POST项目地址: https://gitcode.com/GitHub_Trending/nt/ntfy

如果你通过 ntfy 推送一条通知后,还需要点进 App 或网页才能做下一步操作(打开某个面板、调用一次 REST API),那就用不上动作按钮了。ntfy 允许在发布通知时附带最多三个动作按钮,用户在通知上直接点按即可触发。本文以官方文档docs/publish.md的 “Action buttons” 一节为主线,演示如何用X-Actions请求头或 JSON 请求体两种方式,配置view(打开网站/App)和http(发送 HTTP 请求)两种动作,并通过 JSON 订阅接口验证按钮定义是否随消息下发。

前提条件:你需要一个可发布的 ntfy 服务地址(如 ntfy.sh 或自建服务,安装方式见 安装文档)和一个主题名。主题无需预先创建,发布时即自动建立;由于没有注册环节,主题名本质上相当于密码,文档建议选一个不易被猜中的名字。动作按钮在 Android、iOS 和 Firefox 通知上受支持。

文档示例:带两个用户动作按钮的通知(来源:docs/publish.md)

动作按钮的两种定义方式

一条通知最多可以定义三个用户动作,写法有两种,任选其一:

  1. X-Actions请求头中用逗号分隔的简单格式(请求头别名:ActionsAction);
  2. 以 JSON 请求体发布时,在actions键中放一个 JSON 数组。

请求头格式分长短两种,多个动作之间用分号(;)分隔,键值对之间用逗号(,)分隔:

# 长格式 action=<action1>, label=<label1>, paramN=... [; action=<action2>, label=<label2>, ...] # 短格式 <action1>, <label1>, paramN=... [; <action2>, <label2>, ...]

如果某个值本身包含逗号或分号,可以用双引号(")或单引号(')把值包起来。每种动作的短格式为:

  • view:view, <label>, <url>[, clear=true]
  • http:http, <label>, <url>[, method=<method>][, headers.<header>=<value>][, body=<body>][, clear=true]

(另有broadcastcopy两种动作,本文不展开。)

配置 view 动作

view动作在按钮被点按时打开一个网站或 App:http:///https://打开浏览器(若某 App 注册了该 URL 则打开 App);mailto:打开邮件应用;geo:打开 Google Maps;ntfy://打开 ntfy;twitter://打开 Twitter 等。具体如何路由取决于 Android 和桌面浏览器对链接的处理方式。

view动作支持的字段:

字段必填类型默认值示例说明
action✔️string-view动作类型,必须是view
label✔️string-Turn on light通知中动作按钮的标签
url✔️URL-https://example.com点按时打开的 URL
clear-booleanfalsetrue点按动作按钮后清除通知

文档给出的 curl 示例(myhome为示例主题名,替换为你自己的主题):

curl \ -d "Somebody retweeted your tweet." \ -H "Actions: view, Open Twitter, https://twitter.com/binwiederhier/status/1467633927951163392" \ ntfy.sh/myhome

等价的 ntfy CLI 写法:

ntfy publish \ --actions="view, Open Twitter, https://twitter.com/binwiederhier/status/1467633927951163392" \ myhome \ "Somebody retweeted your tweet."

短格式之外,也可以始终用<key>=<value>写法,例如action=view, url=https://google.com, label=Open Google

配置 http 动作

http动作在按钮被点按时发送一个 HTTP 请求,文档给出的用途示例是触发 REST API(如开关车库门、控制灯光)。注意两点:

  • 默认发送 POST 请求(不是 GET),可用method参数改为其他方法;
  • 唯一必填的参数是url,请求头通过headers参数传递。

http动作支持的字段:

字段必填类型默认值示例说明
action✔️string-http动作类型,必须是http
label✔️string-Open garage door通知中动作按钮的标签
url✔️string-https://ntfy.sh/mytopicHTTP 请求发送到的 URL
method-GET/POST/PUT/...POST⚠️GET请求方法,默认是 POST⚠️
headers-map of strings-见示例请求携带的 HTTP 头;JSON 发布时为 map,简单格式用headers.<header>=<value>
body-stringsome body, somebody?HTTP 请求体
clear-booleanfalsetrueHTTP 请求成功后清除通知;请求失败则通知不会被清除

文档给出的 curl 示例(https://api.mygarage.lan/与 Bearer token 均为文档示例值):

curl \ -d "Garage door has been open for 15 minutes. Close it?" \ -H "Actions: http, Close door, https://api.mygarage.lan/, method=PUT, headers.Authorization=Bearer zAzsx1sk.., body={\"action\": \"close\"}" \ ntfy.sh/myhome

短格式为http, <label>, <url>(例如http, Close door, https://api.mygarage.lan/close)。

组合一条带两个动作的通知

下面把viewhttp组合在同一条通知里(文档示例,myhome替换为你自己的主题):

body='{"temperature": 65}' curl \ -d "You left the house. Turn down the A/C?" \ -H "Actions: view, Open portal, https://home.nest.com/, clear=true; \ http, Turn down, https://api.nest.com/, body='$body'" \ ntfy.sh/myhome

对应的 ntfy CLI 写法:

body='{"temperature": 65}' ntfy publish \ --actions="view, Open portal, https://home.nest.com/, clear=true; \ http, Turn down, https://api.nest.com/, body='$body'" \ myhome \ "You left the house. Turn down the A/C?"

第二个动作里的body='$body'就是前面定义的 shell 变量,值中包含逗号和引号,靠引号包裹避免被解析成键值对分隔符。如果非 ASCII 字符在标题或动作里显示成?符号,文档说明可以把任意请求头(包括 actions)按 RFC 2047 编码,例如 base64 形式=?UTF-8?B?8J+HqfCfh6o=?=

用 JSON 数组定义动作

发布时若在请求体中定义整条消息(JSON 发布),动作就是actions键下的 JSON 数组。注意文档的强调:JSON 发布必须 PUT/POST 到 ntfy 根 URL,而不是主题 URL——发到https://ntfy.sh/是正确做法,发到https://ntfy.sh/mytopic是不正确的。

curl ntfy.sh \ -d '{ "topic": "myhome", "message": "You left the house. Turn down the A/C?", "actions": [ { "action": "view", "label": "Open portal", "url": "https://home.nest.com/", "clear": true }, { "action": "http", "label": "Turn down", "url": "https://api.nest.com/", "body": "{\"temperature\": 65}" } ] }'

JSON 请求体中与本场景相关的字段(完整字段表见 publish 文档 “Publish as JSON” 一节):topic必填;actions为 JSON 数组,即上文的用户动作按钮;message为空时置为triggered

验证动作是否随消息下发

文档提供的核对路径是订阅接口。用 JSON 方式订阅该主题,查看返回消息中的actions字段:

curl "ntfy.sh/myhome/json?poll=1"

/json端点返回的每条消息都是 JSON,按 API 文档 的 JSON message format,actions字段是JSON array,内容为发布时定义的动作按钮。确认输出中actions数组包含你定义的view/http条目,说明动作定义已被服务器接收并随消息下发;之后在订阅该主题的 Android App、iOS 通知或 Firefox 通知中应能看到对应按钮,点按后分别触发打开链接、发送 HTTP 请求。

另外两个与验证相关的行为边界:

  • clear=true的动作在点按后清除该通知;
  • http动作的clear只在请求成功时清除通知,请求失败时通知保留。

限制与边界

  • 每条通知最多三个动作按钮;
  • viewhttp动作在 Android、iOS、Firefox 上受支持;文档列出的broadcast动作仅 Android 支持,copy动作的按钮只在 web app 和 Android App 通知列表中显示,浏览器桌面通知中不显示;
  • http动作默认方法是 POST,如果你的目标接口只接受 GET,必须显式写method=GET
  • 用请求头方式发布时,请求头别名X-Actions/Actions/Action均可(见 参数总表)。

如果需要进一步定制消息内容(比如根据 webhook 载荷动态生成动作),文档的 “Message templating” 一节演示了模板语法;ntfy://深链接可用于viewurl,让按钮直接打开 ntfy 的某个主题。

【免费下载链接】ntfySend push notifications to your phone or desktop using PUT/POST项目地址: https://gitcode.com/GitHub_Trending/nt/ntfy

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 5:35:58

AI高薪就业路线图:机器学习/NLP/CV/RL/大模型工程实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 5:35:23

6G太赫兹通信技术:原理、优势与应用解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 5:30:52

DeepSeek导出Word的三种技术路径与选型决策

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 5:29:58

PythonRobotics 如何用 Dubins 路径规划生成带航向约束的最短路径

PythonRobotics 如何用 Dubins 路径规划生成带航向约束的最短路径 【免费下载链接】PythonRobotics Python sample codes and textbook for robotics algorithms. 项目地址: https://gitcode.com/GitHub_Trending/py/PythonRobotics 如果你的移动平台&#xff08;小车、…

作者头像 李华