diff --git a/docs/other.md b/docs/other.md index 8840faaf3e..2652bcd03b 100644 --- a/docs/other.md +++ b/docs/other.md @@ -31,6 +31,12 @@ pageClass: routes +## ClickMe + +### 文章 + + + ## DHL ### DHL 国际快递包裹追踪 diff --git a/lib/router.js b/lib/router.js index a262149574..542632b4a9 100644 --- a/lib/router.js +++ b/lib/router.js @@ -1935,6 +1935,9 @@ router.get('/gov/cnca/hydt', require('./routes/gov/cnca/hydt')); router.get('/gov/cnca/zxtz', require('./routes/gov/cnca/zxtz')); +// clickme +router.get('/clickme/:site/:grouping/:name', require('./routes/clickme')); + // 文汇报 router.get('/whb/:category', require('./routes/whb/zhuzhan')); diff --git a/lib/routes/clickme/index.js b/lib/routes/clickme/index.js new file mode 100644 index 0000000000..fb19d154d3 --- /dev/null +++ b/lib/routes/clickme/index.js @@ -0,0 +1,70 @@ +const got = require('@/utils/got'); +const cheerio = require('cheerio'); + +module.exports = async (ctx) => { + const site = ctx.params.site === 'r18' ? 'r18' : ''; + const grouping = ctx.params.grouping === 'tag' ? 'tag' : 'category'; + const name = ctx.params.name; + + const url = `https://${site ? 'r18.' : ''}clickme.net/${grouping.slice(0, 1)}/${encodeURIComponent(name)}`; + + const response = await got({ + method: 'post', + url: 'https://api.clickme.net/article/list?key=clickme', + headers: { + Referer: url, + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: `articleType=${site ? 'r18' : 'article'}&subtype=${grouping}&subtypeSlug=${encodeURIComponent(name)}&device=&limit=10&page=1`, + }); + + const category_name = name === 'new' ? '最新' : response.data.data.items[0].categoryName[0].name; + const displayed_name = grouping === 'tag' ? name : category_name; + + const list = response.data.data.items; + + const parseContent = (htmlString) => { + const $ = cheerio.load(htmlString); + const content = $('.article-detail-content'); + return { + description: content.html(), + }; + }; + + const out = await Promise.all( + list.map(async (item) => { + const link = item.url; + + const cache = await ctx.cache.get(link); + if (cache) { + return Promise.resolve(JSON.parse(cache)); + } + + const rssitem = { + title: item.title, + link: link, + author: item.userNick, + pubDate: new Date(item.date * 1000), + }; + + try { + const response = await got.get(link); + const result = parseContent(response.data); + if (!result) { + return Promise.resolve(''); + } + rssitem.description = result.description; + } catch (err) { + return Promise.resolve(''); + } + ctx.cache.set(link, JSON.stringify(rssitem)); + return Promise.resolve(rssitem); + }) + ); + + ctx.state.data = { + title: `ClickMe ${site ? 'R18 ' : ''}- ${displayed_name}`, + link: url, + item: out.filter((item) => item !== ''), + }; +};