rsshub
Version:
Make RSS Great Again!
119 lines (116 loc) • 4.2 kB
JavaScript
import { n as init_esm_shims, t as __dirname } from "./esm-shims-CzJ_djXG.mjs";
import { t as config } from "./config-C37vj7VH.mjs";
import "./dist-BInvbO1W.mjs";
import "./logger-Czu8UMNd.mjs";
import "./ofetch-BIyrKU3Y.mjs";
import { t as parseDate } from "./parse-date-BrP7mxXf.mjs";
import { t as cache_default } from "./cache-Bo__VnGm.mjs";
import "./helpers-DxBp0Pty.mjs";
import { t as art } from "./render-BQo6B4tL.mjs";
import { t as got_default } from "./got-KxxWdaxq.mjs";
import path from "node:path";
import CryptoJS from "crypto-js";
//#region lib/routes/feng/utils.ts
init_esm_shims();
const apiUrl = "https://api.wfdata.club";
const baseUrl = "https://www.feng.com";
const KEY = "2b7e151628aed2a6";
const getXRequestId = (apiUrl$1) => {
const path$1 = new URL(apiUrl$1).pathname;
const plainText = CryptoJS.enc.Utf8.parse("url=" + path$1 + "$time=" + Date.now() + "000000");
const iv = CryptoJS.enc.Utf8.parse(KEY);
return CryptoJS.AES.encrypt(plainText, iv, {
iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}).toString();
};
const getCategory = (topicId) => {
const url = `${apiUrl}/v1/topic/category`;
return cache_default.tryGet(url, async () => {
return (await got_default(url, { headers: {
Referer: `${baseUrl}/forum/${topicId}`,
"X-Request-Id": getXRequestId(url)
} })).data;
}, config.cache.routeExpire, false);
};
const getForumMeta = async (topicId) => {
const categoryData = await getCategory(topicId);
return Object.values(categoryData.data.dataList).find((item) => item.dataList.find((i) => i.topicId === topicId));
};
const getThreads = (topicId, type) => {
const url = `${apiUrl}/v1/topic/${topicId}/thread?topicId=${topicId}&type=${type}&pageCount=50&order=${type === "newest" ? "replyTime" : "postTime"}&page=1`;
return cache_default.tryGet(url, async () => {
return (await got_default(url, { headers: {
Referer: `${baseUrl}/forum/${topicId}`,
"X-Request-Id": getXRequestId(url)
} })).data;
}, config.cache.routeExpire, false);
};
const getThread = (tid, topicId) => {
const url = `${apiUrl}/v1/thread/${tid}`;
return cache_default.tryGet(url, async () => {
return (await got_default(url, { headers: {
Referer: `${baseUrl}/forum/${topicId}`,
"X-Request-Id": getXRequestId(url)
} })).data;
});
};
//#endregion
//#region lib/routes/feng/forum.ts
const route = {
path: "/forum/:id/:type?",
categories: ["bbs"],
example: "/feng/forum/1",
parameters: {
id: "版块 ID,可在版块 URL 找到",
type: "排序,见下表,默认为 `all`"
},
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false
},
radar: [{
source: ["feng.com/forum/photo/:id", "feng.com/forum/:id"],
target: "/forum/:id"
}],
name: "社区",
maintainers: ["TonyRL"],
handler,
description: `| 最新回复 | 最新发布 | 热门 | 精华 |
| -------- | -------- | ---- | ------- |
| newest | all | hot | essence |`
};
async function handler(ctx) {
const topicId = Number(ctx.req.param("id"));
const { type = "all" } = ctx.req.param();
const topicMeta = (await getForumMeta(topicId)).dataList.find((data) => data.topicId === topicId);
const threads = (await getThreads(topicId, type)).data.dataList.map((data) => ({
title: data.title,
pubDate: parseDate(data.dateline * 1e3),
author: data.userBaseInfo.userName,
link: `${baseUrl}/post/${data.tid}`,
tid: data.tid
}));
const posts = await Promise.all(threads.map(async (item) => {
const thread = await getThread(item.tid, topicId);
if (thread.status.code === 0) {
const img = art(path.join(__dirname, "templates/img-8d8353ed.art"), { images: thread.data.thread.fengTalkImage.length ? thread.data.thread.fengTalkImage : void 0 });
item.description = thread.data.thread.message + img;
} else item.description = art(path.join(__dirname, "templates/deleted-48cd3c75.art"), {});
delete item.tid;
return item;
}));
return {
title: `${topicMeta.topicName} - 社区 - 威锋 - 千万果粉大本营`,
description: topicMeta.topicDescription,
link: `${baseUrl}/forum/${topicId}`,
item: posts
};
}
//#endregion
export { route };