From 073ff9939538e710e752375f6144abf91b52d1aa Mon Sep 17 00:00:00 2001 From: zhiyu1998 <542716863@qq.com> Date: Sun, 3 Mar 2024 14:25:21 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20V1.5.4=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?pixivision=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 支持weibo的tv解析(前提要有mid) 2. 支持pixivision解析 --- apps/tools.js | 80 +++++++++++++++++++++++++++++++++++- config/help.yaml | 3 ++ config/version.yaml | 3 +- resources/img/icon/pixv.png | Bin 0 -> 4522 bytes utils/weibo.js | 31 ++++++++++++++ 5 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 resources/img/icon/pixv.png create mode 100644 utils/weibo.js diff --git a/apps/tools.js b/apps/tools.js index 0e4b838..aada31e 100644 --- a/apps/tools.js +++ b/apps/tools.js @@ -57,6 +57,7 @@ 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"; +import { mid2id } from "../utils/weibo.js"; export class tools extends plugin { /** @@ -148,6 +149,10 @@ export class tools extends plugin { { reg: "(weibo.com|m.weibo.cn)", fnc: "weibo", + }, + { + reg: "(pixivision.net)", + fnc: "pixivision" } ], }); @@ -940,7 +945,11 @@ export class tools extends plugin { if (e.msg.includes("m.weibo.cn")) { // https://m.weibo.cn/detail/4976424138313924 weiboId = /(?<=detail\/)[A-Za-z\d]+/.exec(e.msg)?.[0]; - } else { + } else if (e.msg.includes("weibo.com\/tv\/show") && e.msg.includes("mid=")) { + // https://weibo.com/tv/show/1034:5007449447661594?mid=5007452630158934 + weiboId = /(?<=mid=)[A-Za-z\d]+/.exec(e.msg)?.[0]; + weiboId = mid2id(weiboId); + } else if (e.msg.includes("weibo.com")) { // https://weibo.com/1707895270/5006106478773472 weiboId = /(?<=weibo.com\/)[A-Za-z\d]+\/[A-Za-z\d]+/.exec(e.msg)?.[0]; } @@ -1210,6 +1219,75 @@ export class tools extends plugin { }) } + // pixivision 解析 + async pixivision(e) { + let msg = /https:\/\/www\.pixivision\.net\/zh\/a\/(\d+)/.exec(e.msg)[0]; + if (!msg) { + e.reply("pixivision 无法获取到信息"); + return; + } + fetch(msg, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36", + } + }).then(async resp => { + const html = await resp.text(); + // 正则表达式来匹配包含特定类名的img标签,并捕获src属性的值 + const regex = /]*src="([^"]*)"[^>]*class="[^"]*am__work__illust[^"]*"[^>]*>/g; + + let matches; + const srcs = []; + // 获取图片信息 + while ((matches = regex.exec(html)) !== null) { + // matches[1] 是正则表达式中第一个括号捕获的内容,即src属性的值 + srcs.push(matches[1]); + } + // 获取下载路径 + const curPath = this.getCurDownloadPath(e); + // 下载图片 + Promise.all(srcs.map((item) => { + return new Promise((resolve, reject) => { // 使用新的Promise来控制异步流程 + axios.get(item, { + responseType: 'stream', + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36", + "Referer": "https://www.pixiv.net/", + } + }).then(response => { + const downloadPath = `${curPath}/${item.split('/').pop()}`; + const writer = fs.createWriteStream(downloadPath); + response.data.pipe(writer); + writer.on('finish', () => resolve(downloadPath)); // 在文件写入完成后解决Promise + writer.on('error', reject); // 监听错误事件 + }).catch(reject); // 处理axios请求的错误 + }); + })).then(path => { + // 在这里,path数组包含的是所有下载并成功写入的文件路径 + // 你可以在这里执行e.reply,此时所有文件都已经准备好了 + try { + // 假设e.reply返回一个Promise + e.reply(Bot.makeForwardMsg(path.map(item => ({ + message: segment.image(fs.readFileSync(item)), + nickname: this.e.sender.card || this.e.user_id, + user_id: this.e.user_id, + })))); + + // 删除文件操作 + path.forEach(item => { + try { + fs.unlinkSync(item); + } catch (err) { + logger.error(`删除文件${item}失败,请使用命令”清理data垃圾“进行清理`, err); + } + }); + } catch (error) { + logger.error(`发送消息失败`, error); + } + }); + }); + return true; + } + /** * 哔哩哔哩下载 * @param title diff --git a/config/help.yaml b/config/help.yaml index c694581..b9bb45b 100644 --- a/config/help.yaml +++ b/config/help.yaml @@ -65,6 +65,9 @@ - icon: weibo title: "微博" desc: 微博文章分享实时下载 + - icon: pixv + title: "pixivision" + desc: pixivision分享实时下载 - icon: zuiyou title: "最右(测试阶段)" desc: 最右分享实时下载 diff --git a/config/version.yaml b/config/version.yaml index 5560b65..9ca62af 100644 --- a/config/version.yaml +++ b/config/version.yaml @@ -1,7 +1,8 @@ - { - version: 1.5.3, + version: 1.5.4, data: [ + 新增Pixivision解析功能, 新增微博解析功能, 新增最右解析功能, 新增米游社解析功能, diff --git a/resources/img/icon/pixv.png b/resources/img/icon/pixv.png new file mode 100644 index 0000000000000000000000000000000000000000..cfa5340ca172b75e81171ad26cbc09a16271fe91 GIT binary patch literal 4522 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 { + if (number === 0) return '0'; + let result = ''; + while (number > 0) { + result = ALPHABET[number % 62] + result; + number = Math.floor(number / 62); + } + return result; +}; + +// Convert mid to id +export const mid2id = (mid) => { + mid = mid.toString().split('').reverse().join(''); // Reverse the input string + const size = Math.ceil(mid.length / 7); + let result = []; + + for (let i = 0; i < size; i++) { + let s = mid.slice(i * 7, (i + 1) * 7).split('').reverse().join(''); // Chunk and reverse each chunk + s = base62_encode(parseInt(s, 10)); // Encode each chunk using base62 + if (i < size - 1 && s.length < 4) { + // Pad with leading zeros if necessary + s = '0'.repeat(4 - s.length) + s; + } + result.push(s); + } + + result.reverse(); // Reverse the result array to maintain order + return result.join(''); // Join the array into a single string +};