diff --git a/README.md b/README.md index f04a7de..47f3e81 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,17 @@ | 36氪 | 热榜 | 36kr | 🟢 | | 稀土掘金 | 热榜 | juejin | 🟢 | | 腾讯新闻 | 热点榜 | newsqq | 🟢 | +| 历史上的今天 | 指定日期 | calendar | 🟢 | + +### 特殊接口说明 + +#### 历史上的今天(指定日期) + +将指定的月份和日期传入即可得到当天数据,请注意格式 + +```http +GET https://api-hot.imsyy.top/calendar/date?month=06&day=01 +``` ## 部署 diff --git a/routes/calendar.js b/routes/calendar.js new file mode 100644 index 0000000..c31fce5 --- /dev/null +++ b/routes/calendar.js @@ -0,0 +1,126 @@ +const Router = require("koa-router"); +const calendarRouter = new Router(); +const axios = require("axios"); +const { get, set, del } = require("../utils/cacheData"); + +// 缓存键名 +const cacheKey = "calendarData"; + +// 调用时间 +let updateTime = new Date().toISOString(); + +// 获取月份 +const month = (new Date().getMonth() + 1).toString().padStart(2, "0"); + +// 获取天数 +const day = new Date().getDate().toString().padStart(2, "0"); + +// 调用路径 +const url = `https://baike.baidu.com/cms/home/eventsOnHistory/${month}.json`; + +// 数据处理 +const getData = (data) => { + if (!data) return []; + console.log(data); + return data.map((v) => { + return { + year: v.year, + title: v.title.replace(/<[^>]+>/g, ""), + desc: v.desc.replace(/<[^>]+>/g, ""), + pic: v?.pic_share || v?.pic_index, + avatar: v?.pic_calendar, + type: v.type, + url: v.link, + mobileUrl: v.link, + }; + }); +}; + +// 历史上的今天 +calendarRouter.get("/calendar", async (ctx) => { + console.log("获取历史上的今天"); + try { + // 从缓存中获取数据 + let data = await get(cacheKey); + const from = data ? "cache" : "server"; + if (!data) { + // 如果缓存中不存在数据 + console.log("从服务端重新获取历史上的今天"); + // 从服务器拉取数据 + const response = await axios.get(url); + data = getData(response.data[month][month + day]); + updateTime = new Date().toISOString(); + if (!data) { + ctx.body = { + code: 500, + title: "历史上的今天", + subtitle: month + "-" + day, + message: "获取失败", + }; + return false; + } + // 将数据写入缓存 + await set(cacheKey, data); + } + ctx.body = { + code: 200, + message: "获取成功", + title: "历史上的今天", + subtitle: month + "-" + day, + from, + total: data.length, + updateTime, + data, + }; + } catch (error) { + console.error(error); + ctx.body = { + code: 500, + message: "获取失败", + }; + } +}); + +// 历史上的今天 - 获取指定日期 +calendarRouter.get("/calendar/date", async (ctx) => { + console.log("获取历史上的今天 - 指定日期"); + try { + // 获取参数 + const { month, day } = ctx.query; + if (!month || !day) { + ctx.body = { code: 400, message: "参数不完整" }; + return false; + } + if (month.length == 1 || day.length == 1) { + ctx.body = { code: 400, message: "参数格式错误" }; + return false; + } + // 从服务器拉取最新数据 + const response = await axios.get( + `https://baike.baidu.com/cms/home/eventsOnHistory/${month}.json` + ); + const newData = getData(response.data[month][month + day]); + updateTime = new Date().toISOString(); + console.log("从服务端重新获取历史上的今天"); + // 返回数据 + ctx.body = { + code: 200, + message: "获取成功", + title: "历史上的今天", + subtitle: month + "-" + day, + total: newData.length, + updateTime, + data: newData, + }; + } catch (error) { + // 返回错误信息 + ctx.body = { + code: 500, + title: "历史上的今天", + subtitle: month + "-" + day, + message: "获取失败", + }; + } +}); + +module.exports = calendarRouter; diff --git a/routes/weread.js b/routes/weread.js new file mode 100644 index 0000000..016f7f4 --- /dev/null +++ b/routes/weread.js @@ -0,0 +1,129 @@ +const Router = require("koa-router"); +const wereadRouter = new Router(); +const axios = require("axios"); +const { get, set, del } = require("../utils/cacheData"); + +// 缓存键名 +const cacheKey = "wereadData"; + +// 调用时间 +let updateTime = new Date().toISOString(); + +// 调用路径 +const url = + "https://weread.qq.com/web/bookListInCategory/rising?maxIndex=0&rank=1"; + +// 数据处理 +const getData = (data) => { + if (!data) return []; + return data.map((v) => { + const book = v.bookInfo; + return { + id: book.topic_id, + title: v.topic_name, + desc: v.topic_desc, + pic: v.topic_pic, + hot: v.discuss_num, + url: v.topic_url, + mobileUrl: v.topic_url, + }; + }); +}; + +// 微信读书 +wereadRouter.get("/weread", async (ctx) => { + console.log("获取微信读书"); + try { + // 从缓存中获取数据 + let data = await get(cacheKey); + const from = data ? "cache" : "server"; + if (!data) { + // 如果缓存中不存在数据 + console.log("从服务端重新获取微信读书"); + // 从服务器拉取数据 + const response = await axios.get(url); + data = getData(response.data.books); + updateTime = new Date().toISOString(); + if (!data) { + ctx.body = { + code: 500, + title: "微信读书", + subtitle: "飙升榜", + message: "获取失败", + }; + return false; + } + // 将数据写入缓存 + await set(cacheKey, data); + } + ctx.body = { + code: 200, + message: "获取成功", + title: "微信读书", + subtitle: "飙升榜", + from, + total: data.length, + updateTime, + data, + }; + } catch (error) { + console.error(error); + ctx.body = { + code: 500, + message: "获取失败", + }; + } +}); + +// 微信读书 - 获取最新数据 +wereadRouter.get("/weread/new", async (ctx) => { + console.log("获取微信读书 - 最新数据"); + try { + // 从服务器拉取最新数据 + const response = await axios.get(url); + const newData = getData(response.data); + updateTime = new Date().toISOString(); + console.log("从服务端重新获取微信读书"); + + // 返回最新数据 + ctx.body = { + code: 200, + message: "获取成功", + title: "微信读书", + subtitle: "飙升榜", + 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: "获取成功", + title: "微信读书", + subtitle: "飙升榜", + total: cachedData.length, + updateTime, + data: cachedData, + }; + } else { + // 如果缓存中也没有数据,则返回错误信息 + ctx.body = { + code: 500, + title: "微信读书", + subtitle: "飙升榜", + message: "获取失败", + }; + } + } +}); + +module.exports = wereadRouter;