79 lines
2.1 KiB
JavaScript
79 lines
2.1 KiB
JavaScript
import { httpGet, httpFetch } from '../../request'
|
|
import { rendererInvoke, NAMES } from '../../../../common/ipc'
|
|
|
|
const kw_token = {
|
|
token: null,
|
|
isGetingToken: false,
|
|
}
|
|
|
|
const translationMap = {
|
|
"{'": '{"',
|
|
"'}\n": '"}',
|
|
"'}": '"}',
|
|
"':'": '":"',
|
|
"','": '","',
|
|
"':{'": '":{"',
|
|
"':['": '":["',
|
|
"'}],'": '"}],"',
|
|
"':[{'": '":[{"',
|
|
"'},'": '"},"',
|
|
"'},{'": '"},{"',
|
|
"':[],'": '":[],"',
|
|
"':{},'": '":{},"',
|
|
}
|
|
|
|
export const objStr2JSON = str => {
|
|
return JSON.parse(str.replace(/(^{'|'}\n$|'}$|':'|','|':\[{'|'}\],'|':{'|'},'|'},{'|':\['|':\[\],'|':{},')/g, s => translationMap[s]))
|
|
}
|
|
|
|
export const formatSinger = rawData => rawData.replace(/&/g, '、')
|
|
|
|
export const matchToken = headers => {
|
|
try {
|
|
return headers['set-cookie'][0].match(/kw_token=(\w+)/)[1]
|
|
} catch (err) {
|
|
return null
|
|
}
|
|
}
|
|
|
|
const wait = time => new Promise(resolve => setTimeout(() => resolve(), time))
|
|
|
|
|
|
export const getToken = (retryNum = 0) => new Promise((resolve, reject) => {
|
|
if (retryNum > 2) return Promise.reject(new Error('try max num'))
|
|
|
|
if (kw_token.isGetingToken) return wait(1000).then(() => getToken(retryNum).then(token => resolve(token)))
|
|
if (kw_token.token) return resolve(kw_token.token)
|
|
kw_token.isGetingToken = true
|
|
httpGet('http://www.kuwo.cn/', (err, resp) => {
|
|
kw_token.isGetingToken = false
|
|
if (err) return getToken(++retryNum)
|
|
if (resp.statusCode != 200) return reject(new Error('获取失败'))
|
|
const token = kw_token.token = matchToken(resp.headers)
|
|
resolve(token)
|
|
})
|
|
})
|
|
|
|
export const decodeLyric = base64Data => rendererInvoke(NAMES.mainWindow.handle_kw_decode_lyric, base64Data)
|
|
|
|
export const tokenRequest = async(url, options = {}) => {
|
|
let token = kw_token.token
|
|
if (!token) token = await getToken()
|
|
if (!options.headers) {
|
|
options.headers = {
|
|
Referer: 'http://www.kuwo.cn/',
|
|
csrf: token,
|
|
cookie: 'kw_token=' + token,
|
|
}
|
|
}
|
|
const requestObj = httpFetch(url, options)
|
|
requestObj.promise = requestObj.promise.then(resp => {
|
|
console.log(resp)
|
|
if (resp.statusCode == 200) {
|
|
kw_token.token = matchToken(resp.headers)
|
|
}
|
|
return resp
|
|
})
|
|
return requestObj
|
|
}
|