参考
- 作者开发的QQ机器人 - 加文章里的QQ为好友或邀请入群即可体验本文中的音乐卡片
- 开发一个QQ机器人 - 教你如何使用IOTQQ开发QQ机器人
- QQ群 - Javascript高级爬虫 - 作者自建群,欢迎加入!
- 一个帮你自动创建阿里云抢占式实例并开启网络加速的脚本 - 自动创建阿里云海外抢占式节点
概述
一般来说,手机APP的分享到QQ功能,在聊天界面中表现为一个分享卡片,在IOTQQ中则对应的体现为一条JsonMsg或XmlMsg。
IOTQQ可以接收和发送JsonMsg,XmlMsg,但是目前没有这方面的详细说明,只能自己实际验证总结。
笔者研究了一下根据关键词搜索QQ音乐,并在IOTQQ中发QQ音乐卡片消息的方法,这里记录一下。
音乐搜索
第一步 音乐搜索
这里参考的是IOTQQ项目Plugins目录下的music.lua,看来之前已经有逆向大佬把网页的AJAX请求扒出来了,我就不自己费力气了。可惜的是这个插件后面的发送卡片部分现在已经不能成功了,因此不得不自己摸索。
API地址:https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=20&w=<搜索关键字>
注意关键字用UrlEncode一下即可。
响应数据是一段jsonp文本,需要把前面的callback(
和最后的)
去掉之后再JSON解码。
结果列表中,每个元素都包含该音乐在QQ音乐平台中的相关信息,其中关键的几项包括:
- mid - 需要用这个来生成音乐链接
- album.pmid - 需要用这个来生成预览图链接
- title - 音乐的标题
第二步 获取播放地址
这里参考的是这个插件项目中的Music.lua,谢谢逆向大佬!
API地址:https://api.qq.jsososo.com/song/url?type=320&id=${mid}
注意:
- 按Music.lua的原始代码,要伪造很多请求头,经验证只需要User-Agent,其它请求头可忽略。
- 响应数据是json格式,里面的data就是播放地址,也就是音乐的MP3下载地址。
- 传入xml前,要把播放地址里的
&
转码为&
字符实体。 - 后面模板中用songUrl来引用这个播放地址。
发送音乐卡片
准备参数
下面这四个参数无论JSON方式还是XML方式中都会使用,请使用搜索结果中的字段来组装:
- title: 卡片标题,直接使用音乐title
- songUrl: 播放地址,见前文;点击卡片的播放图标可直接在聊天界面后台播放
- jumpUrl: 点击卡片跳转到的H5页面链接;值为
https://y.qq.com/n/yqq/song/<mid>.html
- coverUrl: 卡片上的预览图片;值为
http://y.gtimg.cn/music/photo_new/T002R300x300M00<album.pmid>.jpg?max_age=2592000
- summary: 卡片内容,可自行定制;我这里的取值为
<所有歌手名> - <专辑名>
JSON方式
调用sendMsg发送JsonMsg时,参数中content字段的值为下面的对象stringify后的字符串,注意[]
中的值用前面的参数替换:
{
app: 'com.tencent.structmsg',
config: { autosize: true, ctime: 0, forward: true, token: '6a2658ee487631c2c2d77aa583792dc1', type: 'normal' },
desc: '音乐',
meta: {
music: {
action: '',
android_pkg_name: '',
app_type: 1,
appid: 100497308,
desc: '[summary]',
jumpUrl: '[jumpUrl]',
musicUrl: '[songUrl]',
preview: '[coverUrl]',
sourceMsgId: '0',
source_icon: '',
source_url: '',
tag: 'QQ音乐',
title: '[title]'
}
},
prompt: '[分享][title] - QQ音乐',
ver: '0.0.0.1',
view: 'music'
}
XML方式
调用sendMsg发送XmlMsg时,参数中content字段的值为下面的XML字符串,注意[]
中的值用前面的参数替换:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<msg serviceID="2" templateID="1" action="web" brief="[分享] [title] - QQ音乐" sourceMsgId="0" url="[jumpUrl]" flag="0" adverSign="0" multiMsgFlag="0">
<item layout="2">
<audio cover="[coverUrl]" src="[songUrl]" />
<title>[title]</title>
<summary>[summary]</summary>
</item>
<source name="QQ音乐" icon="https://i.gtimg.cn/open/app_icon/01/07/98/56/1101079856_100_m.png?date=20200503" url="http://web.p.qq.com/qqmpmobile/aio/app.html?id=1101079856" action="app" a_actionData="com.tencent.qqmusic" i_actionData="tencent1101079856://" appid="1101079856" />
</msg>
XML方式发送网易云音乐卡片
与QQ音乐类似,也可以发送网易云音乐的分享卡片,XmlMsg内容如下:
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<msg serviceID="146" templateID="1" action="web" brief="[分享] 芒种 - 网易云音乐" sourceMsgId="0" url="https://y.music.163.com/m/song?id=1369798757" flag="0" adverSign="0" multiMsgFlag="0">
<item layout="2" advertiser_id="0" aid="0">
<picture cover="http://p1.music.126.net/KFWbxh1ZLyy9WR77Ca08tA==/109951164866828786.jpg" w="0" h="0" />
<title>芒种</title>
<summary>音阙诗听,赵方婧 - 二十四节气</summary>
</item>
<source name="网易云音乐" icon="https://url.cn/55gqiDG" url="http://url.cn/5pl4kkd" action="app" a_actionData="com.netease.cloudmusic" i_actionData="tencent100495085://" appid="100495085" />
</msg>
这里主要需要解决的就是通过搜索获取歌曲在网易云音乐中的id, 以及封面图url,我目前使用的是通过搜你妹引擎获取到的这些信息
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。