diff --git a/docs/blog.md b/docs/blog.md index ca5ba72b73..35d38ebecd 100644 --- a/docs/blog.md +++ b/docs/blog.md @@ -10,6 +10,10 @@ pageClass: routes +## Benedict Evans + + + ## Google Sites ### 文章更新 diff --git a/lib/router.js b/lib/router.js index 1d37bdf284..d51efac170 100644 --- a/lib/router.js +++ b/lib/router.js @@ -48,6 +48,9 @@ router.get('/quicker/update', require('./routes/quicker/update.js')); router.get('/quicker/user/action/:uid/:person', require('./routes/quicker/person.js')); router.get('/quicker/user/:uid/:person', require('./routes/quicker/person.js')); +// Benedict Evans +router.get('/benedictevans', require('./routes/benedictevans/recent.js')); + // bilibili router.get('/bilibili/user/video/:uid/:disableEmbed?', require('./routes/bilibili/video')); router.get('/bilibili/user/article/:uid', require('./routes/bilibili/article')); diff --git a/lib/routes/benedictevans/recent.js b/lib/routes/benedictevans/recent.js new file mode 100644 index 0000000000..5a9dcea899 --- /dev/null +++ b/lib/routes/benedictevans/recent.js @@ -0,0 +1,41 @@ +const cheerio = require('cheerio'); +const got = require('@/utils/got'); + +module.exports = async (ctx) => { + const url = `https://www.ben-evans.com/benedictevans/`; + + const res = await got.get(url); + const $ = cheerio.load(res.data); + const list = $('section > article').get(); + + const out = await Promise.all( + list.map(async (item) => { + const $ = cheerio.load(item); + const title = $('.BlogList-item-title').text(); + const address = 'https://www.ben-evans.com' + $('.BlogList-item-title').attr('href'); + const time = $('.Blog-meta-item--date').text(); + const cache = await ctx.cache.get(address); + if (cache) { + return Promise.resolve(JSON.parse(cache)); + } + const res = await got.get(address); + const capture = cheerio.load(res.data); + const contents = capture('.col.sqs-col-12.span-12').html(); + const single = { + title: title, + author: 'Benedict Evans', + description: contents, + link: address, + guid: address, + pubDate: new Date(time).toUTCString(), + }; + ctx.cache.set(address, JSON.stringify(single)); + return Promise.resolve(single); + }) + ); + ctx.state.data = { + title: `Benedict Evans`, + link: url, + item: out, + }; +};