---
title: push API 方法
description: >-
通过 Web Push API 订阅并接收服务端通知。
menu:
docs:
weight: 10
name: push
parent: methods-notifications
identifier: methods-push
aliases: [
"/methods/push",
"/api/methods/push",
"/methods/notifications/push",
]
---
## 关于 Web Push API {#about}
Mastodon 原生支持 [Web Push API](https://developer.mozilla.org/en-US/docs/Web/API/Push_API)。你可以为你的原生应用使用相同的机制。Mastodon 不直接连接到 Android 和 Apple 的专有通知网关,所以若你希望使用这些网关,你可以配置一个代理实例,在 WebPush 标准和这些网关之间进行转换。这可以以一种代理实例无法访问通知内容的方式来实现。例如,可以参考 [Mozilla 的 web push 参考实例](https://github.com/mozilla-services/autopush),或者 Mastodon 社区专门为此目的开发的几个中继之一:
* [toot-relay](https://github.com/DagAgren/toot-relay)
* [PushToFCM](https://github.com/tateisu/PushToFCM)
* [metatext-apns](https://github.com/metabolist/metatext-apns)
---
## 订阅推送通知 {#create}
```http
POST /api/v1/push/subscription HTTP/1.1
```
添加 Web Push API 订阅以接收通知。每个访问令牌可以拥有一个推送订阅。若你创建一个新的订阅,旧的订阅将被删除。
**返回:** [WebPushSubscription]({{< relref "entities/WebPushSubscription" >}})\
**OAuth:** 用户令牌 + `push`\
**版本历史:**\
2.4.0 - 添加\
3.3.0 - 添加 `data[alerts][status]`\
3.4.0 - 添加 `data[policy]`\
3.5.0 - 添加 `data[alerts][update]` 和 `data[alerts][admin.sign_up]`\
4.0.0 - 添加 `data[alerts][admin.report]`\
4.3.0 - 添加了更严格的请求参数验证,无效的端点 URL 和订阅密钥现在将导致错误,在此之前这种行为将被接受,但会静默失败。\
4.4.0 - 添加 `subscription[standard]`
#### 请求
##### 标头
Authorization
: {{}} 提供此标头,使用 `Bearer ` 以获得对此 API 方法的访问授权。
##### 表单数据参数
subscription[endpoint]
: {{}} 字符串。发生通知事件时调用的端点 URL。
subscription[keys][p256dh]
: {{}} 字符串。用户代理公钥。使用 `prime256v1` 曲线的 ECDH 密钥对中的公钥的 Base64 编码字符串。
subscription[keys][auth]
: {{}} 字符串。身份验证密钥。16 字节随机数据的 Base64 编码字符串。
subscription[standard]
: 布尔值。是否遵循标准的 WebPush (RFC8030+RFC8291+RFC8292) 规范?若为否,则遵循传统的 WebPush(未发布的版本,RFC8291 的第 4 版草案和 RFC8292 的第 1 版草案)。默认为 false。
data[alerts][mention]
: 布尔值。是否接收提及通知?默认为 false。
data[alerts][status]
: 布尔值。是否接收新的已订阅帐户通知?默认为 false。
data[alerts][reblog]
: 布尔值。是否接收转嘟通知?默认为 false。
data[alerts][follow]
: 布尔值。是否接收关注通知?默认为 false。
data[alerts][follow_request]
: 布尔值。是否接收关注请求通知?默认为 false。
data[alerts][favourite]
: 布尔值。是否接收喜欢通知?默认为 false。
data[alerts][poll]
: 布尔值。是否接收投票通知?默认为 false。
data[alerts][update]
: 布尔值。是否接收嘟文编辑通知?默认为 false。
data[alerts][admin.sign_up]
: 布尔值。是否接收新用户注册通知?默认为 false。必须具有具有适当权限的用户组。
data[alerts][admin.report]
: 布尔值。是否接收新举报通知?默认为 false。必须具有具有适当权限的用户组。
data[policy]
: 字符串。指定是否接收来自 `all`(所有用户)、`followed`(关注的用户)、`follower`(关注者)或 `none`(无)用户的推送通知。
#### 响应
##### 200: OK
已生成新的 PushSubscription,它会将请求的提醒发送到你的端点。
```json
{
"id": 328183,
"endpoint": "https://yourdomain.example/listener",
"standard": true,
"alerts": {
"follow": true,
"favourite": true,
"reblog": true,
"mention": true,
"poll": true
},
"server_key": "BCk-QqERU0q-CfYZjcuB6lnyyOYfJ2AifKqfeGIm7Z-HiTU5T9eTG5GxVA0_OH5mMlI4UkkDTpaZwozy0TzdZ2M="
}
```
##### 401: Unauthorized
无效或缺失的 Authorization 标头。
```json
{
"error": "The access token is invalid"
}
```
---
## 获取当前订阅 {#get}
```http
GET /api/v1/push/subscription HTTP/1.1
```
查看当前与此访问令牌关联的 PushSubscription。
**返回:** [WebPushSubscription]({{< relref "entities/WebPushSubscription" >}})\
**OAuth:** 用户令牌 + `push`\
**版本历史:**\
2.4.0 - 添加
#### 请求
##### 标头
Authorization
: {{}} 提供此标头,使用 `Bearer ` 以获得对此 API 方法的访问授权。
#### 响应
##### 200: OK
```json
{
"id": 328183,
"endpoint": "https://yourdomain.example/listener",
"standard": true,
"alerts": {
"follow": true,
"favourite": true,
"reblog": true,
"mention": true,
"poll": true
},
"server_key": "BCk-QqERU0q-CfYZjcuB6lnyyOYfJ2AifKqfeGIm7Z-HiTU5T9eTG5GxVA0_OH5mMlI4UkkDTpaZwozy0TzdZ2M="
}
```
##### 401: Unauthorized
无效或缺失的 Authorization 标头。
```json
{
"error": "The access token is invalid"
}
```
##### 404: Not found
此令牌不存在 PushSubscription。
```json
{
"error": "Record not found"
}
```
---
## 更改通知类型 {#update}
```http
PUT /api/v1/push/subscription HTTP/1.1
```
更新当前的推送订阅。只能更新数据部分。要更改基本信息,必须创建一个新的订阅。
**返回:** [WebPushSubscription]({{< relref "entities/WebPushSubscription" >}})\
**OAuth:** 用户令牌 + `push`\
**版本历史:**\
2.4.0 - 添加\
3.3.0 - 添加 `data[alerts][status]`\
3.4.0 - 添加 `policy`\
3.5.0 - 添加 `data[alerts][update]` 和 `data[alerts][admin.sign_up]`\
4.0.0 - 添加 `data[alerts][admin.report]`
#### 请求
##### 标头
Authorization
: {{}} 提供此标头,使用 `Bearer ` 以获得对此 API 方法的访问授权。
##### 表单数据参数
data[alerts][mention]
: 布尔值。是否接收提及通知?默认为 false。
data[alerts][status]
: 布尔值。是否接收新的已订阅帐户通知?默认为 false。
data[alerts][reblog]
: 布尔值。是否接收转嘟通知?默认为 false。
data[alerts][follow]
: 布尔值。是否接收关注通知?默认为 false。
data[alerts][follow_request]
: 布尔值。是否接收关注请求通知?默认为 false。
data[alerts][favourite]
: 布尔值。是否接收喜欢通知?默认为 false。
data[alerts][poll]
: 布尔值。是否接收投票通知?默认为 false。
data[alerts][update]
: 布尔值。是否接收嘟文编辑通知?默认为 false。
data[alerts][admin.sign_up]
: 布尔值。是否接收新用户注册通知?默认为 false。必须具有具有适当权限的用户组。
data[alerts][admin.report]
: 布尔值。是否接收新举报通知?默认为 false。必须具有具有适当权限的用户组。
policy
: 字符串。指定是否接收来自 `all`(所有用户)、`followed`(关注的用户)、`follower`(关注者)或 `none`(无)用户的推送通知。
#### 响应
##### 200: OK
更新 PushSubscription 以仅接收提及提醒
```json
{
"id": 328183,
"endpoint": "https://yourdomain.example/listener",
"standard": true,
"alerts": {
"follow": false,
"favourite": false,
"reblog": false,
"mention": true,
"poll": false
},
"server_key": "BCk-QqERU0q-CfYZjcuB6lnyyOYfJ2AifKqfeGIm7Z-HiTU5T9eTG5GxVA0_OH5mMlI4UkkDTpaZwozy0TzdZ2M="
}
```
##### 401: Unauthorized
无效或缺失的 Authorization 标头。
```json
{
"error": "The access token is invalid"
}
```
##### 404: Not found
此令牌不存在 PushSubscription
```json
{
"error": "Record not found"
}
```
---
## 删除当前订阅 {#delete}
```http
DELETE /api/v1/push/subscription HTTP/1.1
```
删除当前的 Web Push API 订阅。
**返回:** 空\
**OAuth:** 用户令牌 + `push`\
**版本历史:**\
2.4.0 - 添加
#### 请求
##### 标头
Authorization
: {{}} 提供此标头,使用 `Bearer ` 以获得对此 API 方法的访问授权。
#### 响应
##### 200: OK
PushSubscription 已成功删除或之前不存在
```json
{}
```
##### 401: Unauthorized
无效或缺失的 Authorization 标头。
```json
{
"error": "The access token is invalid"
}
```
---
## 另请参考
{{< caption-link url="https://github.com/mastodon/mastodon/blob/main/app/controllers/api/v1/push/subscriptions_controller.rb" caption="app/controllers/api/v1/push/subscriptions_controller.rb" >}}
{{< translation-status-zh-cn raw_title="push API methods" raw_link="/methods/push/" last_translation_time="2025-04-06" raw_commit="5e2b739ee193896bea937addc2843146ea0bc870">}}