From 8426215d5f7543ae157215bb2a068915d89406ab Mon Sep 17 00:00:00 2001 From: zhiyu1998 Date: Wed, 15 Mar 2023 23:46:38 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8C=88=20style:=20=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/neteasepro.js | 200 ++++++++++++++++++++++++++------------------- 1 file changed, 118 insertions(+), 82 deletions(-) diff --git a/apps/neteasepro.js b/apps/neteasepro.js index 61fdbb3..8c2189f 100644 --- a/apps/neteasepro.js +++ b/apps/neteasepro.js @@ -1,50 +1,58 @@ import plugin from "../../../lib/plugins/plugin.js"; import axios from "axios"; -import fs from 'node:fs'; -import {segment} from "oicq"; -import {getQrCode, getKey, getLoginStatus, getDailyRecommend, getCookies, getUserRecord, checkMusic, getSong} from '../utils/netease.js'; -import {ha12store, store2ha1} from '../utils/encrypt.js'; +import fs from "node:fs"; +import { segment } from "oicq"; +import { + getQrCode, + getKey, + getLoginStatus, + getDailyRecommend, + getCookies, + getUserRecord, + checkMusic, + getSong, +} from "../utils/netease.js"; +import { ha12store, store2ha1 } from "../utils/encrypt.js"; import fetch from "node-fetch"; - export class neteasepro extends plugin { constructor() { super({ /** 功能名称 */ - name: 'R插件网易云音乐解析', + name: "R插件网易云音乐解析", /** 功能描述 */ - dsc: '网易云音乐解析Pro', + dsc: "网易云音乐解析Pro", /** https://oicqjs.github.io/oicq/#events */ - event: 'message', + event: "message", /** 优先级,数字越小等级越高 */ priority: 1, rule: [ { /** 命令正则匹配 */ - reg: '#网易云登陆', + reg: "#网易云登陆", /** 执行方法 */ - fnc: 'neteaseCloudLogin' + fnc: "neteaseCloudLogin", }, { - reg: '#网易云每日推荐', - fnc: 'neteaseDailyRecommend' + reg: "#网易云每日推荐", + fnc: "neteaseDailyRecommend", }, { - reg: '#网易云听歌排行', - fnc: 'neteaseListenRank' + reg: "#网易云听歌排行", + fnc: "neteaseListenRank", }, { reg: "music.163.com", fnc: "netease", }, - ] - }) + ], + }); } async neteaseCloudLogin(e) { let neteaseCookie; // 如果不存在cookie - if (!await redis.exists(await this.getRedisKey(e.user_id))) { + if (!(await redis.exists(await this.getRedisKey(e.user_id)))) { // 获取密钥 const key = await getKey(); // console.log(key); @@ -53,28 +61,33 @@ export class neteasepro extends plugin { // 下载qrcode await this.downloadQrCode(qrPic).then(path => { // 发送二维码 - e.reply(segment.image(fs.readFileSync(path))) - }) + e.reply(segment.image(fs.readFileSync(path))); + }); // 定时轮询 await this.poll(key).then(async cookie => { // 存放到redis - neteaseCookie = cookie + neteaseCookie = cookie; }); } else { // 已经登陆过的,直接从redis取出 - neteaseCookie = await store2ha1(JSON.parse(await redis.get(await this.getRedisKey(e.user_id))).cookie) + neteaseCookie = await store2ha1( + JSON.parse(await redis.get(await this.getRedisKey(e.user_id))).cookie, + ); } // 获取用户信息 const userInfo = await getLoginStatus(neteaseCookie); // 提取信息 - const {userId, nickname, avatarUrl} = userInfo.profile; - e.reply(["欢迎使用 🎶网易云音乐 🎶," + nickname, segment.image(avatarUrl)]) + const { userId, nickname, avatarUrl } = userInfo.profile; + e.reply(["欢迎使用 🎶网易云音乐 🎶," + nickname, segment.image(avatarUrl)]); // 重组后存放到redis {uid, cookie} - await redis.set(await this.getRedisKey(e.user_id), JSON.stringify({ - uid: userId, - cookie: (await ha12store(neteaseCookie)) - })); - return true + await redis.set( + await this.getRedisKey(e.user_id), + JSON.stringify({ + uid: userId, + cookie: await ha12store(neteaseCookie), + }), + ); + return true; } async neteaseDailyRecommend(e) { @@ -88,17 +101,21 @@ export class neteasepro extends plugin { const combineMsg = await dailyRecommend.dailySongs.slice(0, 10).map(item => { // 组合数据 return { - message: [segment.text(`${item?.id}: ${item?.name}-${item?.ar?.[0].name}-${item?.al?.name}`) - , segment.image(item?.al?.picUrl)], + message: [ + segment.text( + `${item?.id}: ${item?.name}-${item?.ar?.[0].name}-${item?.al?.name}`, + ), + segment.image(item?.al?.picUrl), + ], nickname: e.sender.card || e.user_id, user_id: e.user_id, - } - }) + }; + }); await e.reply(await Bot.makeForwardMsg(combineMsg)); } async neteaseListenRank(e) { - const userInfo = await this.aopBefore(e) + const userInfo = await this.aopBefore(e); const realCookie = userInfo.cookie; if (realCookie === "") { return true; @@ -106,37 +123,50 @@ export class neteasepro extends plugin { // 获取用户id const uid = userInfo.uid; // 获取听歌排行榜 - const userRecord = await getUserRecord(uid) + const userRecord = await getUserRecord(uid); let rankId = 0; - e.reply(" 😘亲,这是你的听歌排行榜Top10") + e.reply(" 😘亲,这是你的听歌排行榜Top10"); const rank = userRecord.weekData.slice(0, 10).map(item => { // 组合数据 const song = item.song; rankId++; return { - message: [segment.text(`No.${rankId} ${song?.id}: ${song?.name}-${song?.ar?.[0].name}-${song?.al?.name}`) - , segment.image(song?.al?.picUrl)], + message: [ + segment.text( + `No.${rankId} ${song?.id}: ${song?.name}-${song?.ar?.[0].name}-${song?.al?.name}`, + ), + segment.image(song?.al?.picUrl), + ], nickname: e.sender.card || e.user_id, user_id: e.user_id, - } - }) + }; + }); await e.reply(await Bot.makeForwardMsg(rank)); } async netease(e) { - const message = e.msg === undefined ? e.message.shift().data.replaceAll("\\", "") : e.msg.trim(); + const message = + e.msg === undefined ? e.message.shift().data.replaceAll("\\", "") : e.msg.trim(); const musicUrlReg = /(http:|https:)\/\/music.163.com\/song\/media\/outer\/url\?id=(\d+)/; const musicUrlReg2 = /(http:|https:)\/\/y.music.163.com\/m\/song\?(.*)&id=(\d+)/; - const id = musicUrlReg2.exec(message)[3] || musicUrlReg.exec(message)[2] || /id=(\d+)/.exec(message)[1]; - const musicJson = JSON.parse(message) - const {musicUrl, preview, title, desc} = musicJson.meta.music || musicJson.meta.news; - console.log(musicUrl, preview, title, desc) + const id = + musicUrlReg2.exec(message)[3] || + musicUrlReg.exec(message)[2] || + /id=(\d+)/.exec(message)[1]; + const musicJson = JSON.parse(message); + const { musicUrl, preview, title, desc } = musicJson.meta.music || musicJson.meta.news; + console.log(musicUrl, preview, title, desc); // 如果没有登陆,就使用官方接口 e.reply([`识别:网易云音乐,${title}--${desc}`, segment.image(preview)]); - if (!await redis.exists(await this.getRedisKey(e.user_id))) { - this.downloadMp3(`music.163.com/song/media/outer/url?id=${id}`, 'follow').then(path => { - Bot.acquireGfs(e.group_id).upload(fs.readFileSync(path), '/', `${title.replace(/[\/\?<>\\:\*\|".… ]/g, '')}.mp3`) - }) + if (!(await redis.exists(await this.getRedisKey(e.user_id)))) { + this.downloadMp3(`music.163.com/song/media/outer/url?id=${id}`, "follow") + .then(path => { + Bot.acquireGfs(e.group_id).upload( + fs.readFileSync(path), + "/", + `${title.replace(/[\/\?<>\\:\*\|".… ]/g, "")}.mp3`, + ); + }) .catch(err => { console.error(`下载音乐失败,错误信息为: ${err.message}`); }); @@ -144,16 +174,21 @@ export class neteasepro extends plugin { } // 检查当前歌曲是否可用 const checkOne = await checkMusic(id); - if (checkOne.success === 'false') { + if (checkOne.success === "false") { e.reply(checkOne.message); return true; } - const userInfo = await this.aopBefore(e) + const userInfo = await this.aopBefore(e); // 可用,开始下载 - const userDownloadUrl = (await getSong(id, await userInfo.cookie))[0].url - await this.downloadMp3(userDownloadUrl).then(path => { - Bot.acquireGfs(e.group_id).upload(fs.readFileSync(path), '/', `${title.replace(/[\/\?<>\\:\*\|".… ]/g, '')}.mp3`) - }) + const userDownloadUrl = (await getSong(id, await userInfo.cookie))[0].url; + await this.downloadMp3(userDownloadUrl) + .then(path => { + Bot.acquireGfs(e.group_id).upload( + fs.readFileSync(path), + "/", + `${title.replace(/[\/\?<>\\:\*\|".… ]/g, "")}.mp3`, + ); + }) .catch(err => { console.error(`下载音乐失败,错误信息为: ${err.message}`); }); @@ -171,7 +206,7 @@ export class neteasepro extends plugin { return ""; } // 解析cookie - userInfo.cookie = store2ha1(cookie) + userInfo.cookie = store2ha1(cookie); return userInfo; } @@ -185,7 +220,7 @@ export class neteasepro extends plugin { }, responseType: "stream", }) - .then((resp) => { + .then(resp => { const filepath = "./netease_qr.jpg"; const writer = fs.createWriteStream(filepath); resp.data.pipe(writer); @@ -201,19 +236,21 @@ export class neteasepro extends plugin { let timer; return new Promise((resolve, reject) => { timer = setInterval(async () => { - const statusRes = await getCookies(key) - console.log(statusRes) + const statusRes = await getCookies(key); + console.log(statusRes); if (statusRes.code === 800) { - clearInterval(timer) - reject('二维码已过期,请重新获取') + clearInterval(timer); + reject("二维码已过期,请重新获取"); } if (statusRes.code === 803) { // 这一步会返回cookie - clearInterval(timer) + clearInterval(timer); const cookie = statusRes.cookie; - resolve(/__csrf=[0-9a-z]+;/.exec(cookie)[0] + /MUSIC_U=[0-9a-z]+;/.exec(cookie)[0]); + resolve( + /__csrf=[0-9a-z]+;/.exec(cookie)[0] + /MUSIC_U=[0-9a-z]+;/.exec(cookie)[0], + ); } - }, 3000) + }, 3000); }); } @@ -223,36 +260,35 @@ export class neteasepro extends plugin { * @param redirect * @returns {Promise} */ - async downloadMp3(mp3Url, redirect='manual') { + async downloadMp3(mp3Url, redirect = "manual") { return fetch(mp3Url, { headers: { "User-Agent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Mobile Safari/537.36", }, responseType: "stream", - redirect: redirect - }) - .then(res => { - const path = `./data/rcmp4/${this.e.group_id || this.e.user_id}/temp.mp3` - const fileStream = fs.createWriteStream(path); - res.body.pipe(fileStream); - return new Promise((resolve, reject) => { - fileStream.on("finish", () => { - fileStream.close(() => { - resolve(path); - }); - }); - fileStream.on("error", err => { - fs.unlink(path, () => { - reject(err); - }); + redirect: redirect, + }).then(res => { + const path = `./data/rcmp4/${this.e.group_id || this.e.user_id}/temp.mp3`; + const fileStream = fs.createWriteStream(path); + res.body.pipe(fileStream); + return new Promise((resolve, reject) => { + fileStream.on("finish", () => { + fileStream.close(() => { + resolve(path); }); }); - }) + fileStream.on("error", err => { + fs.unlink(path, () => { + reject(err); + }); + }); + }); + }); } // 获取redis的key async getRedisKey(user_id) { return `Yz:rconsole:netease:${user_id}`; } -} \ No newline at end of file +}