From 0281592839addb4159a3e2d2d0915301ecd37467 Mon Sep 17 00:00:00 2001 From: Cloud Date: Mon, 1 Jul 2019 11:11:48 +0800 Subject: [PATCH] feat: add zreading fulltext (#2522) * feat: add zreding fulltext * feat: add zreading fulltext * feat: add zreading fulltext * feat: add zreading fulltext --- docs/reading.md | 6 ++++ lib/router.js | 3 ++ lib/routes/zreading/home.js | 56 +++++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 lib/routes/zreading/home.js diff --git a/docs/reading.md b/docs/reading.md index 25d14cc08..0c013eabe 100644 --- a/docs/reading.md +++ b/docs/reading.md @@ -123,3 +123,9 @@ pageClass: routes ### 章节 + +## 左岸读书 + +### 主页 + + diff --git a/lib/router.js b/lib/router.js index 8a64bf629..76552e897 100644 --- a/lib/router.js +++ b/lib/router.js @@ -1452,4 +1452,7 @@ router.get('/changba/:userid', require('./routes/changba/user')); // 掌上英雄联盟 router.get('/lolapp/recommend', require('./routes/lolapp/recommend')); +// 左岸读书 +router.get('/zreading', require('./routes/zreading/home')); + module.exports = router; diff --git a/lib/routes/zreading/home.js b/lib/routes/zreading/home.js new file mode 100644 index 000000000..0ecbe8a34 --- /dev/null +++ b/lib/routes/zreading/home.js @@ -0,0 +1,56 @@ +const got = require('@/utils/got'); +const cheerio = require('cheerio'); +const parser = require('@/utils/rss-parser'); + +module.exports = async (ctx) => { + const feed = await parser.parseURL('http://www.zreading.cn/feed'); + + const ProcessFeed = (data) => { + const $ = cheerio.load(data); + + $('script').remove(); + $('.adsbygoogle').remove(); + + // 还原图片地址 + $('img').each((index, elem) => { + const $elem = $(elem); + $elem.attr('referrerpolicy', 'no-referrer'); + }); + + // 提取内容 + return $('.grap').html(); + }; + + const items = await Promise.all( + feed.items.map(async (item) => { + const cache = await ctx.cache.get(item.link); + if (cache) { + return Promise.resolve(JSON.parse(cache)); + } + + const response = await got({ + method: 'get', + url: item.link, + }); + + const description = ProcessFeed(response.data); + + const single = { + title: item.title, + description, + pubDate: item.pubDate, + link: item.link, + author: item.author, + }; + ctx.cache.set(item.link, JSON.stringify(single)); + return Promise.resolve(single); + }) + ); + + ctx.state.data = { + title: feed.title, + link: feed.link, + description: feed.description, + item: items, + }; +};