diff --git a/README.md b/README.md index 93e59c2..7a3b634 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,8 @@ | 今日头条 | 热榜 | toutiao | 🟢 | | 微博热搜 | 热搜榜 | weibo | 🟢 | | 36氪 | 热榜 | 36kr | 🟢 | -| 腾讯新闻 | 热点榜 | newsqq | 🔴 | +| 稀土掘金 | 热榜 | juejin | 🟢 | +| 腾讯新闻 | 热点榜 | newsqq | 🟢 | ## 部署 diff --git a/routes/index.js b/routes/index.js index 6949a46..263b5ff 100644 --- a/routes/index.js +++ b/routes/index.js @@ -10,6 +10,8 @@ const sspaiRouter = require("./sspai"); const tiebaRouter = require("./tieba"); const toutiaoRouter = require("./toutiao"); const thepaperRouter = require("./thepaper"); +const juejinRouter = require("./juejin"); +const newsqqRouter = require("./newsqq"); const router = new Router(); @@ -28,6 +30,8 @@ router.use(sspaiRouter.routes()); router.use(tiebaRouter.routes()); router.use(toutiaoRouter.routes()); router.use(thepaperRouter.routes()); +router.use(juejinRouter.routes()); +router.use(newsqqRouter.routes()); // 404 路由 router.use(async (ctx) => { diff --git a/routes/ithome.js b/routes/ithome.js index f081a72..f85aa1d 100644 --- a/routes/ithome.js +++ b/routes/ithome.js @@ -90,6 +90,7 @@ itHomeRouter.get("/ithome", async (ctx) => { title: "IT之家", subtitle: "热榜", from, + total: data.length, updateTime, data, }; @@ -119,6 +120,7 @@ itHomeRouter.get("/ithome/new", async (ctx) => { title: "IT之家", subtitle: "热榜", updateTime, + total: data.length, data: newData, }; @@ -136,6 +138,7 @@ itHomeRouter.get("/ithome/new", async (ctx) => { message: "获取成功", title: "IT之家", subtitle: "热榜", + total: data.length, updateTime, data: cachedData, }; diff --git a/routes/juejin.js b/routes/juejin.js new file mode 100644 index 0000000..8c71ee8 --- /dev/null +++ b/routes/juejin.js @@ -0,0 +1,115 @@ +const Router = require("koa-router"); +const juejinRouter = new Router(); +const axios = require("axios"); +const { get, set, del } = require("../utils/cacheData"); + +// 缓存键名 +const cacheKey = "juejinData"; + +// 调用时间 +let updateTime = new Date().toISOString(); + +// 调用路径 +const url = + "https://api.juejin.cn/content_api/v1/content/article_rank?category_id=1&type=hot"; + +// 数据处理 +const getData = (data) => { + if (!data) return []; + return data.map((v) => { + return { + id: v.content.content_id, + title: v.content.title, + hot: v.content_counter.hot_rank, + url: `https://juejin.cn/post/${v.content.content_id}`, + mobileUrl: `https://juejin.cn/post/${v.content.content_id}`, + }; + }); +}; + +// 掘金热榜 +juejinRouter.get("/juejin", 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.data); + updateTime = new Date().toISOString(); + // 将数据写入缓存 + 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: "获取失败", + }; + } +}); + +// 掘金热榜 - 获取最新数据 +juejinRouter.get("/juejin/new", async (ctx) => { + console.log("获取掘金热榜 - 最新数据"); + try { + // 从服务器拉取最新数据 + const response = await axios.get(url); + const newData = getData(response.data.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, + message: "获取失败", + }; + } + } +}); + +module.exports = juejinRouter; diff --git a/routes/newsqq.js b/routes/newsqq.js new file mode 100644 index 0000000..955891b --- /dev/null +++ b/routes/newsqq.js @@ -0,0 +1,117 @@ +const Router = require("koa-router"); +const newsqqRouter = new Router(); +const axios = require("axios"); +const { get, set, del } = require("../utils/cacheData"); + +// 缓存键名 +const cacheKey = "newsqqData"; + +// 调用时间 +let updateTime = new Date().toISOString(); + +// 调用路径 +const url = "https://r.inews.qq.com/gw/event/hot_ranking_list?page_size=50"; + +// 数据处理 +const getData = (data) => { + if (!data) return []; + return data.slice(1).map((v) => { + return { + id: v.id, + title: v.title, + desc: v.abstract, + descSm: v.nlpAbstract, + hot: v.readCount, + pic: v.miniProShareImage, + url: `https://new.qq.com/rain/a/${v.id}`, + mobileUrl: `https://view.inews.qq.com/a/${v.id}`, + }; + }); +}; + +// 腾讯热点榜 +newsqqRouter.get("/newsqq", 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.idlist[0].newslist); + updateTime = new Date().toISOString(); + // 将数据写入缓存 + 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: "获取失败", + }; + } +}); + +// 腾讯热点榜 - 获取最新数据 +newsqqRouter.get("/newsqq/new", async (ctx) => { + console.log("获取腾讯热点榜 - 最新数据"); + try { + // 从服务器拉取最新数据 + const response = await axios.get(url); + const newData = getData(response.data.idlist[0].newslist); + 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, + message: "获取失败", + }; + } + } +}); + +module.exports = newsqqRouter;