mirror of
https://github.com/Jerryplusy/rc-plugin.git
synced 2025-10-14 08:09:19 +00:00
✨ feat: V1.5.4 支持pixivision解析
1. 支持weibo的tv解析(前提要有mid) 2. 支持pixivision解析
This commit is contained in:
parent
fb57635f4c
commit
073ff99395
@ -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 = /<img [^>]*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
|
||||
|
@ -65,6 +65,9 @@
|
||||
- icon: weibo
|
||||
title: "微博"
|
||||
desc: 微博文章分享实时下载
|
||||
- icon: pixv
|
||||
title: "pixivision"
|
||||
desc: pixivision分享实时下载
|
||||
- icon: zuiyou
|
||||
title: "最右(测试阶段)"
|
||||
desc: 最右分享实时下载
|
||||
|
@ -1,7 +1,8 @@
|
||||
- {
|
||||
version: 1.5.3,
|
||||
version: 1.5.4,
|
||||
data:
|
||||
[
|
||||
新增<span class="cmd">Pixivision解析</span>功能,
|
||||
新增<span class="cmd">微博解析</span>功能,
|
||||
新增<span class="cmd">最右解析</span>功能,
|
||||
新增<span class="cmd">米游社解析</span>功能,
|
||||
|
BIN
resources/img/icon/pixv.png
Normal file
BIN
resources/img/icon/pixv.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.4 KiB |
31
utils/weibo.js
Normal file
31
utils/weibo.js
Normal file
@ -0,0 +1,31 @@
|
||||
// Base62 encode function in JavaScript
|
||||
const ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
||||
const base62_encode = (number) => {
|
||||
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
|
||||
};
|
Loading…
x
Reference in New Issue
Block a user