diff --git a/lib/v2/jike/topic.js b/lib/v2/jike/topic.js index 50e91271f1..3ac7927b87 100644 --- a/lib/v2/jike/topic.js +++ b/lib/v2/jike/topic.js @@ -1,53 +1,42 @@ const got = require('@/utils/got'); -const common = require('./common'); +const { topicDataHanding } = require('./utils'); const cheerio = require('cheerio'); const dayjs = require('dayjs'); +const { constructTopicEntry } = require('@/v2/jike/utils'); module.exports = async (ctx) => { const id = ctx.params.id; + const topicUrl = `https://m.okjike.com/topics/${id}`; - const response = await got(`https://m.okjike.com/topics/${id}`); + const data = await constructTopicEntry(ctx, topicUrl); - const html = response.data; - const $ = cheerio.load(html); - const raw = $('[type = "application/json"]').html(); - const data = JSON.parse(raw).props.pageProps; - - if (common.emptyResponseCheck(ctx, data)) { - return; - } - - const topic = data.topic; - ctx.state.data = { - title: `${topic.content} - 即刻圈子`, - link: `https://m.okjike.com/topics/${id}`, - description: topic.briefIntro, - image: topic.squarePicture.picUrl || topic.squarePicture.middlePicUrl || topic.squarePicture.thumbnailUrl, - item: common.topicDataHanding(data), - }; - if (id === '553870e8e4b0cafb0a1bef68' || id === '55963702e4b0d84d2c30ce6f') { - const promises = ctx.state.data.item.map((one) => { - const item = { ...one }; - const regResult = /https:\/\/www\.okjike\.com\/medium\/[a-zA-Z0-9]*/.exec(item.description); - if (regResult) { - const newsUrl = regResult[0]; - item.description = ctx.cache.tryGet(newsUrl, async () => { - const { data } = await got(newsUrl); - const $ = cheerio.load(data); - const upper = $('ul.main > li.item'); - const links = upper.find('a').map((_, ele) => $(ele).attr('href')); - const texts = upper.find('span.text').map((_, ele) => $(ele).text()); - let description = ''; - for (let i = 0; i < links.length; i++) { - description += `${i + 1}、${texts[i]}
`; + if (data) { + ctx.state.data.item = topicDataHanding(data); + if (id === '553870e8e4b0cafb0a1bef68' || id === '55963702e4b0d84d2c30ce6f') { + ctx.state.data.item = await Promise.all( + ctx.state.data.item.map(async (one) => { + const item = { ...one }; + const regResult = /https:\/\/www\.okjike\.com\/medium\/[a-zA-Z0-9]*/.exec(item.description); + if (regResult) { + const newsUrl = regResult[0]; + item.description = await ctx.cache.tryGet(newsUrl, async () => { + const { data } = await got(newsUrl); + const $ = cheerio.load(data); + const upper = $('ul.main > li.item'); + const links = upper.find('a').map((_, ele) => $(ele).attr('href')); + const texts = upper.find('span.text').map((_, ele) => $(ele).text()); + let description = ''; + for (let i = 0; i < links.length; i++) { + description += `${i + 1}、${texts[i]}
`; + } + description = description.replace(/
$/, ''); + return description; + }); } - return description; - }); - } - item.title = `${topic.content} ${dayjs(one.pubDate).format('MM月DD日')}`; - return item; - }); - - ctx.state.data.item = await Promise.all(promises); + item.title = `${data.topic.content} ${dayjs(one.pubDate).format('MM月DD日')}`; + return item; + }) + ); + } } }; diff --git a/lib/v2/jike/topicText.js b/lib/v2/jike/topicText.js index 64df1e2669..20332dc647 100644 --- a/lib/v2/jike/topicText.js +++ b/lib/v2/jike/topicText.js @@ -1,36 +1,21 @@ -const got = require('@/utils/got'); const dayjs = require('dayjs'); -const common = require('./common'); -const cheerio = require('cheerio'); +const { constructTopicEntry } = require('./utils'); module.exports = async (ctx) => { const id = ctx.params.id; + const topicUrl = `https://m.okjike.com/topics/${id}`; - const response = await got(`https://m.okjike.com/topics/${id}`); + const data = await constructTopicEntry(ctx, topicUrl); - const html = response.data; - const $ = cheerio.load(html); - const raw = $('[type = "application/json"]').html(); - const data = JSON.parse(raw).props.pageProps; - - if (common.emptyResponseCheck(ctx, data)) { - return; - } - - const title = data.topic.content; - - ctx.state.data = { - title: `${title} - 即刻`, - link: `https://m.okjike.com/topics/${id}`, - description: `${title} - 即刻`, - item: data.posts.map((item) => { + if (data) { + ctx.state.data.item = data.posts.map((item) => { const date = dayjs(item.createdAt); return { - title: `${title} ${date.format('MM月DD日')}`, + title: `${data.topic.content} ${date.format('MM月DD日')}`, description: item.content.replace(/\n/g, '
'), pubDate: date.toDate(), link: `https://m.okjike.com/originalPosts/${item.id}`, }; - }), - }; + }); + } }; diff --git a/lib/v2/jike/common.js b/lib/v2/jike/utils.js similarity index 85% rename from lib/v2/jike/common.js rename to lib/v2/jike/utils.js index 64609732b2..fc24c2d104 100644 --- a/lib/v2/jike/common.js +++ b/lib/v2/jike/utils.js @@ -1,14 +1,9 @@ const { parseDate } = require('@/utils/parse-date'); +const got = require('@/utils/got'); +const cheerio = require('cheerio'); +const config = require('@/config').value; module.exports = { - emptyResponseCheck: (ctx, data) => { - if (data.length === 0) { - ctx.state.data = { - title: '主题 ID 不存在,或该主题暂无内容', - }; - return true; - } - }, topicDataHanding: (data) => data.posts.map((item) => { let audioName, videoName, linkName; @@ -133,4 +128,37 @@ module.exports = { link, }; }), + constructTopicEntry: async (ctx, url) => { + const data = await ctx.cache.tryGet( + url, + async () => { + const resp = await got(url); + const html = resp.data; + const $ = cheerio.load(html); + const raw = $('[type = "application/json"]').html(); + return JSON.parse(raw).props.pageProps; + }, + false, + config.cache.routeExpire + ); + + if (data.length === 0) { + ctx.state.data = { + title: '主题 ID 不存在,或该主题暂无内容', + }; + return null; + } + + const topic = data.topic; + + ctx.state.data = { + title: `${topic.content} - 即刻圈子`, + link: url, + description: topic.briefIntro, + image: topic.squarePicture.picUrl || topic.squarePicture.middlePicUrl || topic.squarePicture.thumbnailUrl, + // item: topicDataHanding(data), + }; + + return data; + }, };