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
+};