From 0a6a668dcc2f8c97e1577446f42e95ea93473a20 Mon Sep 17 00:00:00 2001 From: zhiyu1998 <542716863@qq.com> Date: Sat, 2 Mar 2024 11:11:10 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20V1.5.0=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=9C=80=E5=8F=B3=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 新增最右解析 2. 增加适配器,更改ks、xigua、最右为通用解析,为下一步扩展解析业务做准备 3. 修改了一些bug --- apps/tools.js | 111 +++++++--------------------------- config/help.yaml | 5 +- config/version.yaml | 2 +- constants/tools.js | 14 ++++- resources/img/icon/zuiyou.png | Bin 0 -> 20774 bytes utils/general-link-adapter.js | 82 +++++++++++++++++++++++++ 6 files changed, 122 insertions(+), 92 deletions(-) create mode 100644 resources/img/icon/zuiyou.png create mode 100644 utils/general-link-adapter.js diff --git a/apps/tools.js b/apps/tools.js index 1ddad25..1722557 100644 --- a/apps/tools.js +++ b/apps/tools.js @@ -45,17 +45,18 @@ import { getWbi } from "../utils/biliWbi.js"; import { BILI_SUMMARY, DY_INFO, - MIYOUSHE_ARTICLE, + MIYOUSHE_ARTICLE, NETEASE_SONG_DETAIL, NETEASE_SONG_DOWNLOAD, TIKTOK_INFO, TWITTER_TWEET_INFO, XHS_REQ_LINK, XHS_VIDEO, - XIGUA_REQ_LINK + GENERAL_REQ_LINK } from "../constants/tools.js"; import child_process from 'node:child_process' import { getAudio, getVideo } from "../utils/y2b.js"; import { processTikTokUrl } from "../utils/tiktok.js"; import { getDS } from "../utils/mihoyo.js"; +import GeneralLinkAdapter from "../utils/general-link-adapter.js"; export class tools extends plugin { /** @@ -129,17 +130,13 @@ export class tools extends plugin { fnc: "bodianMusic", }, { - reg: "(kuaishou.com)", - fnc: "kuaishou", + reg: "(kuaishou.com|ixigua.com|share.xiaochuankeji.cn)", + fnc: "general", }, { reg: "(youtube.com)", fnc: "y2b" }, - { - reg: "(ixigua.com)", - fnc: "xigua" - }, { reg: "(miyoushe.com)", fnc: "miyoushe" @@ -147,7 +144,7 @@ export class tools extends plugin { { reg: "(music.163.com|163cn.tv)", fnc: "netease", - } + }, ], }); // 配置文件 @@ -579,7 +576,7 @@ export class tools extends plugin { const reg = /https?:\/\/x.com\/[0-9-a-zA-Z_]{1,20}\/status\/([0-9]*)/; const twitterUrl = reg.exec(e.msg)[0]; // 提取视频 - const videoUrl = XIGUA_REQ_LINK.replace("{}", twitterUrl); + const videoUrl = GENERAL_REQ_LINK.replace("{}", twitterUrl); e.reply("识别:小蓝鸟"); axios.get(videoUrl, { headers: { @@ -903,18 +900,24 @@ export class tools extends plugin { JSON.parse(message); return true; } catch (err) { - axios.get(`https://www.oranges1.top/neteaseapi.do/song/url?id=${id}`, { + axios.get(NETEASE_SONG_DOWNLOAD.replace("{}", id), { 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", }, }).then(async resp => { const url = await resp.data.data?.[0].url; - const title = await axios.get(`https://www.oranges1.top/neteaseapi.do/song/detail?ids=${id}`).then(res => { + // 获取歌曲信息 + const title = await axios.get(NETEASE_SONG_DETAIL.replace("{}", id)).then(res => { const song = res.data.songs[0]; return `${song?.name}-${song?.ar?.[0].name}`.replace(/[\/\?<>\\:\*\|".… ]/g, ""); }); e.reply(`识别:网易云音乐,${title}`); + // const mvUrlJson = await getKugouMv(title, 1, 1, 0); + // const mvUrl = mvUrlJson.map(item => item.mv_url)?.[0]; + // this.downloadVideo(mvUrl).then(path => { + // e.reply(segment.video(path + "/temp.mp4")); + // }); downloadMp3(url, 'follow').then(path => { Bot.acquireGfs(e.group_id).upload(fs.readFileSync(path), '/', `${title.replace(/[\/\?<>\\:\*\|".… ]/g, '')}.mp3`) }) @@ -927,41 +930,17 @@ export class tools extends plugin { } /** - * 快手解析 + * 通用解析 * @param e * @return {Promise} */ - async kuaishou(e) { - // 例子:https://www.kuaishou.com/short-video/3xkfs8p4pnd67p4?authorId=3xkznsztpwetngu&streamSource=find&area=homexxbrilliant - // https://v.m.chenzhongtech.com/fw/photo/3xburnkmj3auazc - // https://v.kuaishou.com/1ff8QP - let msg = /(?:https?:\/\/)?(www|v)\.kuaishou\.com\/[A-Za-z\d._?%&+\-=\/#]*/g.exec(e.msg)[0]; - // 跳转短号 - if (msg.includes("v.kuaishou")) { - await fetch(msg, { - headers: { - 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36', - } - }).then(resp => { - msg = resp.url; - }) - } - logger.info(msg) - let video_id; - if (msg.includes('/fw/photo/')) { - video_id = msg.match(/\/fw\/photo\/([^/?]+)/)[1]; - } else if (msg.includes("short-video")) { - video_id = msg.match(/short-video\/([^/?]+)/)[1]; - } else { - e.reply("无法提取快手的信息,请重试或者换一个视频!") - return - } - // 提取视频 - const videoUrl = XIGUA_REQ_LINK.replace("{}", `https://www.kuaishou.com/short-video/${ video_id }`); - e.reply("识别:快手"); - + async general(e) { + const linkAdapter = new GeneralLinkAdapter(e.msg); + const adapter = await linkAdapter.build(); + logger.info(adapter.link) + e.reply(`识别:${adapter.name}`); // 发送GET请求 - axios.get(videoUrl, { + axios.get(adapter.link, { headers: { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'Accept-Language': 'zh-CN,zh;q=0.9', @@ -1098,52 +1077,6 @@ export class tools extends plugin { } } - async xigua(e) { - // 1. https://v.ixigua.com/ienrQ5bR/ - // 2. https://www.ixigua.com/7270448082586698281 - // 3. https://m.ixigua.com/video/7270448082586698281 - let msg = /(?:https?:\/\/)?(www|v|m)\.ixigua\.com\/[A-Za-z\d._?%&+\-=\/#]*/g.exec(e.msg)[0]; - // 跳转短号 - if (msg.includes("v.ixigua")) { - await fetch(msg, { - headers: { - 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36', - } - }).then(resp => { - msg = resp.url; - }) - } - e.reply("识别:🍉视频"); - - const id = /ixigua\.com\/(\d+)/.exec(msg)[1] || /\/video\/(\d+)/.exec(msg)[1]; - const videoReq = `https://www.ixigua.com/${ id }`; - const xiguaHeader = { - 'authority': 'ib.365yg.com', - 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', - 'accept-language': 'zh-CN,zh;q=0.9', - 'cache-control': 'no-cache', - 'pragma': 'no-cache', - 'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"', - 'sec-ch-ua-mobile': '?0', - 'sec-ch-ua-platform': '"macOS"', - 'sec-fetch-dest': 'document', - 'sec-fetch-mode': 'navigate', - 'sec-fetch-site': 'none', - 'sec-fetch-user': '?1', - 'upgrade-insecure-requests': '1', - 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36' - } - axios.get(XIGUA_REQ_LINK.replace("{}", videoReq), { - headers: xiguaHeader - }).then(resp => { - const url = resp.data.data.url; - this.downloadVideo(url).then(path => { - e.reply(segment.video(path + "/temp.mp4")); - }); - }) - return true - } - // 米游社 async miyoushe(e) { let msg = /(?:https?:\/\/)?(m|www)\.miyoushe\.com\/[A-Za-z\d._?%&+\-=\/#]*/.exec(e.msg)[0]; diff --git a/config/help.yaml b/config/help.yaml index 8b2a708..f8b2248 100644 --- a/config/help.yaml +++ b/config/help.yaml @@ -62,6 +62,9 @@ - icon: miyoushe title: "米游社" desc: 米游社文章分享实时下载 + - icon: zuiyou + title: "最右(测试阶段)" + desc: 最右分享实时下载 - icon: literature title: "论文" desc: SCI论文实时解析 @@ -78,4 +81,4 @@ desc: "进行更新R插件" - icon: computer title: "【实验指令】#ocr" - desc: "基于gpt的识图总结" \ No newline at end of file + desc: "基于gpt的识图总结" diff --git a/config/version.yaml b/config/version.yaml index 47b36d8..109edc0 100644 --- a/config/version.yaml +++ b/config/version.yaml @@ -1,5 +1,5 @@ - { - version: 1.4.5, + version: 1.5.0, data: [ 新增米游社解析功能, diff --git a/constants/tools.js b/constants/tools.js index a3d7feb..3571c7a 100644 --- a/constants/tools.js +++ b/constants/tools.js @@ -81,4 +81,16 @@ export const XHS_REQ_LINK = "https://www.xiaohongshu.com/explore/" * 🍉 的请求链接 * @type {string} */ -export const XIGUA_REQ_LINK = "http://47.99.158.118/video-crack/v2/parse?content={}" \ No newline at end of file +export const GENERAL_REQ_LINK = "http://47.99.158.118/video-crack/v2/parse?content={}" + +/** + * 获取网易云歌曲下载链接 + * @type {string} + */ +export const NETEASE_SONG_DOWNLOAD = "https://www.oranges1.top/neteaseapi.do/song/url?id={}" + +/** + * 获取网易云歌曲详情 + * @type {string} + */ +export const NETEASE_SONG_DETAIL = "https://www.oranges1.top/neteaseapi.do/song/detail?ids={}" diff --git a/resources/img/icon/zuiyou.png b/resources/img/icon/zuiyou.png new file mode 100644 index 0000000000000000000000000000000000000000..d886b036ad7348d3a4b6f1891aa6783f828044d3 GIT binary patch literal 20774 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 literal 0 HcmV?d00001 diff --git a/utils/general-link-adapter.js b/utils/general-link-adapter.js new file mode 100644 index 0000000..76c47d6 --- /dev/null +++ b/utils/general-link-adapter.js @@ -0,0 +1,82 @@ +import { GENERAL_REQ_LINK } from "../constants/tools.js"; + +/** + * 第三方接口适配器,用户大面积覆盖解析视频的内容 + */ +class GeneralLinkAdapter { + #url; + + constructor(link) { + console.log("============",link) + if (/share.xiaochuankeji.cn/.test(link)) { + this.#url = this.zuiyou(link); + } else if (/kuaishou.com/.test(link)) { + this.#url = this.ks(link); + } else if (/ixigua.com/.test(link)) { + this.#url = this.xigua(link); + } + } + + async ks(link) { + // 例子:https://www.kuaishou.com/short-video/3xkfs8p4pnd67p4?authorId=3xkznsztpwetngu&streamSource=find&area=homexxbrilliant + // https://v.m.chenzhongtech.com/fw/photo/3xburnkmj3auazc + // https://v.kuaishou.com/1ff8QP + let msg = /(?:https?:\/\/)?(www|v)\.kuaishou\.com\/[A-Za-z\d._?%&+\-=\/#]*/g.exec(link)[0]; + // 跳转短号 + if (msg.includes("v.kuaishou")) { + await fetch(msg, { + headers: { + 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36', + } + }).then(resp => { + msg = resp.url; + }) + } + let video_id; + if (msg.includes('/fw/photo/')) { + video_id = msg.match(/\/fw\/photo\/([^/?]+)/)[1]; + } else if (msg.includes("short-video")) { + video_id = msg.match(/short-video\/([^/?]+)/)[1]; + } else { + throw "无法提取快手的信息,请重试或者换一个视频!"; + } + // 提取视频 + return { + name: "快手", + link: GENERAL_REQ_LINK.replace("{}", `https://www.kuaishou.com/short-video/${ video_id }`) + }; + } + + async zuiyou(link) { + // #最右#分享一条有趣的内容给你,不好看算我输。请戳链接>>https://share.xiaochuankeji.cn/hybrid/share/post?pid=365367131&zy_to=applink&share_count=1&m=dc114ccc8e55492642f6a702b510c1f6&d=9e18ca2dace030af656baea96321e0ea353fe5c46097a7f3962b93f995641e962796dd5faa231feea5531ac65547045f&app=zuiyou&recommend=r0&name=n0&title_type=t0 + const msg = /(?:https?:\/\/)?(share|share.xiaochuankeji)\.cn\/[A-Za-z\d._?%&+\-=\/#]*/.exec(link)[0]; + return {name: "最右", link: GENERAL_REQ_LINK.replace("{}", msg)}; + } + + async xigua(link) { + // 1. https://v.ixigua.com/ienrQ5bR/ + // 2. https://www.ixigua.com/7270448082586698281 + // 3. https://m.ixigua.com/video/7270448082586698281 + let msg = /(?:https?:\/\/)?(www|v|m)\.ixigua\.com\/[A-Za-z\d._?%&+\-=\/#]*/g.exec(link)[0]; + // 跳转短号 + if (msg.includes("v.ixigua")) { + await fetch(msg, { + headers: { + 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36', + } + }).then(resp => { + msg = resp.url; + }) + } + + const id = /ixigua\.com\/(\d+)/.exec(msg)[1] || /\/video\/(\d+)/.exec(msg)[1]; + const videoReq = `https://www.ixigua.com/${ id }`; + return {name: "西瓜", link: GENERAL_REQ_LINK.replace("{}", videoReq)}; + } + + async build() { + return this.#url; + } +} + +export default GeneralLinkAdapter