由于QQ版本更新,现在在很多地方小卡片的显示都会出故障。现在点歌可能只会返回连接了。这个bug的修复可能得等比较长的一段时间。
使用教程
第一次使用
更新版本
- 只用下载WisteriaMusic.zip
- 将
WisteriaMusic.lua
放置于.../Dice[你的QQ号]/plugin
目录下,旧版本的WisteriaMusic.lua
删去。或者直接将这里面的代码全部复制,替换原本的WisteriaMusic.lua
里面的代码唔,还是请直接下载文件然后放进去。如果出问题可以试试把编码改成utf-8,这可能会解决一些问题
基础使用
.music black river killer
//网易云搜索指定歌曲,返回第一个非vip结果的分享
.music black river killer-Blitzen Trapper
//搜索指定作者的歌曲
.music black river killer#2
//获取搜索页面第三首歌曲
- 版本要求>590(感谢タブー術因为这份教程大部分都是抄的)
更新日志
ver0.2
- 替换了好心人aphonic找到的api后,搜索结果变得正常,也支持一定限度的带作者搜索。
- 解决了搜索结果为vip无法播放的问题(会找到第一个不是vip的歌曲)
- 支持指定获取第几首搜索到的歌曲
已知问题
- 电脑端qq图片无法正常显示,有些歌曲无法发送卡片只能是链接形式,
有时候找到的音乐会很怪更新了接口之后结果和官方客户端搜索结果差不多了
- 返回的分享卡片里面只会有第一个作者
- 很少见的情况下会出现vip歌曲识别误差
发布
感谢myr大佬跟我讲qq音乐有原生的搜索api,过段时间会写(咕)
当前版本ver0.2
实际上想写的是可以记录bgm、根据网易云音乐歌单生成bgm列表的功能,可能遥遥无期了
代码
或许可以作为发送带中文get请求的参考模板,代码如下
msg_order = {}
function encodeURI(s) --对传入参数编码,兼容中文
s = string.gsub(s, "([^%w%.%- ])", function(c) return string.format("%%%02X", string.byte(c)) end)
return string.gsub(s, " ", "+")
end
msg_order[".music"]="getMusic"
function getMusic(msg)--点歌函数本体
local rest = string.match(msg.fromMsg,"^[%s]*(.-)[%s]*$",7)--从传过来的指令匹配歌名
--匹配偏移量,往匹配到的搜索歌曲上去除偏移量
local offsetstring = string.match(rest, "#(.*)")
local offset
local isOffset=0
if(offsetstring~=nil) then --存在偏移
offset=tonumber(offsetstring)
rest = string.match(rest,"(.*)#"..offsetstring)
isOffset=1
else
offset=0
end
local api="http://music.163.com/api/search/pc?s="
local polar=""
if(rest and #rest>0)then
rest=encodeURI(rest)--编码
polar=api..rest.."&type=1&limit=1&offset="..offset--拼接
else--空参,返回默认说明文字
return"你在落满尘埃的书架上找到了一张漆黑的唱片,上面写着……\nWisteriaMusic by 32w ver0.2,发布于Dice!论坛,访问论坛以获得最新版本\n.music black river killer //网易云搜索指定歌曲,返回第一个非vip结果的分享\n.music black river killer-Blitzen Trapper //搜索指定作者的歌曲\n.music black river killer#2 //获取搜索页面第三首歌曲\fver0.2更新日志\n· 替换了好心人aphonic找到的api后,搜索结果变得正常,也支持一定限度的带作者搜索。\n· 解决了搜索结果为vip无法播放的问题(会找到第一个不是vip的歌曲)\n· 支持指定获取第几首搜索到的歌曲"
end
json=require "json"
res,data = http.get(polar)--访问api获取点歌所得信息
local j=json.decode(data)
if(j.result.songCount~=0) then--若找到了这首歌,即里面的songCount不等于0
if(j.result.songs[1].fee==1) then--90%是vip歌曲
if(isOffset==1) then --点歌指定了偏移量,直接返回信息
return "对应位置为vip歌曲,无法播放"
else --未指定偏移量,查找,直到找到第一个非vip歌曲
while(j.result.songs[1].fee==1) do
offset=offset+1
polar=api..rest.."&type=1&limit=1&offset="..offset
res,data = http.get(polar)--访问api获取点歌所得信息
j=json.decode(data)
--print(polar)
end
end
end--会优化(应该会……)
local songid=j.result.songs[1].id--这首歌对应的id,由此可以拼接得到播放地址
local songname=j.result.songs[1].name
local singername=j.result.songs[1].artists[1].name
local img=j.result.songs[1].album.picUrl
local songurl="http://music.163.com/song/media/outer/url?id="..songid
local songpageurl="https://music.163.com/#/song?id="..songid
return "[CQ:xml,data=<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID=\"2\" templateID=\"1\" action=\"web\" brief=\"[♫]"..songname.."\" sourceMsgId=\"0\" url=\""..songpageurl.."\" flag=\"0\" adverSign=\"0\" multiMsgFlag=\"0\" ><item layout=\"2\"><audio cover=\""..img.."\" src=\""..songurl.."\" /><title>"..songname.."</title><summary>"..singername.."</summary></item></msg>]"
else
return "银色的藤蔓将唱片拖入了空间的缝隙中,未能取得对应歌曲"
end
end