UNPKG

rsshub

Version:
119 lines (116 loc) 4.2 kB
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 };