diff --git a/routes/ngabbs.js b/routes/ngabbs.js new file mode 100644 index 0000000..81e06a4 --- /dev/null +++ b/routes/ngabbs.js @@ -0,0 +1,155 @@ +/** + * @author: x-dr + * @date: 2023年12月25日 + * @tags: [NGA论坛热帖] + */ + +const Router = require("koa-router"); +const ngabbsRouter = new Router(); +const axios = require("axios"); +const { get, set, del } = require("../utils/cacheData"); + + +// 接口信息 +const routerInfo = { name: "ngabbs", title: "NGA", subtitle: "论坛热帖" }; + +// 缓存键名 +const cacheKey = "ngabbsData"; + +// 调用时间 +let updateTime = new Date().toISOString(); + +const url = 'https://ngabbs.com/nuke.php?__lib=load_topic&__act=load_topic_reply_ladder2&opt=1&all=1'; + +const headers = { + 'Host': 'ngabbs.com', + 'Content-Type': 'application/x-www-form-urlencoded', + 'Accept': '*/*', + 'Accept-Encoding': 'gzip, deflate, br', + 'Connection': 'keep-alive', + 'Content-Length': '11', + 'User-Agent': 'NGA/7.3.1 (iPhone; iOS 17.2.1; Scale/3.00)', + 'Accept-Language': 'zh-Hans-CN;q=1', + 'Referer': 'https://ngabbs.com/', + 'X-User-Agent': 'NGA_skull/7.3.1(iPhone13,2;iOS 17.2.1)', +}; +const postData = { '__output': '14' }; +// 数据处理 +const getData = (data) => { + if (!data) return []; + const dataList = []; + try { + + const result = data.result[0]; + result.forEach((result) => { + dataList.push({ + author: result.author, + desc: result.subject, + parent: result.parent['2'], + tid: result.tid, + comments: Number(result.replies), + url: `https://bbs.nga.cn/read.php?tid=${result.tid}`, + mobileUrl: `https://bbs.nga.cn/read.php?tid=${result.tid}`, + + }); + }); + return dataList; + } catch (error) { + console.error("数据处理出错" + error); + return false; + } +}; + +// NGA论坛热帖 +ngabbsRouter.get("/ngabbs", async (ctx) => { + console.log("获取NGA论坛热帖"); + try { + // 从缓存中获取数据 + let data = await get(cacheKey); + const from = data ? "cache" : "server"; + if (!data) { + // 如果缓存中不存在数据 + console.log("从服务端重新获取NGA论坛热帖"); + // 从服务器拉取数据 + const response = await axios.post(url, postData, { headers }); + data = getData(response.data); + updateTime = new Date().toISOString(); + if (!data) { + ctx.body = { + code: 500, + ...routerInfo, + message: "获取失败", + }; + return false; + } + // 将数据写入缓存 + await set(cacheKey, data); + } + ctx.body = { + code: 200, + message: "获取成功", + ...routerInfo, + from, + total: data.length, + updateTime, + data, + }; + } catch (error) { + console.error(error); + ctx.body = { + code: 500, + message: "获取失败", + }; + } +}); + +// NGA论坛热帖 - 获取最新数据 +ngabbsRouter.get("/ngabbs/new", async (ctx) => { + console.log("获取NGA论坛热帖 - 最新数据"); + try { + // 从服务器拉取最新数据 + const response = await axios.post(url, postData, { headers }); + const newData = getData(response.data); + updateTime = new Date().toISOString(); + console.log("从服务端重新获取NGA论坛热帖"); + + // 返回最新数据 + ctx.body = { + code: 200, + message: "获取成功", + ...routerInfo, + total: newData.length, + updateTime, + data: newData, + }; + + // 删除旧数据 + await del(cacheKey); + // 将最新数据写入缓存 + await set(cacheKey, newData); + } catch (error) { + // 如果拉取最新数据失败,尝试从缓存中获取数据 + console.error(error); + const cachedData = await get(cacheKey); + if (cachedData) { + ctx.body = { + code: 200, + message: "获取成功", + ...routerInfo, + total: cachedData.length, + updateTime, + data: cachedData, + }; + } else { + // 如果缓存中也没有数据,则返回错误信息 + ctx.body = { + code: 500, + ...routerInfo, + message: "获取失败", + }; + } + } +}); + +ngabbsRouter.info = routerInfo; +module.exports = ngabbsRouter;