# 应用程序和订阅者统计信息

## getAppStats

获取特定应用在指定时间段内的统计数据。

`POST` `https://api.pushwoosh.com/json/1.3/getAppStats`

##### 请求体参数

| 名称 <div style="width:150px"></div> | 是否必需 | 类型 | 描述 |
|--------------|----------|--------|--------------------------------------------------------------------------------------------------|
| `auth` | 是 | 字符串 | 来自 Pushwoosh 控制面板的 [API 访问令牌](/zh/developer/api-reference/api-access-token/)。 |
| `application`| 是 | 字符串 | [Pushwoosh 应用程序代码](/zh/developer/api-reference/api-identifiers/#application-code) |
| `datefrom` | 是 | 字符串 | 报告周期的开始日期和时间。格式：`Y-m-d H:i:s`。 |
| `dateto` | 是 | 字符串 | 报告周期的结束日期和时间。格式：`Y-m-d H:i:s`。 |

##### 请求示例
```json
{
  "request": {
    "auth": "yxoPUlwqm…………pIyEX4H",    // 必需。来自 Pushwoosh 控制面板的 API 访问令牌
    "application": "XXXXX-XXXXX",      // 必需。Pushwoosh 应用程序代码
    "datefrom": "2013-06-04 00:00:00", // 必需。报告周期的开始日期和时间
    "dateto": "2013-06-07 00:00:00"    // 必需。报告周期的结束日期和时间
  }
}
```

##### 响应示例

```json
{
  "status_code": 200,
  "status_message": "OK",
  "response": {
    "request_id": "c93a202f439235f9adaaa06d651548ab"
  }
}
```
### 理解统计数据

统计数据显示在指定时间范围内为应用程序、设备或消息注册的操作。

报告会根据以下规则自动聚合：
- **按年**：如果周期超过一年。
- **按月**：如果周期超过一个月。
- **按日**：如果周期超过一天。
- **按小时**：如果周期超过三小时。
- **按分钟**：在所有其他情况下。

##### 操作类型

- **应用级别**：`_open_`、`_install_`
- **设备级别**：`_register_`、`_unregister_`
- **消息级别**：`_send_`、`_open_`

##### 响应格式
所有统计对象都具有相同的格式：
| 字段 <div style="width:150px"></div> | 类型 | 描述 |
|------------|--------|----------------------------------------------------|
| `formatter`| 字符串 | 报告范围：yearly、monthly、daily、hourly、minutely。 |
| `rows` | 列表 | 包含每个已注册操作的报告数据。 |

每个报告行包含：

| 字段 <div style="width:150px"></div> | 类型 | 描述 |
|-----------|--------|------------------------------------------|
| `count` | 整数 | 已注册操作的数量。 |
| `action` | 字符串 | 已注册操作的类型。 |
| `datetime`| 字符串 | 格式化日期：`Y-m-d H:i:s`。 |

### 检索计划请求结果

<Aside type="caution" title="重要">
与每个计划请求一样，`/getAppStats` 需要一个额外的 [`/getResults`](/zh/developer/api-reference/scheduled-requests#getresults) 请求。
</Aside>

##### 响应体

| 字段 <div style="width:150px"></div> | 类型 | 描述 |
|-------------|--------|----------------------------------------------------------------------------------------------------------|
| `request_id`| 字符串 | 计划请求 ID。更多详情请参阅 [`/getResults`](/zh/developer/api-reference/scheduled-requests#getresults)。 |

##### 计划的 (/getResults) 响应体

| 字段 <div style="width:150px"></div> | 类型 | 描述 |
|--------------|------------|-----------------------------------|
| `applications`| 字典 | 应用程序的统计数据。 |
| `devices` | 字典 | 设备的统计数据。 |
| `messages` | 字典 | 消息的统计数据。 |

##### 示例
```json 
{
  "error": {
    "code": 0,
    "message": "OK"
  },
  "json_data": {
    "applications": {
      "formatter": "hourly",
      "rows": [{
        "count": 0,
        "action": "open",
        "datetime": "2013-06-06 00:00:00"
      }, {
        ...
      }]
    }
  }
}
```

## getApplicationSubscribersStats

显示按设备类型分组的应用订阅者列表。

`POST` `https://api.pushwoosh.com/json/1.3/getApplicationSubscribersStats`

##### 请求体

| 名称 <div style="width:150px"></div> | 是否必需 | 类型 | 描述 |
|--------------|----------|--------|--------------------------------------------------------------------------------------------------|
| `auth` | 是 | 字符串 | 来自 Pushwoosh 控制面板的 [API 访问令牌](/zh/developer/api-reference/api-access-token/)。 |
| `application`| 是 | 字符串 | [Pushwoosh 应用程序代码](/zh/developer/api-reference/api-identifiers/#application-code) |

**请求示例**

```json
{
  "request": {
    "auth": "yxoPUlwqm…………pIyEX4H", // 必需。来自 Pushwoosh 控制面板的 API 访问令牌
    "application": "XXXXX-XXXXX"    // 必需。Pushwoosh 应用程序代码
  }
}
```

<Tabs>
<TabItem label="200">
```json
{
  "status_code": 200,
  "status_message": "OK",
  "response": {
    "IOS": 1,
    "ANDROID": 1,
    "OSX": 0,
    "WINDOWS": 0,
    "AMAZON": 0,
    "SAFARI": 0,
    "FIREFOX": 0
  }
}
```
</TabItem>
</Tabs>

## getSubscribersStatistics

检索某个时间段内的应用订阅者统计数据。

`POST` `https://api.pushwoosh.com/api/v2/statistics/application/getSubscribersStatistics`

##### 请求头

| 名称 <div style="width:150px"></div> | 是否必需 | 描述 |
|-----------------|----------|--------------------------------------------------------------------------------------------------------------|
| Authorization | 是 | 格式为 `Key PKX.......NHg` 的 [API 访问令牌](/zh/developer/api-reference/api-access-token/)。 |
| Content-Type | 是 | 必须设置为 `application/json`。 |

##### 请求体参数

| 名称 <div style="width:150px"></div> | 是否必需 | 类型 | 描述 |
|------------------|----------|--------|--------------------------------------------------------------------------|
| application_code | 是 | 字符串 | [Pushwoosh 应用程序代码](/zh/developer/api-reference/api-identifiers/#application-code) |
| timestamp_from | 是 | 字符串 | 统计周期的开始日期和时间（格式：`YYYY-MM-DD hh:mm:ss`，UTC+0）。 |
| timestamp_to | 是 | 字符串 | 统计周期的结束日期和时间（格式：`YYYY-MM-DD hh:mm:ss`，UTC+0）。 |

**请求示例**
```shell
curl --location --request POST 'https://api.pushwoosh.com/api/v2/statistics/application/getSubscribersStatistics' \
--header 'Authorization: Key 3a2X......828JreCk48f' \
--header 'Content-Type: application/json' \
--data-raw '{
   "application_code": "12345-67890",        // Pushwoosh 应用代码
   "timestamp_from": "2022-08-01 00:00:00",  // UTC+0
   "timestamp_to": "2022-09-01 00:00:00"     // UTC+0
}'
```

**响应示例**
```json
{
  "statistics": [{
    "timestamp": "YYYY-MM-DD hh:mm:ss", // UTC+0
    "platform": 1,
    "push_enabled": 100,
    "push_disabled": 100
  }]
}
```
**响应代码**
<Tabs>
  <TabItem label="200: 成功">
    ```json
    {
      "statistics": [{
        "timestamp": "YYYY-MM-DD hh:mm:ss",
        "platform": 1,
        "push_enabled": 100,
        "push_disabled": 100
      }]
    }
    ```

    **说明**：请求成功，并返回了统计数据。
  </TabItem>

  <TabItem label="400: 错误请求">
    ```json
    {
      // Response
    }
    ```

    **说明**：请求的语法或参数无效。
  </TabItem>

  <TabItem label="500: 内部服务器错误">
    ```json
    {
      // Response
    }
    ```

    **说明**：服务器遇到错误。请稍后重试。
  </TabItem>

  <TabItem label="401: 未授权">
    ```json
    {
      // Response
    }
    ```

    **说明**：身份验证失败。请检查您的 API 密钥或令牌。
  </TabItem>

  <TabItem label="403: 禁止访问">
    ```json
    {
      // Response
    }
    ```

    **说明**：对指定的应用代码访问被拒绝。
  </TabItem>

  <TabItem label="404: 未找到">
    ```json
    {
      // Response
    }
    ```

    **说明**：未找到或不存在该应用代码。
  </TabItem>
</Tabs>

### 时间戳间隔规则

<Aside type="note">
请注意，响应中时间戳之间的时间间隔取决于您在请求中发送的周期，规则如下：

* 如果您请求超过一年的统计数据，统计时间戳的间隔将为一年
* 如果统计周期等于一年，响应时间戳之间的间隔等于一个月
* 对于超过一个月但少于一年的周期，将返回每天的统计数据
* 对于少于一个月的周期，响应将包括每小时的统计数据
</Aside>

| 请求的周期 <div style="width:350px"></div> | 响应中的间隔 <div style="width:350px"></div> |
|-------------------|--------------------|
| 超过 1 年 | 1 年 |
| 1 年 | 1 个月 |
| 1 个月 - 1 年 | 1 天 |
| 少于 1 个月| 1 小时 |