koishi-plugin-xhs-analyse
Version:
小红书解析自用版本
131 lines (124 loc) • 4.96 kB
JavaScript
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
});