首先:在qq音乐的官网,能看到如下的歌词数据
这是一个jsonp的数据,但是官方对它做了一些加密,所以还是要通过node去强制改变请求头。
新建一个song.js
import { commonParams } from './config' import axios from 'axios' export function getLyric (mid) { const url = '/api/lyric' const data = Object.assign({}, commonParams, { g_tk: 1930664565, pcachetime: +new Date(), 这里是一段时间戳 hostUin: 0, format: 'json', 因为是请求本地的接口,所以format是json platform: 'yqq', needNewCode: 0, songmid: mid }) return axios.get(url, { params: data }).then((res) => { return Promise.resolve(res.data) }) }然后在node中去强行更改请求头
app.get('/api/lyric', function (req, res) { var url = 'https://szc.y.qq.com/lyric/fcgi-bin/fcg_query_lyric_new.fcg' axios.get(url, { headers: { referer: 'https://y.qq.com/', host: 'c.y.qq.com' }, params: req.query }).then((response) => { res.json(response.data) }).catch((e) => { console.log(e) }) })
然后获取数据的方法封装到class类中:
getLyric () { getLyric(this.mid).then((res) => { if (res.code === ERR_OK) { this.lyric = res.lyric console.log(this.lyric) } }) }
因为请求的仍然是一个jsonp,所以要在后端做一点小小的处理:
var ret = response.data if (typeof ret === 'string') { var reg = /^\w+\(({[^()]+})\)$/ // 以单词a-z,A-Z开头,一个或多个 // \(\)转义括号以()开头结尾 // ()是用来分组 // 【^()】不以左括号/右括号的字符+多个 // {}大括号也要匹配到 var matches = ret.match(reg) if (matches) { ret = JSON.parse(matches[1]) // 对匹配到的分组的内容进行转换 } }以上是通过正则表达式把获取到的jsonp文件转换成json格式