# U-Push 友盟推送 OpenAPI

> 鉴权方式：`aliyun-aksk`（ACS3-HMAC-SHA256 V3 签名）
> Endpoint：`https://push.openapi.umeng.com`
> API Version：`2022-02-25`

## 调用格式

```bash
umeng-cli call '{
  "name": "push.<Action>",
  "api": {
    "method": "POST",
    "baseUrl": "https://push.openapi.umeng.com",
    "endpoint": "/<Action>",
    "authType": "aliyun-aksk",
    "version": "2022-02-25"
  }
}' '<参数JSON>'
```

- `action` 可省略，自动从 `endpoint` 路径最后一段推导
- 所有推送接口均为 `POST` 方法

---

## 接口路由表

| Action | 说明 | Method | Pathname |
|--------|------|--------|----------|
| `SendByApp` | 广播推送（全量推送） | POST | `/SendByApp` |
| `SendByDevice` | 按设备 Token 推送 | POST | `/SendByDevice` |
| `SendByDeviceFileId` | 按设备文件 ID 批量推送 | POST | `/SendByDeviceFileId` |
| `SendByAlias` | 按别名推送 | POST | `/SendByAlias` |
| `SendByAliasFileId` | 按别名文件 ID 批量推送 | POST | `/SendByAliasFileId` |
| `SendByFilter` | 按条件过滤推送 | POST | `/SendByFilter` |
| `QueryMsgStat` | 查询消息统计 | POST | `/QueryMsgStat` |
| `CancelByMsgId` | 取消推送任务 | POST | `/CancelByMsgId` |
| `UploadDevice` | 上传设备文件 | POST | `/UploadDevice` |

---

## 接口详情

### SendByApp — 广播推送

向应用的所有用户发送推送消息。

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| body | string | 是 | 推送消息体 JSON 字符串 |

```bash
umeng-cli call '{
  "name": "push.SendByApp",
  "api": {
    "method": "POST",
    "baseUrl": "https://push.openapi.umeng.com",
    "endpoint": "/SendByApp",
    "authType": "aliyun-aksk",
    "version": "2022-02-25"
  }
}' '{"body":"{\"appkey\":\"your_appkey\",\"timestamp\":\"1234567890\",\"type\":\"broadcast\",\"payload\":{\"display_type\":\"notification\",\"body\":{\"title\":\"测试\",\"text\":\"内容\"}}}"}'
```

---

### SendByDevice — 按设备 Token 推送

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| body | string | 是 | 推送消息体 JSON 字符串（需包含 device_tokens） |

```bash
umeng-cli call '{
  "name": "push.SendByDevice",
  "api": {
    "method": "POST",
    "baseUrl": "https://push.openapi.umeng.com",
    "endpoint": "/SendByDevice",
    "authType": "aliyun-aksk",
    "version": "2022-02-25"
  }
}' '{"body":"{\"appkey\":\"your_appkey\",\"device_tokens\":\"token1,token2\",\"payload\":{\"display_type\":\"notification\",\"body\":{\"title\":\"测试\",\"text\":\"内容\"}}}"}'
```

---

### SendByAlias — 按别名推送

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| body | string | 是 | 推送消息体 JSON 字符串（需包含 alias 和 alias_type） |

```bash
umeng-cli call '{
  "name": "push.SendByAlias",
  "api": {
    "method": "POST",
    "baseUrl": "https://push.openapi.umeng.com",
    "endpoint": "/SendByAlias",
    "authType": "aliyun-aksk",
    "version": "2022-02-25"
  }
}' '{"body":"{\"appkey\":\"your_appkey\",\"alias\":\"test_alias\",\"alias_type\":\"type1\",\"payload\":{\"display_type\":\"notification\",\"body\":{\"title\":\"测试\",\"text\":\"内容\"}}}"}'
```

---

### SendByFilter — 按条件过滤推送

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| body | string | 是 | 推送消息体 JSON 字符串（需包含 filter 条件） |

```bash
umeng-cli call '{
  "name": "push.SendByFilter",
  "api": {
    "method": "POST",
    "baseUrl": "https://push.openapi.umeng.com",
    "endpoint": "/SendByFilter",
    "authType": "aliyun-aksk",
    "version": "2022-02-25"
  }
}' '{"body":"{\"appkey\":\"your_appkey\",\"filter\":{\"where\":{\"and\":[{\"tag\":\"test\"}]}},\"payload\":{\"display_type\":\"notification\",\"body\":{\"title\":\"测试\",\"text\":\"内容\"}}}"}'
```

---

### SendByDeviceFileId — 按设备文件 ID 批量推送

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| body | string | 是 | 推送消息体 JSON 字符串（需包含 file_id） |

```bash
umeng-cli call '{
  "name": "push.SendByDeviceFileId",
  "api": {
    "method": "POST",
    "baseUrl": "https://push.openapi.umeng.com",
    "endpoint": "/SendByDeviceFileId",
    "authType": "aliyun-aksk",
    "version": "2022-02-25"
  }
}' '{"body":"{\"appkey\":\"your_appkey\",\"file_id\":\"your_file_id\",\"payload\":{\"display_type\":\"notification\",\"body\":{\"title\":\"测试\",\"text\":\"内容\"}}}"}'
```

---

### SendByAliasFileId — 按别名文件 ID 批量推送

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| body | string | 是 | 推送消息体 JSON 字符串（需包含 file_id 和 alias_type） |

```bash
umeng-cli call '{
  "name": "push.SendByAliasFileId",
  "api": {
    "method": "POST",
    "baseUrl": "https://push.openapi.umeng.com",
    "endpoint": "/SendByAliasFileId",
    "authType": "aliyun-aksk",
    "version": "2022-02-25"
  }
}' '{"body":"{\"appkey\":\"your_appkey\",\"file_id\":\"your_file_id\",\"alias_type\":\"type1\",\"payload\":{\"display_type\":\"notification\",\"body\":{\"title\":\"测试\",\"text\":\"内容\"}}}"}'
```

---

### QueryMsgStat — 查询消息统计

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| taskId | string | 是 | 推送任务 ID（从推送接口返回获取） |

```bash
umeng-cli call '{
  "name": "push.QueryMsgStat",
  "api": {
    "method": "POST",
    "baseUrl": "https://push.openapi.umeng.com",
    "endpoint": "/QueryMsgStat",
    "authType": "aliyun-aksk",
    "version": "2022-02-25"
  }
}' '{"taskId":"your_task_id"}'
```

---

### CancelByMsgId — 取消推送任务

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| msgId | string | 是 | 消息 ID（从推送接口返回获取） |

```bash
umeng-cli call '{
  "name": "push.CancelByMsgId",
  "api": {
    "method": "POST",
    "baseUrl": "https://push.openapi.umeng.com",
    "endpoint": "/CancelByMsgId",
    "authType": "aliyun-aksk",
    "version": "2022-02-25"
  }
}' '{"msgId":"your_msg_id"}'
```

---

### UploadDevice — 上传设备文件

上传设备 Token 或别名文件，用于批量推送。

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| body | string | 是 | 设备文件内容 |

```bash
umeng-cli call '{
  "name": "push.UploadDevice",
  "api": {
    "method": "POST",
    "baseUrl": "https://push.openapi.umeng.com",
    "endpoint": "/UploadDevice",
    "authType": "aliyun-aksk",
    "version": "2022-02-25"
  }
}' '{"body":"{\"appkey\":\"your_appkey\",\"content\":\"device_token_1\\ndevice_token_2\"}"}'
```
