虽然2018我没有更新过每周歌词,但是其实我还记得这个系列啦!起因是我在翻log的时候发现似乎有人一直都有check每周歌词播放器,贼感动!然而播放器已经不能用了……所以我准备顺手把播放器后台重写一遍。
改进接口
原来的接口是石乐志写的,单php……不仅丑还杂乱不堪、缺少注释。于是我就全部改写了一遍,如何dalao们抓包的话大概就会发现接口转移到/api下了。而且参数校验等等也规范化了(没错就是Biliapi那个框架)。对外暴露的接口只有歌单(/api/songlist)和解析(/api/parse)。
解析接口大换血
看过上一篇开发笔记的dalao应该会知道,这个播放器是支持解析网易云和虾米音乐的。然而悲伤的是原先的解析接口崩了……于是我只能自己分析了。先是虾米的,在播放页面发现每次播放都会请求http://www.xiami.com/song/playlist/id/{SongId}/object_name/default/object_id/0/cat/json(注意要带上Referer:http://www.xiami.com/play?ids=/song/playlist/id/{SongId}/object_name/default/object_id/0)。分析返回的json,发现里面就有个location,不过url是通过一种神秘的编码方法处理过的。分析js,找到这么一个函数:
_getLocation: function(a) { if (-1 !== a.indexOf("http://")) return a; for (var b = Number(a.charAt(0)), c = a.substring(1), d = Math.floor(c.length / b), e = c.length % b, f = new Array, g = 0; e > g; g++) void 0 == f[g] && (f[g] = ""), f[g] = c.substr((d + 1) * g, d + 1); for (g = e; b > g; g++) f[g] = c.substr(d * (g - e) + (d + 1) * e, d); var h = ""; for (g = 0; g < f[0].length; g++) for (var i = 0; i < f.length; i++) h += f[i].charAt(g); h = unescape(h); var j = ""; for (g = 0; g < h.length; g++) j += "^" == h.charAt(g) ? "0" : h.charAt(g); return j = j.replace("+", " ") }
于是这个算法就很容易分析出来了。我发的新年红包就包含了这个编码方法,所以这里就不详细讲了。好奇的dalao可以看这里。
P.S.其实我也搞了网易云的分析,然而服务器在香港……于是只能靠其他dalao的接口了。
解析方式变更
原来的播放器需要一年加载……原因其实是,请求歌单的时候会直接解析所有歌曲!我也不知道为什么我会设计成这样,反正我自己都看不下去。于是现在修正为播放歌曲前进行解析,这样一来就快了不少(而且缓存控制也方便了许多)。
还需改进
其实主要需要改进的都在前端……尤其是手机端的播放体验,不用说我也感觉很差。而且随机播放也很坑,甚至会出现连续2首的情况……嘛,以后我会更的23333
评论