UNPKG

koishi-plugin-xhs-analyse

Version:

小红书解析自用版本

131 lines (124 loc) 4.96 kB
var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name2 in all) __defProp(target, name2, { get: all[name2], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts var src_exports = {}; __export(src_exports, { Config: () => Config, apply: () => apply, logger: () => logger, name: () => name, usage: () => usage }); module.exports = __toCommonJS(src_exports); var import_koishi = require("koishi"); var import_path = require("path"); var name = "xhs-analyse"; var logger = new import_koishi.Logger("xhs-analyse"); var usage = ` ## 解析群聊中的小红书图片/视频链接 API源码参考(自行部署): https://alist.mu-jie.cc/Public/Other API作者: [@MuJie](https://mu-jie.cc/) <hr> ### 使用方法 请在app中复制链接, 然后发送到群聊中即可解析,不支持如下链接: <pre> 19 【键盘染色:Keycult No.2/65 & Felice 40 - Sachiopro | 小红书 - 你的生活指南】 😆 52QxCQmrMDL3Yja 😆 https://www.xiaohongshu.com/discovery/item/67d9205b000000001d01442b ?source=webshare&xhsshare=pc_web&xsec_token=ABjjxJm5QFO30KoDLhXyBI2Q165Cc6WjaC5gNt1vBibl4=&xsec_source=pc_share </pre> <hr> 插件原作者:https://www.npmjs.com/package/koishi-plugin-xiaohongshu/v/0.0.9 本插件为自用版本,因为此api经常报错code-4,但是第二次请求就能正常返回,所以我在此版本加入重试机制 `; var Config = import_koishi.Schema.object({ apiHost: import_koishi.Schema.string().default("https://api.mu-jie.cc/xhs").description("填写你的API前缀, 以/xhs结尾") }); function apply(ctx, config, session) { async function fetchFromAPI(url, retries = 3, delay = 3e3) { for (let i = 0; i < retries; i++) { try { const result = await ctx.http.get(config.apiHost + "?url=" + url); logger.info("result:", result); if (result.code === 200) { return result; } else if (result.code === -4) { logger.info(`尝试第${i + 1}次解析失败,返回码为 -4,${retries - i}次重试机会...`); if (i < retries - 1) { await new Promise((resolve2) => setTimeout(resolve2, delay)); } } else { logger.info(`尝试第${i + 1}次解析失败,返回码为 ${result.code},不再重试...`); return { code: -1, msg: `${result.msg}` }; } } catch (err) { logger.error(`尝试第${i + 1}次解析失败,发生异常:`, err); } } return { code: -1, msg: `解析失败` }; } __name(fetchFromAPI, "fetchFromAPI"); ctx.middleware(async (session2, next) => { if (!session2.content.includes("xhslink.com")) return next(); const urlRegex = /https?:\/\/[^\s,]+/; const url = session2.content.match(urlRegex); if (!url) return; try { await session2.send("检测到小红书链接,正在解析..."); const result = await fetchFromAPI(url); if (result.code !== 200) { await session2.send(`${result.msg},解析失败`); } const type = result.data.type; const title = result.data.title; const images = result.data.images || []; await session2.send(title.replace(/[|&;$%@"<>()+,]/g, "")); if (type === "视频") { session2.send(import_koishi.h.video(result.data.url)); } else { if (images.length > 3) { const forwardMessages = await Promise.all( images.map((img) => (0, import_koishi.h)("img", { src: img })) ); const forwardMessage = (0, import_koishi.h)("message", { forward: true, children: forwardMessages }); await session2.send(forwardMessage); } else { await Promise.all(images.map((img) => session2.send((0, import_koishi.h)("img", { src: img })))); } } } catch (err) { console.log(err); return `发生错误!; ${err}`; } }); ctx.inject(["console"], (ctx2) => { ctx2.console.addEntry({ dev: (0, import_path.resolve)(__dirname, "../client/index.ts"), prod: (0, import_path.resolve)(__dirname, "../dist") }); }); } __name(apply, "apply"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { Config, apply, logger, name, usage });