From 26cd2cb2c82f4b747bdd1fc6a73f0d4b02f82a36 Mon Sep 17 00:00:00 2001 From: markmingjie <34265999+markmingjie@users.noreply.github.com> Date: Mon, 1 Jun 2020 12:05:03 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9Aadd=20=E5=8C=97=E4=BA=AC=E6=9E=97?= =?UTF-8?q?=E4=B8=9A=E5=A4=A7=E5=AD=A6=E7=A0=94=E7=A9=B6=E7=94=9F=E9=99=A2?= =?UTF-8?q?=E5=9F=B9=E5=85=BB=E5=8A=A8=E6=80=81=E5=85=A8=E6=96=87=E6=8A=93?= =?UTF-8?q?=E5=8F=96=20(#4876)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/routes/universities/bjfu/grs.js | 65 +++++++++++++++++++++++------ 1 file changed, 52 insertions(+), 13 deletions(-) diff --git a/lib/routes/universities/bjfu/grs.js b/lib/routes/universities/bjfu/grs.js index 43cd3d5d1..b15441ae2 100644 --- a/lib/routes/universities/bjfu/grs.js +++ b/lib/routes/universities/bjfu/grs.js @@ -1,26 +1,65 @@ const got = require('@/utils/got'); const cheerio = require('cheerio'); const iconv = require('iconv-lite'); + module.exports = async (ctx) => { - const link = 'http://graduate.bjfu.edu.cn/pygl/pydt/index.html'; - const response = await got.get(link, { + const url = 'http://graduate.bjfu.edu.cn/pygl/pydt/index.html'; + const response = await got.get(url, { responseType: 'buffer', }); const data = iconv.decode(response.data, 'gb2312'); const $ = cheerio.load(data); - const list = $('.itemList li').slice(0, 10); + const list = $('.itemList li') + .slice(0, 10) + .map((i, e) => { + const element = $(e); + const title = element.find('li a').attr('title'); + const link = element.find('li a').attr('href'); + const date = new Date( + element + .find('li a') + .text() + .match(/\d{4}-\d{2}-\d{2}/) + ); + const timeZone = 8; + const serverOffset = date.getTimezoneOffset() / 60; + const pubDate = new Date(date.getTime() - 60 * 60 * 1000 * (timeZone + serverOffset)).toUTCString(); + + return { + title: title, + description: '', + link: 'http://graduate.bjfu.edu.cn/pygl/pydt/' + link, + author: '北京林业大学研究生院培养动态', + pubDate: pubDate, + }; + }) + .get(); + + const result = await Promise.all( + list.map(async (item) => { + const link = item.link; + + const cache = await ctx.cache.get(link); + if (cache) { + return Promise.resolve(JSON.parse(cache)); + } + + const itemReponse = await got.get(link, { + responseType: 'buffer', + }); + const data = iconv.decode(itemReponse.data, 'gb2312'); + const itemElement = cheerio.load(data); + + item.description = itemElement('.articleTxt').html(); + + ctx.cache.set(link, JSON.stringify(item)); + return Promise.resolve(item); + }) + ); ctx.state.data = { title: '北林研培养动态', - link: link, - description: '北京林业大学研究生院培养动态', - item: - list && - list - .map((index, item) => { - item = $(item); - return { title: item.find('li a').text(), description: item.find('li a').text(), link: item.find('li a').attr('href') }; - }) - .get(), + link: url, + item: result, }; };