参考

概述

一般来说,手机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前,要把播放地址里的&转码为&amp;字符实体。
  • 后面模板中用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,我目前使用的是通过搜你妹引擎获取到的这些信息


rockswang
1.4k 声望154 粉丝

To play is Human