diff --git a/docs/other.md b/docs/other.md index 986097797e..b509bde5e4 100644 --- a/docs/other.md +++ b/docs/other.md @@ -155,6 +155,11 @@ +## 异次元软件世界 + + + + ## 趣头条 diff --git a/lib/router.js b/lib/router.js index 30005ac9f0..1de2734b06 100755 --- a/lib/router.js +++ b/lib/router.js @@ -772,6 +772,9 @@ router.get('/sspai/shortcuts', require('./routes/sspai/shortcutsGallery')); router.get('/sspai/matrix', require('./routes/sspai/matrix')); router.get('/sspai/column/:id', require('./routes/sspai/column')); +// 异次元软件世界 +router.get('/iplay/home', require('./routes/iplay/home')); + // xclient.info router.get('/xclient/app/:name', require('./routes/xclient/app')); diff --git a/lib/routes/iplay/home.js b/lib/routes/iplay/home.js new file mode 100644 index 0000000000..0f70b77f61 --- /dev/null +++ b/lib/routes/iplay/home.js @@ -0,0 +1,28 @@ +const axios = require('../../utils/axios'); +const cheerio = require('cheerio'); +const util = require('./utils'); + +module.exports = async (ctx) => { + const url = `https://www.iplaysoft.com/`; + const response = await axios({ + method: 'get', + url: url, + headers: { + Referer: url, + }, + }); + + const $ = cheerio.load(response.data); + const list = $('#postlist .entry').get(); + + const result = await util.ProcessFeed(list, ctx.cache); + + ctx.state.data = { + title: $('title') + .text() + .split('-')[0], + link: url, + description: $('meta[name="description"]').attr('content'), + item: result, + }; +}; diff --git a/lib/routes/iplay/utils.js b/lib/routes/iplay/utils.js new file mode 100644 index 0000000000..dbbf0871c0 --- /dev/null +++ b/lib/routes/iplay/utils.js @@ -0,0 +1,55 @@ +const axios = require('../../utils/axios'); +const cheerio = require('cheerio'); +const url = require('url'); + +async function load(link) { + const response = await axios.get(link); + const $ = cheerio.load(response.data); + // 处理日期 + const datestr = $('.entry-meta li') + .text() + .match(/生产日期:异次纪元 ([\s\S]*?秒)/)[1] + .match(/(\d{1,2})/gm); + for (let i = 1; i < datestr.length; i++) { + datestr[i] = datestr[i].padStart(2, '0'); + } + const date = new Date('20' + datestr[0] + '-' + datestr[1] + '-' + datestr[2] + ' ' + datestr[3] + ':' + datestr[4] + ':' + datestr[5]); + const timeZone = 8; + const serverOffset = date.getTimezoneOffset() / 60; + const pubDate = new Date(date.getTime() - 60 * 60 * 1000 * (timeZone + serverOffset)).toUTCString(); + // 提取详情 + const description = $('.entry-content').html(); + return { description, pubDate }; + // return { description }; +} + +const ProcessFeed = async (list, caches) => { + const host = 'https://www.iplaysoft.com/'; + return await Promise.all( + list.map(async (item) => { + const $ = cheerio.load(item); + const $title = $('a'); + // 还原相对链接为绝对链接 + const itemUrl = url.resolve(host, $title.attr('href')); + + // 列表上提取到的信息 + const single = { + title: $title.text(), + link: itemUrl, + // author: $('.nickname').text(), + guid: itemUrl, + }; + + // 使用tryGet方法从缓存获取内容。 + // 当缓存中无法获取到链接内容的时候,则使用load方法加载文章内容。 + const other = await caches.tryGet(itemUrl, async () => await load(itemUrl)); + + // 合并解析后的结果集作为该篇文章最终的输出结果 + return Promise.resolve(Object.assign({}, single, other)); + }) + ); +}; + +module.exports = { + ProcessFeed, +};