MiraiBot 简介

不写了

功能构想

群员可以通过发送“点歌[歌名]”指令让狼宝回复对应歌曲卡片内容。

功能实现

识别指令后,获取到歌名之后,根据API构建OKHTTP3.request,一般包含[url],[param],[header]。然后创建OKHTTP3.client,来向API请求request中的请求,最后将获取OKHTTP3.response,使用alibaba.fastjson2从中提取出需要的[songName],[songId],[artisName],[albumPicUrl],最后构建音乐卡片信息发送到群内。

1
2
3
4
5
6
7
8
gm=>operation: 获取歌名
cr=>operation: 创建request
cc=>operation: 创建client并执行
gr=>operation: 获取response
pr=>operation: 解析response获取歌曲信息
cmc=>operation: 创建音乐卡片
sg=>operation: 发送群内
gm->cr->cc->gr->pr->cmc->sg

获取歌名

截取消息除点歌外后面信息

1
2
3
4
5
msg.startsWith("点歌") -> {
//获取歌名
val song = msg.substring(2,msg.length)
println(song)
}

创建request

分别构建httpUrl,headers并将param加入到httpUrl中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//配置API信息
val CLOUDMUSICAPI = "http://music.163.com/api/search/pc"
val params = mutableMapOf<String, String>("s" to song, "type" to "1")
val headers = Headers.headersOf(
"User-Agent",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36",
"Cookie",
"NMTID=00OROY9zyHPYl3__EqTgjOOsH0yh2sAAAGA1axg4Q"
)
val httpUrl = CLOUDMUSICAPI.toHttpUrl().newBuilder()
if (params != null) {
for (param in params){
httpUrl.addQueryParameter(param.key,param.value)
}
}
val request = Request.Builder().url(httpUrl.build()).headers(headers).build();

创建client后执行request并获取response

创建client后通过newCall(request).execute()来获取到响应的response实例,然后再获取到实际的响应data放置在responseStr中,最后关闭response。

1
2
3
4
5
6
7
8
9
10
11
12
//创建client
val client = OkHttpClient()
var responseStr = ""
try {
val response = client.newCall(request).execute()
responseStr = response.body!!.string()
if(response.body != null) {
response.body!!.close();
}
}catch (e: IOException){
log.info("Get Request Error!")
}

解析response获取[songName],[songId],[artisName],[albumPicUrl]

解析response的data数据,具体怎么写,可以学习alibaba.fastjson。

1
2
3
4
5
6
7
//处理查询结果,获取想要的数据
val songsJsonArray = JSON.parseObject(responseStr).getJSONObject("result").getJSONArray("songs")
val songJsonObject = songsJsonArray.getJSONObject(0)
val songName = songJsonObject.getString("name")
val songId = songJsonObject.getLong("id").toString()
val artisName = songJsonObject.getJSONArray("artists").getJSONObject(0).getString("name")
val albumPicUrl = songJsonObject.getJSONObject("album").getString("picUrl")

创建音乐卡片并发送到群内

创建音乐卡片,配置内容:

名称 内容
kind 音乐卡片类型
title 歌名
summary 专辑名
brief 忘了
jumpUrl 歌曲链接
pictureUrl 封面图片链接
musicUrl 歌曲播放链接
1
2
3
4
5
6
7
8
9
10
11
//配饰音乐卡片消息并发送
val musicShare = MusicShare(
kind = MusicKind.NeteaseCloudMusic,
title = songName,
summary = artisName,
brief = "",
jumpUrl = CLOUDMUSICJUMPURL + songId,
pictureUrl = albumPicUrl,
musicUrl = CLOUDMUSICURL + songId
)
this.group.sendMessage(musicShare)

结语

一个简单的对公共网络API的调用和音乐卡片的消息类型的实践。