283 lines
8.4 KiB
JavaScript
283 lines
8.4 KiB
JavaScript
import { httpFetch } from '../../request'
|
|
import { dateFormat2 } from '../../index'
|
|
import getMusicInfo from './musicInfo'
|
|
|
|
const emojis = {
|
|
e400846: '😘',
|
|
e400874: '😴',
|
|
e400825: '😃',
|
|
e400847: '😙',
|
|
e400835: '😍',
|
|
e400873: '😳',
|
|
e400836: '😎',
|
|
e400867: '😭',
|
|
e400832: '😊',
|
|
e400837: '😏',
|
|
e400875: '😫',
|
|
e400831: '😉',
|
|
e400855: '😡',
|
|
e400823: '😄',
|
|
e400862: '😨',
|
|
e400844: '😖',
|
|
e400841: '😓',
|
|
e400830: '😈',
|
|
e400828: '😆',
|
|
e400833: '😋',
|
|
e400822: '😀',
|
|
e400843: '😕',
|
|
e400829: '😇',
|
|
e400824: '😂',
|
|
e400834: '😌',
|
|
e400877: '😷',
|
|
e400132: '🍉',
|
|
e400181: '🍺',
|
|
e401067: '☕️',
|
|
e400186: '🥧',
|
|
e400343: '🐷',
|
|
e400116: '🌹',
|
|
e400126: '🍃',
|
|
e400613: '💋',
|
|
e401236: '❤️',
|
|
e400622: '💔',
|
|
e400637: '💣',
|
|
e400643: '💩',
|
|
e400773: '🔪',
|
|
e400102: '🌛',
|
|
e401328: '🌞',
|
|
e400420: '👏',
|
|
e400914: '🙌',
|
|
e400408: '👍',
|
|
e400414: '👎',
|
|
e401121: '✋',
|
|
e400396: '👋',
|
|
e400384: '👉',
|
|
e401115: '✊',
|
|
e400402: '👌',
|
|
e400905: '🙈',
|
|
e400906: '🙉',
|
|
e400907: '🙊',
|
|
e400562: '👻',
|
|
e400932: '🙏',
|
|
e400644: '💪',
|
|
e400611: '💉',
|
|
e400185: '🎁',
|
|
e400655: '💰',
|
|
e400325: '🐥',
|
|
e400612: '💊',
|
|
e400198: '🎉',
|
|
e401685: '⚡️',
|
|
e400631: '💝',
|
|
e400768: '🔥',
|
|
e400432: '👑',
|
|
}
|
|
|
|
const songIdMap = new Map()
|
|
const promises = new Map()
|
|
|
|
export default {
|
|
_requestObj: null,
|
|
_requestObj2: null,
|
|
async getSongId({ songId, songmid }) {
|
|
if (songId) return songId
|
|
if (songIdMap.has(songmid)) return songIdMap.get(songmid)
|
|
if (promises.has(songmid)) return (await promises.get(songmid)).songId
|
|
const promise = getMusicInfo(songmid)
|
|
promises.set(promise)
|
|
const info = await promise
|
|
songIdMap.set(songmid, info.songId)
|
|
promises.delete(songmid)
|
|
return info.songId
|
|
},
|
|
async getComment(mInfo, page = 1, limit = 20) {
|
|
if (this._requestObj) this._requestObj.cancelHttp()
|
|
const songId = await this.getSongId(mInfo)
|
|
|
|
const _requestObj = httpFetch('http://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg', {
|
|
method: 'POST',
|
|
headers: {
|
|
'User-Agent': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)',
|
|
},
|
|
form: {
|
|
uin: '0',
|
|
format: 'json',
|
|
cid: '205360772',
|
|
reqtype: '2',
|
|
biztype: '1',
|
|
topid: songId,
|
|
cmd: '8',
|
|
needmusiccrit: '1',
|
|
pagenum: page - 1,
|
|
pagesize: limit,
|
|
},
|
|
})
|
|
const { body, statusCode } = await _requestObj.promise
|
|
if (statusCode != 200 || body.code !== 0) throw new Error('获取评论失败')
|
|
// console.log(body, statusCode)
|
|
const comment = body.comment
|
|
return {
|
|
source: 'tx',
|
|
comments: this.filterNewComment(comment.commentlist),
|
|
total: comment.commenttotal,
|
|
page,
|
|
limit,
|
|
maxPage: Math.ceil(comment.commenttotal / limit) || 1,
|
|
}
|
|
},
|
|
async getHotComment(mInfo, page = 1, limit = 20) {
|
|
// const _requestObj2 = httpFetch('http://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg', {
|
|
// method: 'POST',
|
|
// headers: {
|
|
// 'User-Agent': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)',
|
|
// },
|
|
// form: {
|
|
// uin: '0',
|
|
// format: 'json',
|
|
// cid: '205360772',
|
|
// reqtype: '2',
|
|
// biztype: '1',
|
|
// topid: songId,
|
|
// cmd: '9',
|
|
// needmusiccrit: '1',
|
|
// pagenum: page - 1,
|
|
// pagesize: limit,
|
|
// },
|
|
// })
|
|
if (this._requestObj2) this._requestObj2.cancelHttp()
|
|
const songId = await this.getSongId(mInfo)
|
|
|
|
const _requestObj2 = httpFetch('https://u.y.qq.com/cgi-bin/musicu.fcg', {
|
|
method: 'POST',
|
|
body: {
|
|
comm: {
|
|
cv: 4747474,
|
|
ct: 24,
|
|
format: 'json',
|
|
inCharset: 'utf-8',
|
|
outCharset: 'utf-8',
|
|
notice: 0,
|
|
platform: 'yqq.json',
|
|
needNewCode: 1,
|
|
uin: 0,
|
|
},
|
|
req: {
|
|
module: 'music.globalComment.CommentRead',
|
|
method: 'GetHotCommentList',
|
|
param: {
|
|
BizType: 1,
|
|
BizId: String(songId),
|
|
LastCommentSeqNo: '',
|
|
PageSize: limit,
|
|
PageNum: page - 1,
|
|
HotType: 1,
|
|
WithAirborne: 0,
|
|
PicEnable: 1,
|
|
},
|
|
},
|
|
},
|
|
headers: {
|
|
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.0.0',
|
|
referer: 'https://y.qq.com/',
|
|
origin: 'https://y.qq.com',
|
|
},
|
|
})
|
|
const { body, statusCode } = await _requestObj2.promise
|
|
// console.log('body', body)
|
|
if (statusCode != 200 || body.code !== 0 || body.req.code !== 0) throw new Error('获取热门评论失败')
|
|
const comment = body.req.data.CommentList
|
|
return {
|
|
source: 'tx',
|
|
comments: this.filterHotComment(comment.Comments),
|
|
total: comment.Total,
|
|
page,
|
|
limit,
|
|
maxPage: Math.ceil(comment.Total / limit) || 1,
|
|
}
|
|
},
|
|
filterNewComment(rawList) {
|
|
return rawList.map(item => {
|
|
let time = this.formatTime(item.time)
|
|
let timeStr = time ? dateFormat2(time) : null
|
|
if (item.middlecommentcontent) {
|
|
let firstItem = item.middlecommentcontent[0]
|
|
firstItem.avatarurl = item.avatarurl
|
|
firstItem.praisenum = item.praisenum
|
|
item.avatarurl = null
|
|
item.praisenum = null
|
|
item.middlecommentcontent.reverse()
|
|
}
|
|
return {
|
|
id: `${item.rootcommentid}_${item.commentid}`,
|
|
rootId: item.rootcommentid,
|
|
text: item.rootcommentcontent ? this.replaceEmoji(item.rootcommentcontent).replace(/\\n/g, '\n') : '',
|
|
time: item.rootcommentid == item.commentid ? time : null,
|
|
timeStr: item.rootcommentid == item.commentid ? timeStr : null,
|
|
userName: item.rootcommentnick ? item.rootcommentnick.substring(1) : '',
|
|
avatar: item.avatarurl,
|
|
userId: item.encrypt_rootcommentuin,
|
|
likedCount: item.praisenum,
|
|
reply: item.middlecommentcontent
|
|
? item.middlecommentcontent.map(c => {
|
|
// let index = c.subcommentid.lastIndexOf('_')
|
|
return {
|
|
id: `sub_${item.rootcommentid}_${c.subcommentid}`,
|
|
text: this.replaceEmoji(c.subcommentcontent).replace(/\\n/g, '\n'),
|
|
time: c.subcommentid == item.commentid ? time : null,
|
|
timeStr: c.subcommentid == item.commentid ? timeStr : null,
|
|
userName: c.replynick.substring(1),
|
|
avatar: c.avatarurl,
|
|
userId: c.encrypt_replyuin,
|
|
likedCount: c.praisenum,
|
|
}
|
|
})
|
|
: [],
|
|
}
|
|
})
|
|
},
|
|
filterHotComment(rawList) {
|
|
return rawList.map(item => {
|
|
return {
|
|
id: `${item.SeqNo}_${item.CmId}`,
|
|
rootId: item.SeqNo,
|
|
text: item.Content ? this.replaceEmoji(item.Content).replace(/\\n/g, '\n') : '',
|
|
time: item.PubTime ? this.formatTime(item.PubTime) : null,
|
|
timeStr: item.PubTime ? dateFormat2(this.formatTime(item.PubTime)) : null,
|
|
userName: item.Nick ? item.Nick : '',
|
|
images: item.Pic ? [item.Pic] : [],
|
|
avatar: item.Avatar,
|
|
location: item.Location ? item.Location : '',
|
|
userId: item.EncryptUin,
|
|
likedCount: item.PraiseNum,
|
|
reply: item.SubComments
|
|
? item.SubComments.map(c => {
|
|
return {
|
|
id: `sub_${c.SeqNo}_${c.CmId}`,
|
|
text: this.replaceEmoji(c.Content).replace(/\\n/g, '\n'),
|
|
time: c.PubTime ? this.formatTime(c.PubTime) : null,
|
|
timeStr: c.PubTime ? dateFormat2(this.formatTime(c.PubTime)) : null,
|
|
userName: c.Nick ? c.Nick : '',
|
|
avatar: c.Avatar,
|
|
images: c.Pic ? [c.Pic] : [],
|
|
userId: c.EncryptUin,
|
|
likedCount: c.PraiseNum,
|
|
}
|
|
})
|
|
: [],
|
|
}
|
|
})
|
|
},
|
|
replaceEmoji(msg) {
|
|
let rxp = /^\[em\](e\d+)\[\/em\]$/
|
|
let result = msg.match(/\[em\]e\d+\[\/em\]/g)
|
|
if (!result) return msg
|
|
result = Array.from(new Set(result))
|
|
for (let item of result) {
|
|
let code = item.replace(rxp, '$1')
|
|
msg = msg.replace(new RegExp(item.replace('[em]', '\\[em\\]').replace('[/em]', '\\[\\/em\\]'), 'g'), emojis[code] || '')
|
|
}
|
|
return msg
|
|
},
|
|
formatTime(time) {
|
|
return String(time).length < 10 ? null : parseInt(time + '000')
|
|
},
|
|
}
|