## 腾讯小微云对接文档V2.0

使用上，首先需要关注使用准备，注册相关产品，然后提交相关配置，最后关注基础字段说明，这块是所有调用的基础，基本上所有的业务接口都需要使用。查阅不同的业务接口，开始使用。

> 目前基本上所提供的业务接口有音乐、FM、新闻、闹钟、百科、闲聊、天气、股票，后续我们会快速扩充云端对接能力。包括各种资源和各种能力调用

### 使用准备

如果希望通过云API形式接入腾讯小微的语音助手，需要提供详细信息，并发送邮件到小微商务：xiaowei_bd@tencent.com

提供信息如下：

- **产品基础信息：** 接入产品种类和型号，功能描述
- **产品量级预估：** 接入产品数量预估，日活，qps等相关数据
- **对接服务情况：** 后台服务器IP地址，安全校验使用
- **功能需求描述：** 需要使用的接口，例如 是否需要使用Asr， 是否需要使用tts，  需要使用的技能列表。
- **公司基础信息：** 公司名称、公司规模、公司简介等信息
- **联系方式：** 联系人，职位信息、联系电话等信息

完成商务沟通确认后，可通过腾讯小微开放平台申请语音硬件开发者，并根据指引注册“云接入”设备类型，完成配置并通过审核认证后可获得对应的AppSecret。

**注意**: 请妥善保管相应的秘钥文件。如有泄露，请第一时间联系腾讯小微商务对接人员。

### 交互流程

为了更加方便用户使用小微技能，小微提供云端API的接入方式。用户请求云端Http接口，即可方便接入小微技能。目前小微云端API提供基础鉴权、asr、语义解析、处理文本请求、获取资源接口。小微云接入的交互流程如下图所示：

![小微交互流程](https://res8.wxqcloud.qq.com.cn/wxdoc/2672c6dd-88aa-4dfe-a06f-98729e50cb55.png)

1、在接入云端API之前，用户需要通过auth授权，获取凭证。获取凭证是用户可以接入云API的前提，小微云对接校验发送给用户的凭证，保证云API安全访问。

2、asr能力：首先通过asr将语音识别为文本，用户可以携带文本请求语义理解能力获取文本识别的意图结果，或者请求文本处理，获取对应能力的资源数据。

3、技能请求：通过该接口可以请求小微技能，目前小微云API提供音乐、FM、百科、新闻、天气、闲聊、股票、闹钟、通用控制技能。携带asr语音识别的文本进行请求，首先将文本进行语义理解，语义理解算法分析出意图，根据意图请求相应技能。返回技能资源数据给用户。

4、资源获取：提供该接口的目的是为了有屏音响可视化内容。主要提供了获取资源的能力，包括获取音乐、FM、天气资源。

**小微云API对话流程**：整个对话流程分为两步：1、用户首先语音数据请求云API asr接口，云API返回asr识别后的文本给用户；2、用户携带文本请求云API技能请求接口，云API技能请求接口返回请求技能数据。

### 基础说明

#### 基础规则

为了方便使用和理解。我们对所有的接口做了一些整体的说明，除非特别标注。所有接口都遵从此规范：

**接口类型:** http接口（asr后续提供的长连接接口基于 websocket）

**请求方法:** post 方法

**输入输出类型：** json 结构（asr接口例外，请求参数非json类型）

**接口地址**:BASEURL

1. xiaowei.weixin.qq.com (Deprecated) 可以继续使用，不推荐。速度慢。
2. xwcloudapi.weixin.qq.com 推荐使用，速度快，后续功能优先支持。

##### 请求接口基础参数说明

​	基础参数指的是所有业务请求中必须携带的参数，**鉴权接口与asr接口除外**。

​	请求接口之前，需要申请凭证，获取小微云对接签发的凭证之后，才有权限访问小微云对接。获取凭证相关描述详见**接口鉴权**章节。获取凭证有两种方式，不同的获取凭证方式请求非鉴权接口时需要传递的基础参数不同，下面介绍两种不同的获取凭证方式请求接口传递的基础参数。

**方式一接口鉴权：基础参数**

​	如果使用**接口鉴权**章节中的方式一获取凭证，所有业务请求需要携带base_info字段作为基础参数，鉴权接口与asr接口除外。

base_info 的字段组成如下：

| field name  | field type  | required | desc                                                  |
| ----------- | ----------- | -------- | ----------------------------------------------------- |
| device_info | json object | Yes      | 请求的硬件信息说明字段见下文                          |
| user_info   | json object | Yes      | 本次请求的用户相关信息                                |
| auth        | string      | Yes      | 本次请求的鉴权相关信息，参见下文的安全相关章节        |
| query_id    | string      | Yes      | 本次请求的id 为32字节长度的值，方便共同追查问题和定位 |

其中device_info 中字段如下

| field name | field type | required | desc                                                  |
| ---------- | ---------- | -------- | ----------------------------------------------------- |
| pid        | int        | Yes      | 硬件产品标识id 来源于小微平台分配                     |
| channel_id | int        | No       | 渠道id 后续扩展字段，如果需要区分同产品渠道，暂不使用 |
| SN         | string     | Yes      | 硬件产品 序列号，标识一个唯一的硬件。                 |

其中user_info 中字段如下：

| field name | field type | required | desc                         |
| ---------- | ---------- | -------- | ---------------------------- |
| uid        | string     | Yes      | 用户的ID，标识一个唯一的用户 |
| uname      | string     | NO       | 用户名，可不提供             |

**一个请求示例：通过方式一获取凭证**

```json
{
      xxxxxxxxxxxxxxx // 省去业务的请求数据
    "base_info": {
        "device_info": {
            "pid": 23000246,
            "channel_id": 1,
            "SN": "KADSJFLJSDLAJFLSADJFLJFLJDSALFJLFD"
        },
        "user_info": {
            "uid": "29339999333",
            "uname": "I'm test"
        },
        "auth": "ksafd8if998@iriufadskfnkjashfkasyfiuashfksuiywqtrpnvn+",
        "query_id": "KLDASOEWUROUQWIOEUROWEQVNZVFADSFOIOUWOEQR"
    }
}

```

**方式二接口鉴权：基础参数**	

​	如果使用**接口鉴权**章节中的方式二获取凭证，所有业务请求需要携带pid、auth、query_id字段作为基础参数，而不需要携带base_info字段，鉴权接口与asr接口除外，不需要携带基础参数。auth字段为接口鉴权章节中的方式二返回的凭证。

**一个请求示例：通过方式二获取凭证**

```
{
		xxxxxxxxxxxxxxx // 省去业务的请求数据
		"pid": 324,
		"auth": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJiYXNlX2luZm8iOiJ7XCJjb2RlXCI6XCIwN2E0YTZlNTRlMDUwMjRlYmQ0MTMzMzM5Y2M3OTAzMFwiLFwicGlkXCI6ODIzOTIzNDc4LFwidGltZXN0YW1wXCI6XCIxNTk4NTk5NzA1XCJ9XG4iLCJleHAiOjE1OTg2MDY5MDV9.nBuDFO7CWfg9KLognHIy10WFIorzuMBBRNh_F8gSXY",
		"query_id": "KLDASOEWUROUQWIOEUROWEQVNZVFADSFOIOUWOEQR"
}
```

#### 返回格式：

返回格式为json 结构体，结构体的基本内如如下：

```json
{
    "code":0,  // 0 代表成功 非0 失败
    "msg":"OK", // 信息简要描述
    "data":{}   // 返回的信息结构体
}
```

#### 全局错误码

| code  | desc                                           |
| ----- | ---------------------------------------------- |
| 0     | 成功                                           |
| 10001 | 系统错误，发生需要联系开发查看                 |
| 10002 | 网络寻址错误，一般不会发生，发生属于底层错误   |
| 10003 | 底层存储错误，一般也不会发生                   |
| 20001 | 请求参数为空                                   |
| 20002 | 请求参数不是合法的json，或者某些字段格式不正确 |
| 20003 | 缺少必要的请求参数                             |
| 30001 | 接口调用频次超过限制                           |
| 30002 | 安全检查错误，一般发生在安全签名不正确。       |
| 30004 | 未注册的pid                                    |
| 30005 | IP地址没有在IP白名单中                         |
| 30006 | 没有访问该接口的权限                           |

#### 补充说明:

关于请求中的 SN和uid 可能会牵扯一些业务方的核心数据问题，本质上小微这边不对SN和UID进行判别和是识别的，只是为了区分调用的一个设备和一个用户，业务方也可以在自己后台做个1对1映射，但是一定要保证一个用户可以映射到一个uid上，一个设备可以映射到一个sn上，这里主要有三个原因

1. 小微很多业务逻辑是和这两个字段强相关的。要不然很多业务流程，无法进行操作
2. 权限，每个用户的的音乐权限是和用户账号强相关的。另外小微这边会针对每个接口和每个pid 每个sn 和每个uid进行限频，防止一些错误使用。
3. 后续有些接入资源有计费需求的时候，可能针对SN或者UID进行收费，调用方有必要保证数据正确性

### 安全相关

​	为了保证接口调用的安全性，腾讯小微对接口调用做了一些调用限制，主要从2个方面来实现的。分别是IP访问白名单、接口鉴权。

#### 访问白名单

​	目前只允许调用方提供的IP地址请求相关接口。请联系开发人员添加调用方出口IP。

#### 接口鉴权

​	目前安全主要是依靠鉴权来保证业务接口安全。从商务手中获取的秘钥信息（后续从小微官网）是主要的鉴权凭据，需要根据该秘钥信息获取相应的鉴权信息，才可以正确获取业务数据。

​	目前小微云对接升级了获取凭据的方式，新增方式二在兼容方式一获取安全凭据的基础上，可以传入自己定义的参数到凭据中，方式二对于请求小微云对接接口的优点：请求时不需要携带base_info字段相关参数，请求凭证时把base_info的device_info和user_info传入到凭证中，在验证凭证时，可以把传入的参数解析出来，所以后续请求接口时不需要携带base_info相关参数。推荐使用方式二进行获取凭证。

**方式一：获取安全凭据接口**

https://{BASE_URL}/xwcloudapi/auth_get_token

请求方法：post

请求参数：

| field name | field type | required | Desc                                              |
| ---------- | ---------- | -------- | ------------------------------------------------- |
| pid        | int        | Yes      | 平台注册获取的pid                                 |
| timestamp  | Int        | Yes      | 当时的Unix时间戳timestamp                         |
| code       | String     | Yes      | 计算方法为md5（secretkey+str(pid)+str(timestamp)) |
| refresh    | int        | optional | 是否强制刷新，强制刷新为 1，默认为0，既不刷新     |

示例：

比如pid为2011189  当前timestamp为 1575851427  分配secret_key:为iurwbrydfksaflhcc

计算code为：

```
MD5 ("iurwbrydfksaflhcc20111891575851427") = 12b1feade7bd3515359d3ffe628d240e
```

因此请求是：

```json
{
    "pid": 2011189,
    "timestamp": 1575851427,
    "code":"12b1feade7bd3515359d3ffe628d240e"
}
```

返回参数：

| field name        | field type | Desc                      |
| ----------------- | ---------- | ------------------------- |
| code              | int        | 返回错误码 0成功非零失败  |
| msg               | string     |                           |
| data.access_token | string     | 安全鉴权字段 auth填入即可 |
| data.expires_in   | int        | 过期时间 单位s            |

返回示例：

```json
{
    "code": 0,
    "msg": "OK",
    "data": {
            "access_token": "ksfjkasjfslkdajfuoieruoieur",
            "expires_in":   3600
    }
}
```



> 注意： 获取到的accesstoken 是该pid下全局有效的，意味着如果该pid的重新调用刷新获取安全凭据接口，则原来的字段就会失效。因此建议实现上单独模块来存储获取凭据信息。
>
> 另外鉴于网络传输和网络时钟等影响，因此如果expires_in 时间过短时候，强制刷新accesstoken即可
>
> 如果遇到了全局返回错误码：30002的时候也需要刷新accesstoken

**方式二：获取安全凭据接口**

请求接口地址、方法与方式一相同。与方式一有两处不同的地方：第一、每次获取的凭证都是强制刷新的凭证。相当于方式一种的refresh字段为1；第二、请求凭证时可以携带传入的参数。如果使用方式二获取凭证，请注意请求其他接口传递的参数与方式一的区别。

> 注意： 请求获取凭证时携带base_info中的device_info与user_info字段，auth_get_token接口不会对device_info与user_info字段做参数校验，在访问其他接口进行校验凭证时，会校验base_info的device_info与user_info字段。如果请求其他接口返回参数校验相关错误，请检查获取凭证时base_info中user_info与device_info相关参数是否正确。
>

**请求示例：**

```
{
    "pid": 2011189,
    "timestamp": 1575851427,
    "code":"12b1feade7bd3515359d3ffe628d240e",
    "base_info": {
        "device_info": {
            "pid": 2011189,
            "channel_id": 1,
            "SN": "KADSJFLJSDLAJFLSADJFLJFLJDSALFJLFD"
        },
        "user_info": {
            "uid": "29339999333",
            "uname": "I'm test"
        }
    }
}
```

**返回示例：**

```
{
    "code": 0,
    "msg": "OK",
    "data": {
            "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJiYXNlX2luZm8iOiJ7XCJjb2RlXCI6XCIwN2E0YTZlNTRlMDUwMjRlYmQ0MTMzMzM5Y2M3OTAzMFwiLFwicGlkXCI6ODIzOTIzNDc4LFwidGltZXN0YW1wXCI6XCIxNTk4NTk5NzA1XCJ9XG4iLCJleHAiOjE1OTg2MDY5MDV9.nBuDFO7CWfg9KLognHIy10WFIorzuMBBRNh_F8gSXY",
            "expires_in":   7200
    }
}
```


### 语音识别接口

相比v1.0 升级如下

1. 鉴权方式更新为新的鉴权方式
2. 添加字段支持使用识别纯英文，粤语也即将支持
3. 添加字段可以返回带标点符号的文本
4. 优化字段，去除了不必要的字段

#### 请求

##### 请求地址

https://{BASE_URL}/xwcloudapi/asr

#####  请求方式：post

#####  请求参数：

| 头部字段     | 值                                           | 说明                 |
| ------------ | -------------------------------------------- | -------------------- |
| Content-Type | application/octet-stream                     |                      |
| Auth         | 安全验证字段，取值为上文安全规则中的Auth字段 | 参见上文安全相关章节 |

> POST数据： query_args + 1字节0 + 语音
>
> 注：
>
> 其中“1字节0”“1字节1”指的是二进制0x0 及 0x1

query_args字段：

| 参数名称           | 参数类型     | 参数描述                                                     |
| ------------------ | ------------ | ------------------------------------------------------------ |
| timestamp          | string       | 必选，用于安全验证(指服务器时间戳，s)                        |
| pid                | int          | 硬件产品标识id 来源于小微平台分配                            |
| SN                 | string       | 硬件产品 序列号，标识一个唯一的硬件。                        |
| query_id           | String       | 一段语音请求的id 为32字节长度的值，同一段语音不变            |
| seq                | unsigned int | 同一个语音流中请求包的自增序号，从0开始；对于speex等类型的压缩语音，是指压缩前原始语音的偏移； |
| len                | unsigned int | 该语音请求中语音数据的长度；对于speex等类型的压缩语音，是指压缩前原始语音的长度；需要跟解压后语音的长度一致； |
| voice_file_type    | unsigned int | 语音文件类型；1:raw 2:wav                                    |
| voice_encode_type  | unsigned int | 语音编码类型；1:pcm 2:adpcm 3:feature 4:speex 5:amr 6:silk 7.mp3 8.ogg-speex |
| end                | unsigned int | 标记是否是尾包；1是，0不是，默认0                            |
| head_silence_thres | int          | 默认为5000，即5s长度语音vad 语音前部静音阈值，超过该阈值返回错误 |
| tail_silence_thres | int          | 默认为500，即500ms vad尾部静音语音尾部静音阈值，用于初始化evad handle |
| type               | int          | 近场还是远场 0. 远场 1 近场 默认远场                         |
| cloud_vad          | int          | 是否启用云端vad检测  默认0  0 本地vad   1云端vad， 当language 为 非0的时候，cloud_vad = 0； |
| language           | int          | 使用语言识别引擎，默认为 0：中文     可设置 1 英文 2: 粤语(待调试) |
| add_punc           | int          | 识别结果标点配置模式 非必填，默认值为-2，不添加标点 -2：不添加标点 -1：识别服务默认配置（一般是不添加标点） 0：逗号、句号 1：逗号、句号、顿号 2：逗号、句号、顿号、问号 3：逗号、句号、顿号、问号、感叹号 |

##### 说明： 

**query_args** :  字段名1=value&字段名2=value&....


#### 返回

##### 结果格式： json

##### 结果字段：

| 字段                | 类型   | 备注说明           |
| ------------------- | ------ | ------------------ |
| code                | int    | 0成功非零失败      |
| msg                 | string | 结果的文字描述     |
| data                | json   | 详细结果字段       |
| data.is_voice_end   | bool  | 是否识别结束       |
| data.is_speak_begin | bool   | 是否检测到有效语音 |
| data.query_text     | string | 用户 asr识别结果   |
| data.query_id       | string | 请求voiceid        |
| data.seq            | string | 请求seq            |

##### 错误码说明：

| 错误码值 | 说明                                                         |
| -------- | ------------------------------------------------------------ |
| 51002    | asr 系统错误，一般不会遇到                                   |
| 51003    | asr 系统错误，一般不会遇到，                                 |
| 51004    | asr 系统错误，一般不会遇到，                                 |
| 51005    | 静音时间过长                                                 |
| 51006    | 丢包并且一直没有找回                                         |
| 51007    | 无用的语音数据，一般见于已经完整识别了语音，有收到query_id的语音包 |
| 51008    | 语音数据太长了                                               |

##### 示例1： 一个成功的返回

~~~json

{
    "code":0,
    "data":{
        "is_end":0,
        "is_speak_begin":0,
        "query_text":"我要听林",
        "voice_id":"VyotYnCoRBSxzEIwadbzPjkLMzmkKjul"
        },
    "msg":"OK"
}

~~~



##### 示例代码：

待补充。



### 语义接口

> 目前提供音乐、百科、闲聊、股票、FM、天气、股票、闹钟的语义的解析。

说明：提供对文本请求返回语义槽位的相关结果

#### 请求

##### 请求地址： 

https://{BASE_URL}/xwcloudapi/semantic

#####  请求方式：post

#####  请求参数：

     参数类型：json
     参数字段：

##### 示例

```
{
    "query": "我想听周杰伦的歌曲"
    "请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```


#### 返回

##### 结果格式： json

##### 结果字段：

| 字段       | 类型   | 备注说明               |
| ---------- | ------ | ---------------------- |
| code       | int    | 0成功非零失败          |
| msg        | string | 结果的文字描述         |
| data       | json   | 详细结果字段           |
| data.query | string | 用户的请求文本         |
| data.node  | string | 用户请求分类           |
| data.title | string | 用户请求意图           |
| data.slots | array  | 用户请求解析的槽位信息 |
| data.tts   | String | 返回合适播放的文本信息 |

##### 说明

其中data.slots 为数组，每个item 是：类型{key:value} 其中的key 和value类型都为字符串.

音乐意图下，key的取值包括： 榜单， 发行版本，歌词，,歌曲类型，歌曲名，歌曲语言，歌手名，季度，年代，排序，期数，其他版本，影视剧名，专辑，综艺名 value 有值则有值，没有值，则为空。

##### 返回示例：

```json
{
    "code": 0,
    "data": {
        "node": "音乐",
        "query": "我想听七里香",
        "slots": [
            {
                "榜单": ""
            },
            {
                "发行版本": ""
            },
            {
                "歌词": ""
            },
            {
                "歌曲类型": ""
            },
            {
                "歌曲名": "七里香"
            },
            {
                "歌曲语言": ""
            },
            {
                "歌手名": ""
            },
            {
                "季度": ""
            },
            {
                "年代": ""
            },
            {
                "排序": ""
            },
            {
                "期数": ""
            },
            {
                "其他版本": ""
            },
            {
                "影视剧名": ""
            },
            {
                "专辑": ""
            },
            {
                "综艺名": ""
            }
        ],
        "title": "点歌播放"
    },
    "msg": "OK"
}
```

### 技能请求接口

> 所有的文本请求都可以走技能请求接口，但是相关的技能权限需要在官网进行申请，当前支持技能：音乐、FM、新闻、百科、闲聊、闹钟、天气、股票。各技能的query文本示例如下表：

#### query示例

| query                    | 技能 |
| ------------------------ | ---- |
| 播放周杰伦的稻香         | 音乐 |
| 播放郭德纲的相声         | FM   |
| 科技新闻                 | 新闻 |
| 世界最长的河流           | 百科 |
| 陪我聊天                 | 闲聊 |
| 帮我订一个下午五点的闹钟 | 闹钟 |
| 今天北京的天气怎么样     | 天气 |
| 腾讯股价                 | 股票 |

#### 请求

**请求地址：** https://{BASE_URL}/xwcloudapi/text_to_skills

**请求方式：** post

##### 请求参数

​	请求参数包含三部分：**请求query文本**、**请求接口基础参数**、**当前播放状态state_info**。请求query文本示例如上表所示；请求接口基础参数相关描述见**请求接口基础参数说明**章节；下面详细介绍当前播放状态state_info参数。

​	每次访问技能请求接口，必须携带state_info，虽然state_info字段只有通用控制（"收藏"、"取消收藏"、"播放收藏"、"下一首","上一首","暂停","继续播放","重播","单曲循环","顺序播放","循环播放","随机播放","快进","快退","音量大一点","音量小一点","静音","取消静音"）的请求使用，但是在访问技能请求接口之前，无法确定是否为通用控制的请求，所以必须**带上当前设备的播放状态state_info相关参数**，state_info相关参数可以传空，但是尽量把可以获取到的参数带上，尤其是cur_res_info中的参数，避免通用控制不生效。state_info字段为json object，详细介绍如下：
state_info 的字段组成如下：

| field name    | field type  | required | desc                                                         |
| ------------- | ----------- | -------- | ------------------------------------------------------------ |
| cur_res_info  | json object | No       | 当前播放资源信息，详细信息见下文                             |
| location_info | json object | No       | 位置信息，详细信息见下文                                     |
| gps_info      | json object | No       | GPS信息，详细信息见下文                                      |
| client_addr   | string      | No       | 客户端ip地址                                                 |
| play_mode     | int         | No       | 0：顺序播放 1：列表循环 2：随机不循环 3：随机循环 4：单曲循环 |
| play_state    | int         | No       | 1：歌曲开始 2：暂停 3：歌曲结束 4：歌单结束 11：没播完切歌   |
| curent_time   | int         | No       | 上报时间                                                     |

其中cur_res_info中字段如下

| field name | field type | required | desc                                                  |
| ---------- | ---------- | -------- | ----------------------------------------------------- |
| skill_name | string     | No    | 技能名称，请求到资源时会传回技能名称                       |
| res_id     | string     | No    | 资源id                                                 |
| res_name   | string     | No    | 资源名，可以使用music_name字段                           |
| res_singer | string     | No    | 演唱者                                                 |
| content    | string     | No    | 资源url                                                |
| time_offset_ms| int     | No    | 播放时间偏移                                            |

其中location_info 中字段如下：

| field name | field type | required | desc                         |
| ---------- | ---------- | -------- | ---------------------------- |
| contry     | string     | NO       | 国家                          |
| province   | string     | NO       | 省份                          |
| city       | string     | NO       | 城市                          |
| street     | string     | NO       | 街道                          |
| community  | string     | NO       | 社区                          |

其中gps_info 中字段如下：

| field name | field type | required | desc                         |
| ---------- | ---------- | -------- | ---------------------------- |
| altitude   | double     | NO       | 海拔高度                      |
| latitude   | double     | NO       | 纬度                          |
| longitude  | double     | NO       | 经度                          |
| speed      | double     | NO       | 速度                          |
| standard_gps_time| int  | NO       | 标准gps时间                   |
##### 一个请求示例

​	目前推荐使用**方式二：获取安全凭据接口**获取凭证，所以请求示例都以此方式进行描述。如果仍然使用方式一获取凭证，请求示例中的pid、auth、query_id去掉，增加base_info字段，base_info相关描述详见**基础说明**章节。所有技能的请求格式一致，各技能对应的query不同，通过方式二获取安全凭据访问技能请求接口请求示例如下：

```json
{
    "query": "我想听周杰伦的稻香",

    // 请求接口基础参数
    "pid": 324,
    "auth": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJiYXNlX2luZm8iOiJ7XCJjb2RlXCI6XCIwN2E0YTZlNTRlMDUwMjRlYmQ0MTMzMzM5Y2M3OTAzMFwiLFwicGlkXCI6ODIzOTIzNDc4LFwidGltZXN0YW1wXCI6XCIxNTk4NTk5NzA1XCJ9XG4iLCJleHAiOjE1OTg2MDY5MDV9.nBuDFO7CWfg9KLognHIy10WFIorzuMBBRNh_F8gSXY",
    "query_id": "KLDASOEWUROUQWIOEUROWEQVNZVFADSFOIOUWOEQR",

	// state_info相关参数
    "state_info": { 
        "cur_res_info":{ 
            "skill_name": "Music",
            "res_id": "unique_id=7091652&type=cur",
            "res_name": "冰雨",
            "res_singer": "刘德华",
            "content": "http://isure.stream.qqmusic.qq.com/C200002DMN9H2rxulA.m4a?guid=12347310&vkey=B0D71E80BF0CF55081A4DE84C2881F5E486D1A37EECA3DE2C6782E87359DF30013688A13102AC4B3BD6EF837D3E91E6CEEECFCA7BB77C467&uin=&fromtag=50",
            "time_offset_ms": 3053 
        } ,
        "client_addr": "192.168.134.12",
        "play_mode": 1,
        "play_state": 1,
        "curent_time": 1591172141
    }
}
```

> 注意：对于音乐技能的请求：没有通过注册音乐资源登录态接口注册登录态的用户，小微音乐技能只对其支持随心听的 query，对于已经通过注册音乐资源登录态接口注册登陆态的用户，除了随心听的query，还会支持语义点播，比如播放指定歌手、指定音乐等query。
>
> ​	音乐随心听的query可以是"我想听音乐"、"我想听歌"、"播放音乐"等。请求方式与下面音乐技能请求 示例参数相同，返回数据格式相同。

#### 结果返回

​	返回结果包含四部分：code错误码提示、resources获取相关资源、skill技能名称、msg错误提示。

​	对于返回的技能，通过skill字段进行判断。skill包含以下技能取值：

##### skill取值

| skill取值    | 含义     |
| ------------ | -------- |
| Baike        | 百科技能 |
| Chat         | 小微闲聊 |
| News         | 新闻     |
| Music        | 音乐     |
| FM-Crosstalk | FM-相声  |
| FM-Story     | FM-故事  |
| FM-Station   | FM-电台  |
| FM-Joke      | FM-笑话  |
| FM-Comments  | FM-评书  |
| FM-Novel     | FM-小说  |
| Clock        | 闹钟     |
| CommCtrl     | 通用控制 |
| Weather      | 天气     |
| Stock        | 股票     |

##### code错误码说明

|       技能       | 错误码值 | 说明                                       |
| :--------------: | :------: | ------------------------------------------ |
| **音乐技能相关** |    0     | 成功                                       |
|                  |  52000   | 未知错误                                   |
|                  |  52001   | 音乐 系统错误，一般不会遇到                |
|                  |  52002   | 音乐系统错误，一般不会遇到                 |
|                  |  52003   | 请求音乐服务的相关参数错误。               |
|                  |  52004   | 请求的音乐资源不存在                       |
|                  |  52005   | 音乐账号未授权                             |
|                  |  52006   | 音乐授权信息校验失败                       |
|                  |  52007   | 音乐授权信息已经过期                       |
|                  |  52008   | 请求音乐相关接口超限，一般是请求频率太高。 |
|                  |  52009   | 当前账户没有访问该资源权限。               |
|                  |  52010   | 没有登录                                   |
|                  |  52011   | 付费歌曲，非绿钻或付费包会员不能播放       |
|                  |  52012   | 没找到指定的歌手或者歌曲                   |
|                  |  52013   | 因歌曲没有版权不能播放                     |
|                  |  52014   | 没找到任何歌曲                             |
|                  |  52015   | 因海外地区不能播放                         |
|                  |  52016   | 因歌曲为数字专辑歌曲不能播放               |
|                  |  52017   | 设备的基础会员过期                         |
|  **FM技能相关**  |  54001   | FM服务失败                                 |
| **新闻技能相关** |  55001   | 新闻服务失败                               |
| **百科技能相关** |  56001   | 百科服务失败                               |

##### resources资源字段说明

​	不同的技能返回的资源字段会有差别。音乐技能与FM技能返回的数据如下所示。

**音乐技能请求返回**

```json
{
	"code": 0,
	"data": {
		"resources": [{
			"attach_info": "{}",
			"duration": 136,
			"extend_buf": "eyJleHBpcnlfdGltZSI6MTU4NDE0ODQ2OX0=",
			"mid": "003fhlM30c0ZQE",
			"music_album_name": "所有你想听的翻唱",
			"music_cover_url": "http://y.gtimg.cn/music/photo_new/T002R500x500M0000023ZJ4K3Qo5mL_1.jpg",
			"music_name": "我又初恋了",
			"music_singer": "小心怪兽",
			"play_count": -1,
			"playable": 1,
			"res_content": "http://isure.stream.qqmusic.qq.com/C200003vXWKk1BvPSf.m4a?guid=12347310&vkey=D7FE9A072A6CB4541C8989A31F14DA0E9A9E7E24F45CEDE48416EE71C5DB28043E4D26D44F45027057884B86AC8DB142C76CC0B25B9B6110&uin=&fromtag=50",
			"res_id": "unique_id=127136854&type=cur"
		}, 
            ......// 省略歌曲信息
    ],
		"skill": "Music",
		"tts": "好的，请听小心怪兽，我又初恋了"
	},
	"msg": "OK"
}
```
**FM技能请求返回**

```json
{
	"code": 0,
	"data": {
		"resources": [{
			"duration": 3510,
			"music_album_name": "坑王驾到",
			"music_cover_url": "http://imgcache.qq.com/fm/photo/programe/rmid_programe_360/y/4/000y0a0t3APty4.jpg?time=1524562574",
			"music_name": "探地穴（一）异僧豪夺香楠木 员外梦走大罗天",
			"music_singer": "相声小品休闲茶馆",
			"play_count": -1,
			"playable": 1,
			"res_content": "http://ws.stream.fm.qq.com/R196000y0a0t3APty4.m4a?fromtag=36&guid=1584065658&vkey=056F583736D957885FDCC2B741E3D02C46C11E4F700CB87A321A41F8252C6EF623FD2623677CA5919745001C844C9B9A889C3717B1378A12",
			"res_id": "unique_id=rd000y0a0t3APty4&type=3&album_id=rd003q4BfU3HYZaO&show_sequence=1"
		},
            ......// 省略相声信息
  	],
		"skill": "FM",
		"tts": "好的，为你播放 坑王驾到 探地穴（一）异僧豪夺香楠木 员外梦走大罗天"
	},
	"msg": "OK"
}
```
音乐、FM技能resources描述如下表所示：

| 字段             | 含义                                   |
| ---------------- | -------------------------------------- |
| duration         | 时长                                   |
| extend_buf       | 歌词等信息的扩展字段，业务自定义*      |
| mid              | 音乐的mid                              |
| music_album_name | 专辑                                   |
| music_cover_url  | 封面图片                               |
| music_name       | 歌曲名                                 |
| music_singer     | 歌手名                                 |
| play_count       | 播放次数，默认是0，如果是一次性的，为1 |
| playable         | 是否可播放0：否，1：是                 |
| res_content      | 资源url                                |
| res_id           | 资源id                                 |

**新闻技能请求返回**

```json
{
	"code": 0,
	"data": {
		"resources": [{
			"res_content": "http://media.dreamreader.qq.com/1101_ac6f6eddc86d48f169fc973a724b9520.f0.mp3?vkey=8E8A8016DCFCEFBD00A5537564167CD48088BC6096D40F24BB2E7CD01005C83B34C5F0D5DDECD3A0AD437FFEE953FD5DAB43CA61322843F31E5ED8FE0DFB93F6A1A266783E697AF182C66A50AC59108CEF94BF630DB4D36B&appid_sign=09a9d502fc41a0b3b62d1594726ba50b&appid_sign_timestamp=1584065672&appid=yunxiaowei&duration=59",
			"res_id": "20200312A0K22C",
			"music_cover_url": "http://inews.gtimg.com/newsapp_ls/0/11442117688_640330/0",
			"pub_time": "1584001635",
			"source": "中国新闻网",
			"summary": "据美国有线电视新闻网12日报道，美国旅游协会表示，特朗普政府对26个欧洲国家推出的旅行禁令可能会让美国旅游业损失数十亿美元。当地时间11日晚，美国总统特朗普宣布，自3月13日起，对欧洲国家推出旅行禁令，为期30天。随后白宫在社交网站上表示，欧洲申根区的26个国家将受到旅行禁令的影响。美国旅游协会主席兼首席执行官罗杰·道在12日的一份声明中表示，“对欧洲的临时旅游禁令将冲击本就受新冠疫情影响的旅游业，以及从事与旅游相关工作的1570万美国人。”据美国旅游协会的经济学家称，2019年3月，约85万名来自欧洲(不包括英国)的国际游客进入美国，占美国海外游客总数的29%左右。这些游客在美国花费了大约34亿美元。",
			"title": "美旅行协会：特朗普旅行禁令或使美损失逾30亿美元"
		}, 
            ......// 省略新闻信息
    ],
		"skill": "News",
		"tts": "好的，为你播放新闻"
	},
	"msg": "OK"
}
```
新闻resources描述如下表所示：

| 字段     | 含义        |
| -------- | ----------- |
| audioUrl | 新闻资源url |
| newsId   | 新闻id      |
| picUrl   | 图片url     |
| picUrl   | 发布时间    |
| source   | 新闻来源    |
| summary  | 摘要        |
| title    | 标题        |

**百科、股票、闲聊、天气技能请求返回**

```json
{
	"code": 0,
	"data": {
		"resources": {
			"content": "周杰伦(Jay Chou,别名:杰伦,1979年1月18日-),出生于中国台湾新北市,毕业于淡江音乐学院,中国台湾男歌手、演员、导演。2000年被吴宗宪发掘并推出首张专辑《Jay》。2005年涉足影视,以电影《头文字D》获第42届台湾电影金马奖及第25届香港电影金像奖“最佳新人”奖。2007年,自编自导自演的电影《不能说的秘密》获得台湾电影金马奖年度台湾杰出电影奖。2011年凭借专辑《跨时代》获得金曲奖最佳国语男歌手奖,并且第4次获得金曲奖最佳国语专辑奖。2020年10月24日,将举办嘉年华世界巡回演唱会澳洲悉尼站。"
		},
		"skill": "Baike"
	},
	"msg": "OK"
}
```
content字段为请求返回的内容，百科、股票、闲聊、天气skill技能名称可取Baike、Chat、Stock、Weather。

**通用控制请求返回**

​	通用控制包括（"收藏"、"取消收藏"、"播放收藏"、"下一首","上一首","暂停","继续播放","重播","单曲循环","顺序播放","循环播放","随机播放","快进","快退","音量大一点","音量小一点","静音","取消静音"）。

​	**播放收藏**只会播放音乐技能、FM技能的收藏，返回资源的数据格式与FM技能请求、音乐技能请求返回的数据格式相同。
​	其他的通用控制返回contrl_id、contrl_value两个字段代表不同的通用控制。返回的数据格式如下所示：

```json
{
    "code":0,
    "data":{
        "resources":{
            "contrl_id":1000019,
            "contrl_value":"1"
        },
        "skill":"FM-Crosstalk"
    },
    "msg":"OK"
}
```
**通用控制的各个功能与contrl_id、contrl_value的对应关系，如下表所示：**

| function   | contrl_id  | contrl_value |
| ---------- | ---------- | -------- |
| 收藏        | 1100010    | 资源id   |
| 取消收藏     | 1100011     | 资源id   |
| 下一首      | 1000015     | 空       |
| 上一首      | 1000014     | 空       |
| 暂停        | 1000012     | 空       |
| 继续播放     | 1000010    | 空       |
| 重播        | 1000013     | 资源id   |
| 单曲循环     | 1000019     | 4      |
| 顺序播放     | 1000019     | 0      |
| 循环播放    | 1000019      | 1      |
| 随机播放     | 1000019     | 3      |
| 快进         | 1000017     | 5000   |
| 快退         | 1000017    | -5000   |
| 音量大一点    | 1000000    | 10      |
| 音量小一点    | 1000000    | -10     |
| 静音         | 1000002    | 空      |
| 取消静音      | 1000003    | 空      |
**闹钟技能请求返回**

```json
{
    "code":0,
    "data":{
        "resources":[
            {
                "clock_id":36850,
                "clock_type":0,
                "event":"",
                "opt":1,
                "repeat_interval":"",
                "repeat_type":0,
                "service_type":0,
                "trig_time":1591174800
            }],
        "skill":"Clock"
    },
    "msg":"OK"
}
```
闹钟技能返回资源字段说明如下表：

| 字段            | 说明                                   |
| --------------- | -------------------------------------- |
| clock_id        | 闹钟id （闹钟id+type唯一确定一个闹钟） |
| clock_type      | 1.一次性闹钟 2.重复闹钟                |
| event           | 事件，为空标示没有事件                 |
| opt             |                                        |
| repeat_interval |                                        |
| repeat_type     |                                        |
| service_type    |                                        |
| trig_time       | 触发时间                               |

### 资源获取接口

​	资源获取接口可以获取音乐、FM、天气三种资源，目的是使有屏设备更容易获取到相关资源，进行展示。

#### 获取音乐资源

​	如果用户需要使用音乐相关的能力，可以使用音乐的相关接口。音乐技能接口主要分三类，1. 用户登录态管理相关的，主要存储用户登录态相关的。2。 资源获取类接口，这部分主要提供用户获取资源的，包括在设备上展示各种歌曲资源，歌单推荐，类型音乐推荐和搜索等相关接口 3. 语义点播类接口 支持传入用户请求文本或语音数据直接输出需要播放的歌曲接口。

##### 注意事项

​	由于QQ音乐规定手机端QQ音乐的相关音乐资源播放必须使用QQ音乐客户端，**因此使用本章节的所有接口获取的资源仅限在智能音箱设备上播放，**手机上仅能做歌曲信息介绍等产品使用场景，不能进行音乐资源的播放。

##### 注册音乐资源登录态接口

​	用户如果需要使用小微音乐技能除音乐随心听的相关功能，必须先在平台注册用户的登录态，这样才可以使用音乐的相关能力。获取音乐的登录态，当前有两种方式：

1. 拉起QQ音乐客户端，传入相关参数，获取到用户音乐登录态，拉起QQ音乐参数申请需要联系商务申请:xiaowei_bd@tencent.com
2. 带屏智能设备端获取二维码，支持微信 QQ 或者QQ音乐APP扫码获取登录态。（即将支持）

获取相关参数后可以调用该接口注册登录态，然后就可以使用后续的接口。

请求地址： https://{BASE_URL}/xwcloudapi/register_info?info_type=music_login_info

**请求参数：**

> 由于登录态是跟随用户的，因此请求参数中base_info 中的sn 没有起作用

| field name   | field type  | required | Desc                                                         |
| ------------ | ----------- | -------- | ------------------------------------------------------------ |
| login_type   | Int         | Yes      | 取值0， 1， 2。  0: QQ账号登录  1:微信账号登录。2: 拉起QQ音乐app登录，或者qq音乐app扫码登录 |
| app_id       | String      | Yes      | 获取到的appid 属于qq音乐分配的，联系我们商务获取             |
| open_id      | String      | Yes      | 登录态open_id                                                |
| access_token | String      | Yes      | 登录态access_token                                           |
| base_info    | json object | Yse      | 基本信息                                                     |

**请求参数示例**

```json
{
    "login_type":  2,  // 拉起QQ音乐app登录，或者qq音乐app扫码登录
    "app_id":"1106062274",
    "open_id": "E4B834AF95D96973A1EAD747659517D4",
    "access_token": "2F548D28CA347D706ED168775992FC6E",
    "base_info": xxxxxxxx  // 省略base_info
}
```


##### 获取音乐资源基础字段说明

    在音乐的各个接口中，字段返回会有细微的差别，但是其中的大部分的接口字段都会重复出现，为了避免重复介绍相关的字段说明，再此统一进行说明，可以统一在此进行查询，相关字段和含义如下，如果没有解释的一般不用关注：

| field name             | field type | desc                               |
| ---------------------- | ---------- | ---------------------------------- |
| genre                  | string     | 流派                               |
| hot                    | int        | 被指定用户收藏                     |
| isonly                 | int        | 独家                               |
| language               | string     | 语言                               |
| playable               | int        | 是否具有播放权限                   |
| size_try               | int        | 高潮长度                           |
| k_song_id              | string     | 全民K歌ID                          |
| k_song_mid             | string     | 全民K歌MID                         |
| song_id                | int        | 歌曲ID                             |
| song_name              | string     | 歌曲名                             |
| song_mid               | string     | 歌曲MID                            |
| album_id               | int        | 专辑ID                             |
| album_mid              | string     | 专辑MID                            |
| album_name             | string     | 专辑名称                           |
| album_pic              | string     | 专辑图                             |
| song_play_time         | int        | 播放时长，单位S                    |
| singer_id              | int        | 歌手ID                             |
| singer_mid             | string     | 歌手MID                            |
| singer_name            | string     | 歌手名                             |
| singer_pic             | string     | 歌手图片                           |
| try_begin              | int        | 高潮开始，单位S                    |
| try_end                | int        | 高潮结束，单位S                    |
| song_h5_url            | string     | 歌曲H5页面                         |
| song_play_url          | string     | 歌曲链接                           |
| song_play_url_standard | string     | 普通品质                           |
| song_play_url_hq       | string     | 高品质                             |
| song_play_url_sq       | string     | 无损                               |
| song_size              | int        | 歌曲链接对应的资源的大小，单位Byte |
| song_size_standard     | int        | 歌曲链接对应的资源的大小，单位Byte |
| song_size_hq           | int        | 歌曲链接对应的资源的大小，单位Byte |
| song_size_sq           | int        | 歌曲链接对应的资源的大小，单位Byte |
| mv_id                  | int        | MV ID                              |
| unplayable_code        | int        | 无法播放错误码                     |
| unplayable_msg         | string     | 无法播放详细描述                   |
| album_title            | string     | 专辑标题                           |
| author                 | string     | 歌曲作者                           |
| album_pic_150x150      | string     | 封面                               |
| album_pic_300x300      | string     | 封面                               |
| album_pic_500x500      | string     | 封面                               |
| public_time            | string     | 发行时间                           |
| other_singer_list      | array      | 其他歌手                           |
| vip                    | int        | 只有绿钻可听 0:非绿钻  1:绿钻      |
| digital_album          | int        | 是否数字专辑                       |
| url_expiry_time        | int        | url过期时间，非设备不返回url       |

##### 获取音乐资源接口

请求地址：https://{BASE_URL}/xwcloudapi/resources?resource_type=xxxx

区分音乐资源的：   `?resource_type=xxxx`  其中xxx 代表的请求资源类型。总计支持下列几种资源请求类型，其中请求参数和字段分别如下：

###### 查询排行榜列表

url参数: resource_type=top_list

请求参数 ：无

示例：

```json
{
    "请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```

返回值：

```json
{
    "code": 0,
    "data": [
        {
            "group_id": 0,
            "group_name": "巅峰榜",
            "group_top_list": [
                {
                    "listen_num": 19700000,
                    "show_time": "2019-12-06",
                    "songlist": null,
                    "top_banner_pic": "http://y.gtimg.cn/music/photo_new/T003R500x500M0000040Cl473kMpdY.jpg",
                    "top_desc": "",
                    "top_header_pic": "http://y.gtimg.cn/music/photo_new/T002R300x300M000001FUHas3mEGTk.jpg",
                    "top_id": 4,
                    "top_name": "流行指数榜",
                    "top_type": 0
                },
                ......// 省略信息
                {
                    "listen_num": 9500000,
                    "show_time": "2019-12-06",
                    "songlist": null,
                    "top_banner_pic": "http://y.gtimg.cn/music/photo_new/T003R500x500M000004UoRu928y7kB.jpg",
                    "top_desc": "",
                    "top_header_pic": "http://y.gtimg.cn/music/photo_new/T002R300x300M000001ZaCQY2OxVMg.jpg",
                    "top_id": 67,
                    "top_name": "听歌识曲榜",
                    "top_type": 0
                }
            ]
        },
                          ......// 省略排行榜信息
        {
            "group_id": 3,
            "group_name": "全球榜",
            "group_top_list": [
                {
                    "listen_num": 5613640,
                    "show_time": "2019-12-03",
                    "songlist": null,
                    "top_banner_pic": "http://y.gtimg.cn/music/photo_new/T003R500x500M000001IAhUh1Q3nS1.jpg",
                    "top_desc": "",
                    "top_header_pic": "http://y.gtimg.cn/music/photo_new/T003R300x300M000004WvWRT0KrO5T.jpg",
                    "top_id": 108,
                    "top_name": "美国公告牌榜",
                    "top_type": 1
                },
                ......// 省略信息
                {
                    "listen_num": 548905,
                    "show_time": "2019-12-02",
                    "songlist": null,
                    "top_banner_pic": "http://y.gtimg.cn/music/photo_new/T003R500x500M000004c4ruR3rY28m.jpg",
                    "top_desc": "",
                    "top_header_pic": "http://y.gtimg.cn/music/photo_new/T003R300x300M000001x8hbV0UliUy.jpg",
                    "top_id": 128,
                    "top_name": "YouTube音乐排行榜",
                    "top_type": 1
                }
            ]
        }
    ],
    "debug_data": null,
    "msg": ""
}
```



###### 查询排行榜详情

url 参数：resource_type=top_detail

请求参数：

```
{
    "top_id":4,     // 排行榜单的id
    "page":1,       // 分页参数
    "num":1,        // 每页返回歌曲数量
    "请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```

返回值：

```json
{
    "code": 0,
    "data": {
        "listen_num": 19700000,
        "show_time": "",
        "songlist": [
            {
                "album_id": 9423892,
                "album_mid": "001FUHas3mEGTk",
                "album_name": "余年",
                "album_pic": "http://y.gtimg.cn/music/photo_new/T002R120x120M000001FUHas3mEGTk_1.jpg",
                "album_pic_150x150": "",
                "album_pic_300x300": "",
                "album_pic_500x500": "",
                "album_title": "",
                "author": "",
                "copyright": 0,
                "digital_album": 0,
                "genre": "Soundtrack 原声",
                "hot": 0,
                "isonly": 1,
                "k_song_id": 0,
                "k_song_mid": "",
                "language": "国语",
                "mv_id": 0,
                "other_singer_list": [],
                "playable": 0,
                "public_time": "",
                "singer_id": 1060985,
                "singer_mid": "0022eAG537I1bg",
                "singer_name": "肖战",
                "singer_pic": "http://y.gtimg.cn/music/photo_new/T001R120x120M0000022eAG537I1bg.jpg",
                "size_try": 0,
                "song_h5_url": "",
                "song_id": 245783925,
                "song_mid": "000bFWrY2VrdVp",
                "song_name": "余年",
                "song_play_time": 265,
                "song_play_url": "",
                "song_play_url_hq": "",
                "song_play_url_sq": "",
                "song_play_url_standard": "",
                "song_size": 0,
                "song_size_hq": 0,
                "song_size_sq": 0,
                "song_size_standard": 0,
                "try_begin": 0,
                "try_end": 0,
                "unplayable_code": 8,
                "unplayable_msg": "当前接口仅有浏览歌曲信息权限",
                "url_expiry_time": 1575705865,
                "user_own_rule": 0,
                "vip": 0
            }
        ],
        "top_banner_pic": "http://y.gtimg.cn/music/photo_new/T003R500x500M0000040Cl473kMpdY.jpg",
        "top_desc": "追踪全球音乐流行趋势，乐坛最热门歌曲，网络蹿红歌曲根据地。展示QQ音乐用户的关注热度，体现歌曲飙升程度的潮流音乐排行榜。

更新时间：每天更新
歌曲数量：100首
统计算法：QQ音乐库内全部歌曲，根据综合数据7天前的涨幅进行排序，取前100名
综合数据：登录用户在QQ音乐播放/分享/下载数据",
        "top_header_pic": "http://y.gtimg.cn/music/photo_new/T002R300x300M000001FUHas3mEGTk.jpg",
        "top_id": 4,
        "top_name": "流行指数榜",
        "top_type": 0
    },
    "debug_data": [
    ],
    "msg": ""
}
```



###### 查询分类详情

> 目前支持的tag有，不断扩展中：
>
> 睡前 起床 旅行 健身 门店 夜店 胎教 雨天 咖啡馆 工作 学习 忧伤 快乐 平静 寂寞 治愈 兴奋 电音 流行 古风 民谣 轻音乐 欧美 中国风 Hip-Hop R&B 民歌 乡村 摇滚 嘻哈 舞曲 爵士 古典 英语 粤语 日语 国语 韩语

请求URL参数： resource_type=tag_detail

请求结构体参数：

```
{
    "tag": "流行",     // 请求分类的参数
    "请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```

返回结构体：

```json
{
    "code": 0,
    "data": [
        {
            "album_id": 80867,
            "album_mid": "003sxW6y0Blcm5",
            "album_name": "雨生欢禧城",
            "album_pic": "http://y.gtimg.cn/music/photo_new/T002R120x120M000003sxW6y0Blcm5_1.jpg",
            "album_pic_150x150": "",
            "album_pic_300x300": "",
            "album_pic_500x500": "",
            "album_title": "",
            "author": "",
            "copyright": 0,
            "digital_album": 0,
            "genre": "Pop 流行",
            "hot": 0,
            "isonly": 0,
            "k_song_id": 25736,
            "k_song_mid": "004JDYup0a8nNv",
            "language": "国语",
            "mv_id": 29953,
            "other_singer_list": [],
            "playable": 1,
            "public_time": "",
            "singer_id": 4324,
            "singer_mid": "00328THz3yYR8C",
            "singer_name": "陶晶莹",
            "singer_pic": "http://y.gtimg.cn/music/photo_new/T001R120x120M00000328THz3yYR8C.jpg",
            "size_try": 0,
            "song_h5_url": "http://c.y.qq.com/v8/playsong.html?songmid=002nYdew1TZP4L",
            "song_id": 526321,
            "song_mid": "002nYdew1TZP4L",
            "song_name": "单身旅记",
            "song_play_time": 259,
            "song_play_url": "",
            "song_play_url_hq": "",
            "song_play_url_sq": "",
            "song_play_url_standard": "",
            "song_size": 1569582,
            "song_size_hq": 6241374,
            "song_size_sq": 30224992,
            "song_size_standard": 3165540,
            "try_begin": 0,
            "try_end": 0,
            "unplayable_code": 0,
            "unplayable_msg": "",
            "url_expiry_time": 1575707408,
            "user_own_rule": 1,
            "vip": 0
        },
        ......
    ],
    "debug_data": null,
    "msg": ""
}
```



###### 查询收藏歌单列表

请求URL参数：resource_type=favorite_diss_list

请求结构体参数 ：无

示例：

```json
{
    "请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```

返回值：

```json
{
    "code": 0,
    "data": [
        {
            "create_time": 663136096,
            "diss_id": 7290365568,
            "diss_name": "我喜欢",
            "diss_pic": "",
            "listen_num": 9,
            "song_num": 6,
            "update_time": 34
        }
    ],
    "debug_data": null,
    "msg": ""
}
```

###### 查询歌单详情

请求URL参数：resource_type=diss_detail

请求结构体参数：

```
{
    "diss_id":4,     // 排行榜单的id
    "page":1,       // 分页参数
    "num":1,        // 每页返回歌曲数量
    "请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```

返回值：

```
{
    "code": 0,
    "data": [
        {
            "album_id": 9368268,
            "album_mid": "000ylr8A2gclmP",
            "album_name": "배가본드 OST Part.9",
            "album_pic": "http://y.gtimg.cn/music/photo_new/T002R120x120M000000ylr8A2gclmP_1.jpg",
            "album_pic_150x150": "",
            "album_pic_300x300": "",
            "album_pic_500x500": "",
            "album_title": "",
            "author": "",
            "copyright": 0,
            "digital_album": 0,
            "genre": "Soundtrack 原声",
            "hot": 1,
            "isonly": 1,
            "k_song_id": 6431864,
            "k_song_mid": "001TIR9f4IkfQM",
            "language": "韩语",
            "mv_id": 1582580,
            "other_singer_list": [],
            "playable": 1,
            "public_time": "",
            "singer_id": 1110230,
            "singer_mid": "0041wSOz2UgIr3",
            "singer_name": "金在奂",
            "singer_pic": "http://y.gtimg.cn/music/photo_new/T001R120x120M0000041wSOz2UgIr3.jpg",
            "size_try": 0,
            "song_h5_url": "http://c.y.qq.com/v8/playsong.html?songmid=004UY6Xn4bJEkw",
            "song_id": 245461261,
            "song_mid": "004UY6Xn4bJEkw",
            "song_name": "그때 내가 지금의 나라면",
            "song_play_time": 313,
            "song_play_url": "",
            "song_play_url_hq": "",
            "song_play_url_sq": "",
            "song_play_url_standard": "",
            "song_size": 1904548,
            "song_size_hq": 7580826,
            "song_size_sq": 37145561,
            "song_size_standard": 3812162,
            "try_begin": 0,
            "try_end": 0,
            "unplayable_code": 0,
            "unplayable_msg": "",
            "url_expiry_time": 1575706923,
            "user_own_rule": 1,
            "vip": 0
        }
    ],
    "msg": "",
    "total_num": 10
}
```

###### 搜索歌曲

请求URL参数：resource_type=search

请求结构体参数：

> num默认为10，一次最多返回20首

```
{
    "word": "晴天",     // 搜索关键词
    "page":1,
    "num":1
    "请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```

返回结构体：

```
{
    "code": 0,
    "data": {
        "cur_num": 1,
        "cur_page": 1,
        "keyword": "晴天",
        "list": [
            {
                "album_id": 8220,
                "album_mid": "000MkMni19ClKG",
                "album_name": "叶惠美",
                "album_pic": "http://y.gtimg.cn/music/photo_new/T002R120x120M000000MkMni19ClKG_1.jpg",
                "album_pic_150x150": "http://y.gtimg.cn/music/photo_new/T002R150x150M000000MkMni19ClKG_1.jpg",
                "album_pic_300x300": "http://y.gtimg.cn/music/photo_new/T002R300x300M000000MkMni19ClKG_1.jpg",
                "album_pic_500x500": "http://y.gtimg.cn/music/photo_new/T002R500x500M000000MkMni19ClKG_1.jpg",
                "album_title": "叶惠美",
                "author": "周杰伦",
                "copyright": 1,
                "digital_album": 0,
                "dissid": "",
                "dissname": "",
                "docid": "",
                "genre": "Pop 流行",
                "hot": 0,
                "isonly": 1,
                "k_song_id": 8606,
                "k_song_mid": "000oBPpd23GbIo",
                "language": "国语",
                "listennum": 0,
                "logo": "",
                "mv_id": 293791,
                "nickname": "",
                "other_singer_list": null,
                "playable": 1,
                "public_time": "",
                "singer_id": 4558,
                "singer_mid": "0025NhlN2yWrP4",
                "singer_name": "周杰伦",
                "singer_pic": "http://y.gtimg.cn/music/photo_new/T001R120x120M0000025NhlN2yWrP4.jpg",
                "size_try": 0,
                "song_h5_url": "http://c.y.qq.com/v8/playsong.html?songmid=0039MnYb0qxYhV",
                "song_id": 97773,
                "song_mid": "0039MnYb0qxYhV",
                "song_name": "晴天",
                "song_play_time": 269,
                "song_play_url": "",
                "song_play_url_hq": "",
                "song_play_url_sq": "",
                "song_play_url_standard": "",
                "song_size": 1644265,
                "song_size_hq": 6528081,
                "song_size_sq": 31430142,
                "song_size_standard": 3291622,
                "songnum": 0,
                "try_begin": 0,
                "try_end": 60000,
                "uin": 0,
                "unplayable_code": 0,
                "unplayable_msg": "",
                "url_expiry_time": 1575707153,
                "user_own_rule": 0,
                "vip": 1
            }
        ],
        "total_num": 557,
        "zhida": {
            "id": 0,
            "type": 0
        }
    },
    "msg": ""
}
```

###### 搜索歌手

请求URL参数：resource_type=search_singer

请求结构体参数：

> 一次默认返回10首

```
{
		"word": "周杰伦",     // 搜索关键词
    "page":1,
    "num":1,
    "请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```

返回结构体：

```
{
    "code": 0,
    "data": {
        "cur_num": 1,
        "cur_page": 1,
        "keyword": "晴天",
        "list": [
            {
                "album_id": 8220,
                "album_mid": "000MkMni19ClKG",
                "album_name": "叶惠美",
                "album_pic": "http://y.gtimg.cn/music/photo_new/T002R120x120M000000MkMni19ClKG_1.jpg",
                "album_pic_150x150": "http://y.gtimg.cn/music/photo_new/T002R150x150M000000MkMni19ClKG_1.jpg",
                "album_pic_300x300": "http://y.gtimg.cn/music/photo_new/T002R300x300M000000MkMni19ClKG_1.jpg",
                "album_pic_500x500": "http://y.gtimg.cn/music/photo_new/T002R500x500M000000MkMni19ClKG_1.jpg",
                "album_title": "叶惠美",
                "author": "周杰伦",
                "copyright": 1,
                "digital_album": 0,
                "dissid": "",
                "dissname": "",
                "docid": "",
                "genre": "Pop 流行",
                "hot": 0,
                "isonly": 1,
                "k_song_id": 8606,
                "k_song_mid": "000oBPpd23GbIo",
                "language": "国语",
                "listennum": 0,
                "logo": "",
                "mv_id": 293791,
                "nickname": "",
                "other_singer_list": null,
                "playable": 1,
                "public_time": "",
                "singer_id": 4558,
                "singer_mid": "0025NhlN2yWrP4",
                "singer_name": "周杰伦",
                "singer_pic": "http://y.gtimg.cn/music/photo_new/T001R120x120M0000025NhlN2yWrP4.jpg",
                "size_try": 0,
                "song_h5_url": "http://c.y.qq.com/v8/playsong.html?songmid=0039MnYb0qxYhV",
                "song_id": 97773,
                "song_mid": "0039MnYb0qxYhV",
                "song_name": "晴天",
                "song_play_time": 269,
                "song_play_url": "",
                "song_play_url_hq": "",
                "song_play_url_sq": "",
                "song_play_url_standard": "",
                "song_size": 1644265,
                "song_size_hq": 6528081,
                "song_size_sq": 31430142,
                "song_size_standard": 3291622,
                "songnum": 0,
                "try_begin": 0,
                "try_end": 60000,
                "uin": 0,
                "unplayable_code": 0,
                "unplayable_msg": "",
                "url_expiry_time": 1575707153,
                "user_own_rule": 0,
                "vip": 1
            }
        ],
        "total_num": 557,
        "zhida": {
            "id": 0,
            "type": 0
        }
    },
    "msg": ""
}
```

###### 每日推荐30首

请求URL参数：resource_type= rec_30_everyday

请求结构体参数：无

示例结构：

```
{
    "请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```

返回结构体：

```json
{
    "code": 0,
    "data": [
        {
            "album_id": 80867,
            "album_mid": "003sxW6y0Blcm5",
            "album_name": "雨生欢禧城",
            "album_pic": "http://y.gtimg.cn/music/photo_new/T002R120x120M000003sxW6y0Blcm5_1.jpg",
            "album_pic_150x150": "",
            "album_pic_300x300": "",
            "album_pic_500x500": "",
            "album_title": "",
            "author": "",
            "copyright": 0,
            "digital_album": 0,
            "genre": "Pop 流行",
            "hot": 0,
            "isonly": 0,
            "k_song_id": 25736,
            "k_song_mid": "004JDYup0a8nNv",
            "language": "国语",
            "mv_id": 29953,
            "other_singer_list": [],
            "playable": 1,
            "public_time": "",
            "singer_id": 4324,
            "singer_mid": "00328THz3yYR8C",
            "singer_name": "陶晶莹",
            "singer_pic": "http://y.gtimg.cn/music/photo_new/T001R120x120M00000328THz3yYR8C.jpg",
            "size_try": 0,
            "song_h5_url": "http://c.y.qq.com/v8/playsong.html?songmid=002nYdew1TZP4L",
            "song_id": 526321,
            "song_mid": "002nYdew1TZP4L",
            "song_name": "单身旅记",
            "song_play_time": 259,
            "song_play_url": "",
            "song_play_url_hq": "",
            "song_play_url_sq": "",
            "song_play_url_standard": "",
            "song_size": 1569582,
            "song_size_hq": 6241374,
            "song_size_sq": 30224992,
            "song_size_standard": 3165540,
            "try_begin": 0,
            "try_end": 0,
            "unplayable_code": 0,
            "unplayable_msg": "",
            "url_expiry_time": 1575707408,
            "user_own_rule": 1,
            "vip": 0
        },
        ......
    ],
    "debug_data": null,
    "msg": ""
}
```

###### 刷新url

返回的音乐资源url会保证至少4小时有效期，如果url过期，使用该接口刷新过期的音乐资源url。

请求URL参数：resource_type= refresh_res_url

请求结构体参数：

```
{
		"res_id_list": [
			"unique_id=104220502&type=cur",
			"unique_id=127136854&type=cur"
		],
    "请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```

返回结构体：

```
{
	"code": 0,
	"msg": "成功",
	"data": {
		"resources": [{
			"attach_info": "{}",
			"duration": 167,
			"extend_buf": "eyJleHBpcnlfdGltZSI6MTU5OTA0MDg0MH0=",
			"mid": "002HP3xE1sY4GT",
			"music_album_name": "The Complete Recordings 1952-1962",
			"music_cover_url": "http://y.gtimg.cn/music/photo_new/T002R500x500M00000375Fuz3dt1bS_1.jpg",
			"music_name": "The Continental",
			"music_singer": "Blossom Dearie",
			"play_count": -1,
			"playable": 1,
			"res_content": "http://isure6.stream.qqmusic.qq.com/C200001ZxoVC3Cg9vZ.m4a?guid=12347310&vkey=472EA23CA1D53800B2787855BB6330E1E1FE86D92103FE19190097B4735F5D5E9FCA5E45EB8831484B1895763C19D016AFF905B5C1EECA57&uin=&fromtag=50",
			"res_id": "unique_id=104220502&type=cur"
		}, {
			"attach_info": "{}",
			"duration": 136,
			"extend_buf": "eyJleHBpcnlfdGltZSI6MTU5OTA0MDg0MH0=",
			"mid": "003fhlM30c0ZQE",
			"music_album_name": "所有你想听的翻唱",
			"music_cover_url": "http://y.gtimg.cn/music/photo_new/T002R500x500M0000023ZJ4K3Qo5mL_1.jpg",
			"music_name": "我又初恋了",
			"music_singer": "小心怪兽",
			"play_count": -1,
			"playable": 1,
			"res_content": "http://isure6.stream.qqmusic.qq.com/C2000009iIuS3b2vpp.m4a?guid=12347310&vkey=43E2ADAD60B804096333DCC87495BB767B6CEC37CF03A2805ED80CAA5AB2C91947B2B06334BA710D3BBABCF87E3D86C75A9565332228D5E4&uin=&fromtag=50",
			"res_id": "unique_id=127136854&type=cur"
		}]
	}
}
```



#### 获取天气资源

请求地址：https://{BASE_URL}/xwcloudapi/resources?resource_type=xxxx

其中天气资源的请求参数为：   `?resource_type=weather_info`   具体的请求参数如下

##### 整体参数介绍
支持的所有参数如下（根据不同的问法，参数组合不同）：

```
{
	"query":"北京明天适合运动吗",
	"content":"",
	"client_ip":"0.0.0.0",
	"intention":"天气",
	"wait_time_second":0,
	"from":"xiaowei",
	"date":{
		"type":"datetime_point",
		"text":"明天",
		"date":"2019-12-04",
		"date_start":"2019-12-04",
		"date_end":"2019-12-04",
		"time":"15:00:00",
		"time_start":"15:00:00",
		"time_end":"15:00:00",
	},
	"loc":{ 
		"country":"中国",
		"province":"湖南省",
		"city":"北京市",
		"town":"北京市",
		"loc_ori":"北京"
		"poi":"大福镇",
		"lat":39.916666,
		"lon":116.4
	}
}
```

得到的结果如下:

```json
{
    "code": 0,
    "extend_buf": "{\"loc\":\"北京\",\"data\":[{\"date\":\"2019-12-02\",\"condition\":\"晴\",\"min_tp\":\"-5\",\"max_tp\":\"4\",\"wind_lv\":\"3-4级\",\"wind_level\":\"和缓\",\"wind_direct\":\"西南风\",\"pm25\":\"26\",\"quality\":\"优\"},{\"date\":\"2019-12-03\",\"condition\":\"晴\",\"tp\":\"7\",\"min_tp\":\"-3\",\"max_tp\":\"8\",\"wind_lv\":\"3级\",\"wind_level\":\"轻微\",\"wind_direct\":\"西风\",\"pm25\":\"29\",\"quality\":\"优\",\"is_asked\":\"1\"},{\"date\":\"2019-12-04\",\"condition\":\"晴\",\"min_tp\":\"-4\",\"max_tp\":\"9\",\"wind_lv\":\"3级\",\"wind_level\":\"和缓\",\"wind_direct\":\"西南风\",\"pm25\":\"58\",\"quality\":\"良\"},{\"date\":\"2019-12-05\",\"condition\":\"晴\",\"min_tp\":\"-6\",\"max_tp\":\"2\",\"wind_lv\":\"3级\",\"wind_level\":\"和缓\",\"wind_direct\":\"东风\",\"pm25\":\"49\",\"quality\":\"优\"},{\"date\":\"2019-12-06\",\"condition\":\"晴\",\"min_tp\":\"-6\",\"max_tp\":\"3\",\"wind_lv\":\"3级\",\"wind_level\":\"和缓\",\"wind_direct\":\"西南风\",\"pm25\":\"76\",\"quality\":\"良\"},{\"date\":\"2019-12-07\",\"condition\":\"晴\",\"min_tp\":\"-6\",\"max_tp\":\"4\",\"wind_lv\":\"3级\",\"wind_level\":\"和缓\",\"wind_direct\":\"东北风\",\"pm25\":\"107\",\"quality\":\"轻度污染\"},{\"date\":\"2019-12-08\",\"condition\":\"晴\",\"min_tp\":\"-6\",\"max_tp\":\"6\",\"wind_lv\":\"3级\",\"wind_level\":\"和缓\",\"wind_direct\":\"西南风\",\"pm25\":\"165\",\"quality\":\"轻度污染\"},{\"date\":\"2019-12-09\",\"condition\":\"多云\",\"min_tp\":\"-5\",\"max_tp\":\"5\",\"wind_lv\":\"3级\",\"wind_level\":\"和缓\",\"wind_direct\":\"西南风\"},{\"date\":\"2019-12-10\",\"condition\":\"多云\",\"min_tp\":\"-3\",\"max_tp\":\"6\",\"wind_lv\":\"3级\",\"wind_level\":\"和缓\",\"wind_direct\":\"西北风\"},{\"date\":\"2019-12-11\",\"condition\":\"晴\",\"min_tp\":\"-4\",\"max_tp\":\"3\",\"wind_lv\":\"3级\",\"wind_level\":\"和缓\",\"wind_direct\":\"西北风\"},{\"date\":\"2019-12-12\",\"condition\":\"晴\",\"min_tp\":\"-3\",\"max_tp\":\"4\",\"wind_lv\":\"3级\",\"wind_level\":\"和缓\",\"wind_direct\":\"西北风\"},{\"date\":\"2019-12-13\",\"condition\":\"多云\",\"min_tp\":\"-3\",\"max_tp\":\"5\",\"wind_lv\":\"3级\",\"wind_level\":\"和缓\",\"wind_direct\":\"南风\"},{\"date\":\"2019-12-14\",\"condition\":\"晴\",\"min_tp\":\"-2\",\"max_tp\":\"5\",\"wind_lv\":\"3级\",\"wind_level\":\"和缓\",\"wind_direct\":\"北风\"},{\"date\":\"2019-12-15\",\"condition\":\"晴\",\"min_tp\":\"-2\",\"max_tp\":\"5\",\"wind_lv\":\"3级\",\"wind_level\":\"和缓\",\"wind_direct\":\"南风\"},{\"date\":\"2019-12-16\",\"condition\":\"晴\",\"min_tp\":\"-2\",\"max_tp\":\"5\",\"wind_lv\":\"3级\",\"wind_level\":\"和缓\",\"wind_direct\":\"西南风\"},{\"date\":\"2019-12-17\",\"condition\":\"晴\",\"min_tp\":\"-2\",\"max_tp\":\"5\",\"wind_lv\":\"3级\",\"wind_level\":\"和缓\",\"wind_direct\":\"南风\"}],\"hourly_data\":[{\"humidity\":\"45\",\"condition\":\"晴\",\"tp\":\"-3\",\"wind_lv\":\"2级\",\"wind_level\":\"轻微\",\"wind_direct\":\"西北风\"},{\"hour\":\"1\",\"humidity\":\"45\",\"condition\":\"晴\",\"tp\":\"-3\",\"wind_lv\":\"2级\",\"wind_level\":\"轻微\",\"wind_direct\":\"西北风\"},{\"hour\":\"2\",\"humidity\":\"46\",\"condition\":\"晴\",\"tp\":\"-4\",\"wind_lv\":\"2级\",\"wind_level\":\"轻微\",\"wind_direct\":\"西北风\"},{\"hour\":\"3\",\"humidity\":\"45\",\"condition\":\"晴\",\"tp\":\"-4\",\"wind_lv\":\"2级\",\"wind_level\":\"轻微\",\"wind_direct\":\"西北风\"},{\"hour\":\"4\",\"humidity\":\"43\",\"condition\":\"晴\",\"tp\":\"-3\",\"wind_lv\":\"1级\",\"wind_level\":\"轻微\",\"wind_direct\":\"西北风\"},{\"hour\":\"5\",\"humidity\":\"42\",\"condition\":\"晴\",\"tp\":\"-3\",\"wind_lv\":\"1级\",\"wind_level\":\"轻微\",\"wind_direct\":\"西北风\"},{\"hour\":\"6\",\"humidity\":\"42\",\"condition\":\"晴\",\"tp\":\"-4\",\"wind_lv\":\"1级\",\"wind_level\":\"轻微\",\"wind_direct\":\"北风\"},{\"hour\":\"7\",\"humidity\":\"42\",\"condition\":\"晴\",\"tp\":\"-4\",\"wind_lv\":\"1级\",\"wind_level\":\"轻微\",\"wind_direct\":\"北风\"},{\"hour\":\"8\",\"humidity\":\"42\",\"condition\":\"晴\",\"tp\":\"-3\",\"wind_lv\":\"1级\",\"wind_level\":\"轻微\",\"wind_direct\":\"北风\"},{\"hour\":\"9\",\"humidity\":\"38\",\"condition\":\"晴\",\"tp\":\"-1\",\"wind_lv\":\"1级\",\"wind_level\":\"轻微\",\"wind_direct\":\"北风\"},{\"hour\":\"10\",\"humidity\":\"33\",\"condition\":\"晴\",\"tp\":\"1\",\"wind_lv\":\"1级\",\"wind_level\":\"轻微\",\"wind_direct\":\"北风\"},{\"hour\":\"11\",\"humidity\":\"28\",\"condition\":\"晴\",\"tp\":\"4\",\"wind_lv\":\"1级\",\"wind_level\":\"轻微\",\"wind_direct\":\"北风\"},{\"hour\":\"12\",\"humidity\":\"26\",\"condition\":\"晴\",\"tp\":\"7\",\"wind_lv\":\"1级\",\"wind_level\":\"轻微\",\"wind_direct\":\"西北风\"},{\"hour\":\"13\",\"humidity\":\"25\",\"condition\":\"晴\",\"tp\":\"8\",\"wind_lv\":\"1级\",\"wind_level\":\"轻微\",\"wind_direct\":\"西北风\"},{\"hour\":\"14\",\"humidity\":\"24\",\"condition\":\"晴\",\"tp\":\"7\",\"wind_lv\":\"1级\",\"wind_level\":\"轻微\",\"wind_direct\":\"西南风\"},{\"hour\":\"15\",\"humidity\":\"29\",\"condition\":\"晴\",\"tp\":\"6\",\"wind_lv\":\"2级\",\"wind_level\":\"轻微\",\"wind_direct\":\"西风\"},{\"hour\":\"16\",\"humidity\":\"35\",\"condition\":\"晴\",\"tp\":\"4\",\"wind_lv\":\"2级\",\"wind_level\":\"轻微\",\"wind_direct\":\"西南风\"},{\"hour\":\"17\",\"humidity\":\"40\",\"condition\":\"晴\",\"tp\":\"3\",\"wind_lv\":\"2级\",\"wind_level\":\"轻微\",\"wind_direct\":\"西南风\"},{\"hour\":\"18\",\"humidity\":\"41\",\"condition\":\"晴\",\"tp\":\"1\",\"wind_lv\":\"2级\",\"wind_level\":\"轻微\",\"wind_direct\":\"西南风\"},{\"hour\":\"19\",\"humidity\":\"41\",\"condition\":\"晴\",\"tp\":\"1\",\"wind_lv\":\"2级\",\"wind_level\":\"轻微\",\"wind_direct\":\"西南风\"},{\"hour\":\"20\",\"humidity\":\"42\",\"condition\":\"晴\",\"tp\":\"1\",\"wind_lv\":\"2级\",\"wind_level\":\"轻微\",\"wind_direct\":\"西风\"},{\"hour\":\"21\",\"humidity\":\"43\",\"condition\":\"晴\",\"wind_lv\":\"2级\",\"wind_level\":\"轻微\",\"wind_direct\":\"西风\"},{\"hour\":\"22\",\"humidity\":\"44\",\"condition\":\"晴\",\"tp\":\"-1\",\"wind_lv\":\"2级\",\"wind_level\":\"轻微\",\"wind_direct\":\"西风\"},{\"hour\":\"23\",\"humidity\":\"44\",\"condition\":\"晴\",\"tp\":\"-2\",\"wind_lv\":\"2级\",\"wind_level\":\"轻微\",\"wind_direct\":\"西北风\"}]}",
    "msg": "成功",
    "request_id": "test_Random",
    "tts": "北京今天晴，温度-3度到8度，当前温度7度，空气质量优，天冷了，该加衣服了！"
}

```
其中extend_buf为结构化数据，包含15天天气，当天24小时天气和告警信息。每次查到天气都会返回，因为数据太长了，之后的文档省略它。

下面对不同的问法进行举例说明：

##### 询问某地今天的天气

北京今天的天气

请求参数:
```json
{
	"query":"北京今天的天气",
	"date":{
		"type":"datetime_point",
		"text":"今天",
		"date":"2019-12-03"
	},
	"loc":{ 
		"city":"北京市",
		"town":"北京市",
		"loc_ori":"北京"
	},
	"请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```

其中，datetime_point表示询问的天气时间跨度为一天，如果询问多天的，它是 `datetime_interval` 。
date.text 为query中的时间的原始文本，这个一般是语义拆解出来的，做自动化测试的时候，自行配置上，之后返回TTS的时候，会根据它来组合TTS。
当date.type为datetime_point的时候，必须填date.date参数。

loc为位置信息，如果设备上报了GPS信息，还会携带经纬度，如果有经纬度，会优先使用，没有经纬度，使用city和town。后面会介绍使用经纬度查询的case。
loc_ori为query中的地址。返回TTS的时候可能会用到它。如果query中不包含地址，比如"今天天气怎么样"，name无loc_ori。

返回结果:

```json
{
    "code": 0,
    "msg": "成功",
    "tts": "北京今天晴，温度-3度到8度，当前温度7度，空气质量优，天冷了，该加衣服了！"
}

```

##### 询问某地明天的天气
请求参数:
```json
{
	"request_id":"test_Random",
	"query":"北京明天的天气",
	"date":{
		"type":"datetime_point",
		"text":"明天",
		"date":"2019-12-04"
	},
	"loc":{ 
		"city":"北京市",
		"town":"北京市",
		"loc_ori":"北京"
	},
  "请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```

返回结果：
```json
{
    "code": 0,
    "msg": "成功",
    "tts": "北京明天晴，温度-4度到9度，空气质量良"
}
```

##### 询问某地未来一段时间的天气
请求参数:
```json
{
	"query":"北京未来三天的天气",
	"date":{
		"type":"datetime_interval",
		"text":"未来三天",
		"date_start":"2019-12-03",
		"date_end":"2019-12-06"
	},
	"loc":{ 
		"city":"北京市",
		"town":"北京市",
		"loc_ori":"北京"
	},
	"请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```
date.type为datetime_interval，必须携带date_start和date_end。否则会返回失败。并且，date_start最早为昨天，最迟为两周后。总共只包含15天的天气数据(包括昨天)。

返回结果：
```json
{
    "code": 0,
    "msg": "成功",
    "tts": "北京未来三天整体天气晴，温度-6度到9度，整体空气质量良，天冷了，该加衣服了！"
}

```

##### 询问某地的空气质量

请求参数:
```json
{
	"request_id":"test_Random",
	"query":"北京未来三天的空气质量",
	"date":{
		"type":"datetime_interval",
		"text":"今天",
		"date_start":"2019-12-03",
		"date_end":"2019-12-06"
	},
	"loc":{ 
		"city":"北京市",
		"town":"北京市",
		"loc_ori":"北京"
	},
  "请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```
空气质量的数据一般包含本周的，如果在周一问未来三天，可以正确返回，如果在周六问未来三天，只会返回周六和周日的。
Skill约定，问未来N天的时候，会包含当天的。

返回结果：
```json
{
    "code": 0,
    "msg": "成功",
    "tts": "北京今天的空气质量如下：今天优，明天良，后天优，大后天良"
}
```

##### 询问当天指定小时的天气
请求参数:
```json
{
	"query":"北京下午三点的天气",
	"date":{
		"type":"datetime_point",
		"text":"下午三点",
		"date":"2019-12-03",
		"time":"15:00:00"
	},
	"loc":{ 
		"city":"北京市",
		"town":"北京市",
		"loc_ori":"北京"
	},
  "请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```
携带time相关的参数，就会尝试查询指定小时的天气，如果date不是当天，忽略该参数。

返回结果：
```json
{
    "code": 0,
    "msg": "成功",
    "tts": "北京下午三点晴，温度6度，湿度29，比较干燥"
}

```
下面是忽略time参数的例子：
请求参数:
```json
{
	"query":"北京明天下午三点的天气",
	"date":{
		"type":"datetime_point",
		"text":"明天下午三点",
		"date":"2019-12-04",
		"time":"15:00:00"
	},
	"loc":{ 
		"city":"北京市",
		"town":"北京市",
		"loc_ori":"北京"
	},
  "请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```

返回结果：
```json
{
    "code": 0,
    "msg": "成功",
    "tts": "北京明天晴，温度-4度到9度，空气质量良"
}

```
##### 询问当天指定一段小时的天气
请求参数:
```json
{
	"query":"北京下午三点到五点的天气",
	"date":{
		"type":"datetime_point",
		"text":"下午三点到五点",
		"date":"2019-12-03",
		"time_start":"15:00:00",
		"time_end":"17:00:00"
	},
	"loc":{ 
		"city":"北京市",
		"town":"北京市",
		"loc_ori":"北京"
	},
	"请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```

返回结果：
```json
{
    "code": 0,
    "msg": "成功",
    "tts": "北京下午三点到五点晴，温度4度到6度，湿度6到35，比较干燥"
}
```
##### 询问深圳未来十四天天气
请求参数:
```json
{
	"query":"深圳未来十四天的天气",
	"date":{
		"type":"datetime_interval",
		"text":"未来十四天",
		"date_start":"2019-12-03",
		"date_end":"2019-12-16"
	},
	"loc":{ 
		"city":"深圳市",
		"town":"深圳市",
		"loc_ori":"深圳"
	},
  "请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```

返回结果：
```json
{
    "code": 0,
    "msg": "成功",
    "tts": "深圳未来十四天整体天气多云，温度10度到24度，整体空气质量良，略微偏凉，还是蛮舒适的。"
}
```
##### 使用经纬度查询天气
请求参数:
```json
{
	"query":"今天的天气",
	"date":{
		"type":"datetime_point",
		"text":"今天",
		"date":"2019-12-03"
	},
	"loc":{ 
		"lat":39.916666,
		"lon":116.4
	},
  "请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```

返回结果：
```
{
    "code": 0,
    "msg": "成功",
    "tts": "故宫博物院今天晴，温度-3度到8度，当前温度7度，空气质量优，天冷了，该加衣服了！"
}
```
##### 使用错误的经纬度查询天气
请求参数:
```json
{
	"query":"今天的天气",
	"date":{
		"type":"datetime_point",
		"text":"今天",
		"date":"2019-12-03"
	},
	"loc":{ 
		"lat":139,
		"lon":116.4
	},
	"请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```

返回结果：
```json
{
    "code": 10,
    "msg": "102| LBS Weather param error | lat = 139, lon = 116.4 | Lat is illegal | Lat in [-90, 90]",
    "tts": "抱歉，暂时没有查询到当前的天气数据"
}
```

##### 询问是否为指定的天气
请求参数:
```json
{
	"query":"北京明天会下雨吗",
	"date":{
		"type":"datetime_point",
		"text":"明天",
		"date":"2019-12-04"
	},
	"loc":{ 
		"city":"北京市",
		"town":"北京市",
		"loc_ori":"北京"
	},
	"请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```
注意：回复的TTS第一句为 会下雨或者不会下雨，这个是根据query中的关键字进行判断的，也可以带在参数的intention字段中。
支持的关键字有：

```json
{"太阳", "晴", "阴", "多云", "雨", "雪", "雾", "霾", "霜", "冰雹",
   "浮尘", "扬沙", "沙尘暴"}
```


返回结果：
```json
{
    "code": 0,
    "msg": "成功",
    "tts": "不会下雨，北京明天晴，温度-4度到9度，空气质量良"
}

```

##### 询问当天指数

请求参数:
```json
{
	"query":"北京今天适合运动吗",
	"date":{
		"type":"datetime_point",
		"text":"今天",
		"date":"2019-12-03"
	},
	"loc":{ 
		"city":"北京市",
		"town":"北京市",
		"loc_ori":"北京"
	},
  "请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```
注意：回复的TTS第一句为 指数信息，这个是根据query中的关键字进行判断的，也可以带在参数的intention字段中。
支持的关键字和对应的intention为：

```go
if strings.Contains(req.Query, "污染") {
   req.Intention = "空气污染扩散指数"
} else if strings.Contains(req.Query, "紫外线") {
   req.Intention = "紫外线指数"
} else if strings.Contains(req.Query, "感冒") {
   req.Intention = "感冒指数"
} else if strings.Contains(req.Query, "穿衣") {
   req.Intention = "穿衣指数"
} else if strings.Contains(req.Query, "运动") {
   req.Intention = "运动指数"
} else if strings.Contains(req.Query, "交通") {
   req.Intention = "交通指数"
} else if strings.Contains(req.Query, "息斯敏过敏") {
   req.Intention = "息斯敏过敏指数"
} else if strings.Contains(req.Query, "旅游") {
   req.Intention = "旅游指数"
} else if strings.Contains(req.Query, "洗车") {
   req.Intention = "洗车指数"
} else if strings.Contains(req.Query, "钓鱼") {
   req.Intention = "钓鱼指数"
} else if strings.Contains(req.Query, "化妆") {
   req.Intention = "化妆指数"
} else if strings.Contains(req.Query, "放风筝") {
   req.Intention = "放风筝指数"
} else if strings.Contains(req.Query, "心情") {
   req.Intention = "心情指数"
} else if strings.Contains(req.Query, "晨练") {
   req.Intention = "晨练指数"
} else if strings.Contains(req.Query, "逛街") {
   req.Intention = "逛街指数"
} else if strings.Contains(req.Query, "美发") {
   req.Intention = "美发指数"
} else if strings.Contains(req.Query, "感冒") {
   req.Intention = "感冒指数"
} else if strings.Contains(req.Query, "空调") {
   req.Intention = "空调开指数"
} else if strings.Contains(req.Query, "约会") {
   req.Intention = "约会指数"
} else if strings.Contains(req.Query, "舒适度") {
   req.Intention = "舒适度指数"
} else if strings.Contains(req.Query, "划船") {
   req.Intention = "划船指数"
} else if strings.Contains(req.Query, "雨伞") {
   req.Intention = "雨伞指数"
} else if strings.Contains(req.Query, "风寒") {
   req.Intention = "风寒指数"
} else if strings.Contains(req.Query, "夜生活") {
   req.Intention = "夜生活指数"
} else if strings.Contains(req.Query, "路况") {
   req.Intention = "路况指数"
} else if strings.Contains(req.Query, "防晒") {
   req.Intention = "防晒指数"
} else if strings.Contains(req.Query, "啤酒") {
   req.Intention = "啤酒指数"
} else if strings.Contains(req.Query, "晾晒") {
   req.Intention = "晾晒指数"
} else if strings.Contains(req.Query, "中暑") {
   req.Intention = "中暑指数"
}
```
部分指数不一定有对应的TTS数据返回，都是正常的。

返回结果：
```json
{
    "code": 0,
    "msg": "成功",
    "request_id": "test_Random",
    "tts": "气温过低，特别容易着凉感冒，较不适宜户外运动，建议室内运动。北京今天晴，温度-3度到8度，当前温度6度，空气质量优，天冷了，该加衣服了！"
}
```

如果不询问当天的，可能会返回如下结果:
```json
{
    "code": 0,
    "msg": "成功",
    "tts": "抱歉，暂时只能查到今天的指数信息，北京明天晴，温度-4度到9度，空气质量良"
}

```

##### 询问是否升降温
请求参数:
```json
{
	"query":"北京今天会升温吗",
	"date":{
		"type":"datetime_point",
		"text":"今天",
		"date":"2019-12-03"
	},
	"loc":{ 
		"city":"北京市",
		"town":"北京市",
		"loc_ori":"北京"
	},
  "请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```
注意，升温和降温是通过query的关键字来判断的，也可以放在intention中，支持的关键字：升温、降温。对低温和昨天涨了4度算升温，最高温和昨天相差4度算降温。（昨天以询问的那天作为参照）
返回结果：

```json
{
    "code": 0,
    "msg": "成功",
    "request_id": "test_Random",
    "tts": "温度和昨天差不多，北京今天晴，温度-3度到8度，当前温度6度，空气质量优，天冷了，该加衣服了！"
}
{
    "code": 0,
    "msg": "成功",
    "request_id": "test_Random",
    "tts": "不会升温，北京今天晴，温度-3度到8度，当前温度6度，空气质量优，天冷了，该加衣服了！"
}
{
    "code": 0,
    "msg": "成功",
    "tts": "会升温，北京今天晴，温度-3度到8度，当前温度6度，空气质量优，天冷了，该加衣服了！"
}
```


##### 询问温度
请求参数:
```json
{
	"query":"北京今天的温度",
	"date":{
		"type":"datetime_point",
		"text":"今天",
		"date":"2019-12-03"
	},
	"loc":{ 
		"city":"北京市",
		"town":"北京市",
		"loc_ori":"北京"
	},
  "请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```

根据query的关键字温度或者intention为温度。

返回结果：
```json
{
    "code": 0,
    "msg": "成功",
    "tts": "北京今天温度-3度到8度，当前温度6度，晴"
}

```


##### 询问湿度
请求参数:
```json
{
	"query":"北京今天的湿度",
	"date":{
		"type":"datetime_point",
		"text":"今天",
		"date":"2019-12-03"
	},
	"loc":{ 
		"city":"北京市",
		"town":"北京市",
		"loc_ori":"北京"
	},
  "请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```

根据query的关键字湿度或者intention为湿度。

返回结果：
```json
{
    "code": 0,
    "msg": "成功",
    "tts": "北京今天晴，湿度29，比较干燥"
}
```
##### 注意事项

1. 关于时间date参数：可以为一天，可以为几天，可以为一天的某一小时，可以为一天的某几小时。

2. 关于天气数据的范围：天气包含昨天开始的15天数据，空气质量包含本周的数据，指数包含当天的数据，某小时的天气包含当天的数据。

3. 关于位置loc参数:优先使用lat和lon，再使用city和town，如果这些都不存在，尝试使用loc_ori、province、country。city和town优先使用全部满足、再使用town、再使用city。

4. 如果参数中的date不符合约定(字段缺失、查询的子意图目标和时间段不匹配)或者loc不符合约定(字段缺失)，会返回对应的错误TTS：

   `抱歉，暂时只能查到昨天和未来十四天的天气` 

   `抱歉，暂时只能查到今天的指数信息` 

   `抱歉，暂时只能查到本周的空气质量` 

   `抱歉，暂时没有相关信息，你可以问我 北京今天的天气` 

   `请问你想要查询哪里的天气` 

   `抱歉，暂时没有查询到当前的天气数据` 

   `	抱歉，暂时没有查询相关的天气信息，您可以到中国天气网站自助查询` 

#### 获取fm资源

**更新说明：**支持原有请求方式不变，主要有以下两点更新

> 1、请求接口由https://{BASE_URL}/xwcloudapi/**fm**?resource_type=xxxx更新为https://{BASE_URL}/xwcloudapi/**resources**?resource_type=xxxx
>
> 2、请求携带参数发生改变

**请求地址**：https://{BASE_URL}/xwcloudapi/resources?resource_type=xxxx

##### 相关字段说明

​	FM大多数接口都会返回资源信息，在返回Json数据中为resources字段内容。resources字段内容与**FM技能请求返回**一致。

##### 获取播放资源

url参数: resource_type=play_res

**请求参数**：

```
{
	"fm_type": 4,
	"请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```
**参数说明**

| 参数    | 是否必传 | 说明                                                         |
| ------- | -------- | ------------------------------------------------------------ |
| fm_type | 必传   | 1代表电台;
 2代表小说;
 3代表相声; 
 4代表评书;
 5代表故事; 
 6代表笑话; 
 7代表杂烩; |

**返回结果**

```
{
	"code": 0,
	"data": {
		"resources": [{
			"duration": 1861,
			"music_album_name": "狄公案之双钉奇冤",
			"music_cover_url": "http://imgcache.qq.com/fm/photo/album/rmid_album_360/2/K/004QmZZS0pNJ2K.jpg?time=1511101797",
			"music_name": "第001回",
			"music_singer": "评书精选",
			"play_count": -1,
			"playable": 1,
			"res_content": "http://ws.stream.fm.qq.com/R196002TG7a64QMNEQ.m4a?fromtag=36&guid=1598842438&vkey=8B359E41C1E348B7201AEB79963B660DA10925C007454ECEF3B16327D06A73DCEDFFF9B2BFCFB51842955F0D277F50C80016C51FDE72E0E0",
			"res_id": "unique_id=rd002TG7a64QMNEQ&type=4&album_id=rd004QmZZS0pNJ2K&show_sequence=1"
		},
                      .....................
    {
			"duration": 1864,
			"music_album_name": "狄公案之双钉奇冤",
			"music_cover_url": "http://imgcache.qq.com/fm/photo/album/rmid_album_360/2/K/004QmZZS0pNJ2K.jpg?time=1511101797",
			"music_name": "第006回",
			"music_singer": "评书精选",
			"play_count": -1,
			"playable": 1,
			"res_content": "http://ws.stream.fm.qq.com/R196002MA0ae1g8QpQ.m4a?fromtag=36&guid=1598842438&vkey=31F63BEF95F6A0E6E29D2C24C0E1780A74AF0B284E33A83B6843C3B99F162F0C0B11DD6F91A9562199BB6701D4E1D509A38AD9317B9AC92B",
			"res_id": "unique_id=rd002MA0ae1g8QpQ&type=4&album_id=rd004QmZZS0pNJ2K&show_sequence=6"
		}]
	},
	"msg": "OK"
}
```

##### 获取收藏列表

url参数: resource_type=get_fav_list

**请求参数:**

```json
{
  "count": 2,
  "is_up": false,
  "res_id":"",
  "fm_type": 0
	"请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```

**参数说明**

| 参数    | 是否必传 | 说明                                                         |
| ------- | -------- | ------------------------------------------------------------ |
| count   | 非必传   | 返回资源数量:默认为10                                        |
| res_id  | 非必传   | 当前播放的资源id                                             |
| fm_type | 非必传   | 0代表未知; 
 1代表电台;
 2代表小说;
 3代表相声; 
 4代表评书;
 5代表故事; 
 6代表笑话; 
 7代表杂烩; |

**返回结果:**

```json
{
	"code": 0,
	"data": {
		"resources": [{
			"duration": 436,
			"music_album_name": "诗词之美",
			"music_cover_url": "http://imgcache.qq.com/fm/photo/programe/rmid_programe_360/O/y/004R6rE4422cOy.jpg?time=1515392259",
			"music_name": "浪淘沙令帘外雨潺潺-李煜",
			"music_singer": "凯紫",
			"play_count": -1,
			"playable": 1,
			"res_content": "http://ws.stream.fm.qq.com/R196004R6rE4422cOy.m4a?fromtag=36&guid=1584070744&vkey=5E8A7F9503AAE8161F97C55D4CD5263841D4B49ED3C13AC3E31C7272801C3B05F1F96DD0021CC81AED31412214AA0A71103793FE9F2FC7D8",
			"res_id": "unique_id=rd004R6rE4422cOy&type=0&album_id=rd0009oiN53obftH&show_sequence=4"
		}]
	},
	"msg": "OK"
}
```

##### 换一个

url参数: resource_type=switch_next

**请求参数:**

```json
{
	"请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```

**返回结果**

换一个返回的结果依赖于获取播放资源传的fm_type。有两种返回结果：

1、当获取播放资源接口中传的fm_type为1时，返回的结果。

```json
{
	"code": 0,
	"data": {
		"control_id": 1000015,                //下一首指令的控制id
		"tts": "好的，为你切换下一首"
	},
	"msg": "OK"
}
```

**说明**：control_id为1000015表示播放下一首的指令。

2、当获取播放资源接口中传的fm_type非1时，返回的结果。

```
{
	"code": 0,
	"data": {
		"res_info": [{
			"duration": 1821,
			"music_album_name": "狄公案之迷宫游孽",
			"music_cover_url": "http://imgcache.qq.com/fm/photo/album/rmid_album_360/1/x/003Ol0QH1gWe1x.jpg?time=1511101650",
			"music_name": "第001回",
			"music_singer": "评书精选",
			"offset_milliseconds": 0,
			"play_count": -1,
			"playable": 1,
			"res_content": "http://ws.stream.fm.qq.com/R1960024SuDp0D4I6R.m4a?fromtag=36&guid=1598923745&vkey=8D5D456E20E85AB98C09E8161D0DD76869D11E0A5109E8C37D3BBAF2A9454246FEBBCD7F9E16C227878F59E1631088BE089CD16AC2B6B849",
			"res_id": "unique_id=rd0024SuDp0D4I6R&type=4&album_id=rd003Ol0QH1gWe1x&show_sequence=1",
			"res_type": 0
		}, 
                     ........................
    {
			"duration": 1810,
			"music_album_name": "狄公案之迷宫游孽",
			"music_cover_url": "http://imgcache.qq.com/fm/photo/album/rmid_album_360/1/x/003Ol0QH1gWe1x.jpg?time=1511101650",
			"music_name": "第006回",
			"music_singer": "评书精选",
			"offset_milliseconds": 0,
			"play_count": -1,
			"playable": 1,
			"res_content": "http://ws.stream.fm.qq.com/R196000R1LoC1HMmKw.m4a?fromtag=36&guid=1598923745&vkey=37F0CE625EE8DE012893925DE0AFE58F6FCFDA6CB6D6224DFDEF54772EC8314325FE4E00680BF766CFAA4BC0F6AB441BEA5DFF528BE9021F",
			"res_id": "unique_id=rd000R1LoC1HMmKw&type=4&album_id=rd003Ol0QH1gWe1x&show_sequence=6",
			"res_type": 0
		}],
		"tts": "好的，为你播放狄公案之迷宫游孽，第001回"
	},
	"msg": "OK"
}
```



##### 根据资源id查询播放的节目信息

url参数: resource_type=get_res_detail

**请求参数:**

```json
{
  "res_id_list":["unique_id=rd004R6rE4422cOy&type=5&album_id=rd0009oiN53obftH&show_sequence=8"],
  "fm_type": 0,
	"请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```

**参数说明**

| 参数        | 是否必传 | 说明                                                         |
| ----------- | -------- | ------------------------------------------------------------ |
| res_id_list | 必传     | 为数组类型，资源id                                           |
| fm_type     | 非必传   | 0代表未知; 
 1代表电台;
 2代表小说;
 3代表相声; 
 4代表评书;
 5代表故事; 
 6代表笑话; 
 7代表杂烩; |

**返回结果:**

```json
{
	"code": 0,
	"data": {
		"resources": [{
			"duration": 436,
			"music_album_name": "诗词之美",
			"music_cover_url": "http://imgcache.qq.com/fm/photo/programe/rmid_programe_360/O/y/004R6rE4422cOy.jpg?time=1515392259",
			"music_name": "浪淘沙令帘外雨潺潺-李煜",
			"music_singer": "凯紫",
			"play_count": -1,
			"playable": 1,
			"res_content": "http://ws.stream.fm.qq.com/R196004R6rE4422cOy.m4a?fromtag=36&guid=1584070744&vkey=6C18ACC04466D76C31E62B454B2F5F9D348F46B0E8A792A1D62417825FA9313B268639E520EF835E43E20C6398E06FF2FB27010C8191F5EB",
			"res_id": "unique_id=rd004R6rE4422cOy&type=0&album_id=rd0009oiN53obftH&show_sequence=8"
		}]
	},
	"msg": "OK"
}
```

##### 预拉取更多

url参数: resource_type=pre_get_more

**请求参数:**

```json
{
  "count": 2,
  "res_id": "unique_id=rd004R6rE4422cOy&type=0&album_id=rd0009oiN53obftH&show_sequence=8",
	"请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```

**参数说明**

| 参数   | 是否必传 | 说明                   |
| ------ | -------- | ---------------------- |
| count  | 非必传   | 返回资源数量：默认10首 |
| res_id | 非必传   | 当前播放的资源id       |

**返回结果:**

```json
{
	"code": 0,
	"data": {
		"resources": [{
			"duration": 205,
			"music_album_name": "《小屁孩上学记》",
			"music_cover_url": "http://imgcache.qq.com/fm/photo/programe/rmid_programe_360/g/r/000ady4k0z8mgr.jpg?time=1490865994",
			"music_name": "小屁孩上学记 -07校长不会系鞋带",
			"music_singer": "米粒姐姐",
			"play_count": -1,
			"playable": 1,
			"res_content": "http://ws.stream.fm.qq.com/R196000ady4k0z8mgr.m4a?fromtag=36&guid=1584070745&vkey=8461F9DD0F819DBDBEEF5D688DE5217F680788D649C54CBAA3F481B221D52EEFED8F0A50BD22DA87A39077D1FB4674D0FDC7069451BD45F1",
			"res_id": "unique_id=rd000ady4k0z8mgr&type=5&album_id=rd002BquEE1wwttP&show_sequence=7"
		}, {
			"duration": 483,
			"music_album_name": "《小屁孩上学记》",
			"music_cover_url": "http://imgcache.qq.com/fm/photo/programe/rmid_programe_360/E/6/000oWUbG0xY4E6.jpg?time=1490931818",
			"music_name": "小屁孩上学记 -08开学典礼",
			"music_singer": "米粒姐姐",
			"play_count": -1,
			"playable": 1,
			"res_content": "http://ws.stream.fm.qq.com/R196000oWUbG0xY4E6.m4a?fromtag=36&guid=1584070745&vkey=D736211BA4A8B1F1FCD37D1244C826CBC7CE864F80906B7C1D5E84D860CE66DC510B4EE105DB116F185BE00A8B5BB6B46CF41DC92831CDCC",
			"res_id": "unique_id=rd000oWUbG0xY4E6&type=5&album_id=rd002BquEE1wwttP&show_sequence=8"
		}]
	},
	"msg": "OK"
}
```

##### 收藏 取消收藏

url参数: resource_type=set_favorite

**请求参数:**

```json
{
  "res_id": "unique_id=rd004R6rE4422cOy&type=0&album_id=rd0009oiN53obftH&show_sequence=8",
  "favorite": true,
  "fm_type": 2,
	"请求接口基础参数":{xxxxx}  // 详见**请求接口基础参数说明**章节
}
```

**参数说明**

| 参数     | 是否必传 | 说明                                                         |
| -------- | -------- | ------------------------------------------------------------ |
| res_id   | 必传     | 当前播放的资源id                                             |
| favorite | 必传     | true-收藏，false-取消收藏                                    |
| fm_type  | 非必传   | 0代表未知; 
 1代表电台;
 2代表小说;
 3代表相声; 
 4代表评书;
 5代表故事; 
 6代表笑话; 
 7代表杂烩; |

**返回结果:**

```json
{
	"code": 0,
	"data": {
		"tts": "已收藏，你也可以让我取消收藏"
	},
	"msg": "OK"
}
```

### 自定义技能

> 敬请期待！

## 更新日志

12.13号更新

- 所有的请求地址从 xwcloudcgi 更换成xwcloudapi
- 技能请求接口地址从 https://{BASE_URL}/xwcloudapi/text_to_skill  =》https://{BASE_URL}/xwcloudapi/text_to_skills 多了一个s
- 获取音乐资源的接口改为：https://{BASE_URL}/xwcloudapi/resources?resource_type=xxxx

12.17号更新

- asr 接口请求参数添加三个参数 pid  SN query_id
- asr 返回错误码更新

2020.01.10  更新：

- 添加天气的相关接口。
- 更改鉴权字段的分发方式，支持重新获取相同的accesstoken，支持强制刷新。
- 添加了音乐的一些新的错误码。

2020.02.14 更新:

 - asr 接口 参数中 SN变为全大写， 所有接口保持一致，SN大写

2020.02.25 更新： 

 - 增加FM技能接入


 2020.03.13 更新:

 - 获取FM资源的接口改为：https://{BASE_URL}/xwcloudapi/fm?resource_type=xxxx
 - FM服务接口返回的数据格式与音乐的接口相统一
 - 技能请求接口增加FM 新闻 百科 闲聊技能
 - 技能请求接口返回数据增加skill字段，返回给请求用户进行判断
 - 更新技能请求接口音乐技能返回的音乐数据格式

2020.06.03 更新:
 - 在技能请求接口章节中，增加通用控制（"收藏"、"取消收藏"、"播放收藏"、"下一首","上一首","暂停","继续播放","重播","单曲循环","顺序播放","循环播放","随机播放","快进","快退","音量大一点","音量小一点","静音","取消静音"）
 - 在技能请求接口章节中，增加闹钟技能描述
 - 修改FM 技能相关服务接口章节收藏/取消收藏功能返回参数：去掉feeds字段

2020.08.20 更新

- 增加了新的BASEURL地址 
- 音乐增加了新的错误码

2020.09.02更新

- 增加、修改全局错误码
- 增加接口鉴权方式二
- 修改请求接口基础参数说明，调用接口前，请仔细阅读
- 修改技能请求接口相关描述
- 增加skill取值描述
- 新增股票、天气技能
- 音乐搜索歌手可以指定page和返回的num参数
- 获取FM资源修改请求url、调整请求接口参数
- 增加错误码汇总章节
- 增加刷新url接口，刷新过期音乐url
- 修改技能请求接口新闻技能返回字段名称



## 错误码汇总

| code  | desc                                                         |
| ----- | ------------------------------------------------------------ |
| 0     | 成功                                                         |
| 10001 | 系统错误，发生需要联系开发查看                               |
| 10002 | 网络寻址错误，一般不会发生，发生属于底层错误                 |
| 10003 | 底层存储错误，一般也不会发生                                 |
| 20001 | 请求参数为空                                                 |
| 20002 | 请求参数不是合法的json，或者某些字段格式不正确               |
| 20003 | 缺少必要的请求参数                                           |
| 30001 | 接口调用频次超过限制                                         |
| 30002 | 安全检查错误，一般发生在安全签名不正确。                     |
| 30004 | 未注册的pid                                                  |
| 30005 | IP地址没有在IP白名单中                                       |
| 30006 | 没有访问该接口的权限                                         |
| 51002 | asr 系统错误，一般不会遇到                                   |
| 51003 | asr 系统错误，一般不会遇到，                                 |
| 51004 | asr 系统错误，一般不会遇到，                                 |
| 51005 | 静音时间过长                                                 |
| 51006 | 丢包并且一直没有找回                                         |
| 51007 | 无用的语音数据，一般见于已经完整识别了语音，有收到query_id的语音包 |
| 51008 | 语音数据太长了                                               |
| 52000 | 发生未知错误 |
| 52001 | 音乐 系统错误，一般不会遇到                                  |
| 52002 | 音乐系统错误，一般不会遇到                                   |
| 52003 | 请求音乐服务的相关参数错误。                                 |
| 52004 | 请求的音乐资源不存在                                         |
| 52005 | 音乐账号未授权                                               |
| 52006 | 音乐授权信息校验失败                                         |
| 52007 | 音乐授权信息已经过期                                         |
| 52008 | 请求音乐相关接口超限，一般是请求频率太高。                   |
|  52009   | 当前账户没有访问该资源权限。         |
|  52010   | 没有登录                             |
|  52011   | 付费歌曲，非绿钻或付费包会员不能播放 |
|  52012   | 没找到指定的歌手或者歌曲             |
|  52013   | 因歌曲没有版权不能播放               |
|  52014   | 没找到任何歌曲                       |
|  52015   | 因海外地区不能播放                   |
|  52016   | 因歌曲为数字专辑歌曲不能播放         |
|  52017   | 设备的基础会员过期                   |
| 53001 | 语义服务失败 |
|  54001   | FM服务失败                           |
|  55001   | 新闻服务失败                         |
|  56001   | 百科服务失败                         |
