93 lines
3.2 KiB
JavaScript
93 lines
3.2 KiB
JavaScript
const got = require('@/utils/got');
|
|
const cheerio = require('cheerio');
|
|
const iconv = require('iconv-lite');
|
|
const timezone = require('@/utils/timezone');
|
|
const { parseDate } = require('@/utils/parse-date');
|
|
const { art } = require('@/utils/render');
|
|
const path = require('path');
|
|
|
|
module.exports = async (ctx) => {
|
|
const { id = '751' } = ctx.params;
|
|
const limit = ctx.query.limit ? parseInt(ctx.query.limit, 10) : 30;
|
|
|
|
const rootUrl = 'https://www.8264.com';
|
|
const currentUrl = new URL(`list/${id}`, rootUrl).href;
|
|
|
|
const { data: response } = await got(currentUrl, {
|
|
responseType: 'buffer',
|
|
});
|
|
|
|
const $ = cheerio.load(iconv.decode(response, 'gbk'));
|
|
|
|
$('div.newslist_info').remove();
|
|
|
|
let items = $('div.newlist_r, div.newslist_r, div.bbslistone_name, dt')
|
|
.find('a')
|
|
.slice(0, limit)
|
|
.toArray()
|
|
.map((item) => {
|
|
item = $(item);
|
|
|
|
const link = item.prop('href');
|
|
|
|
return {
|
|
title: item.text(),
|
|
link: /^http/.test(link) ? link : new URL(link, rootUrl).href,
|
|
};
|
|
});
|
|
|
|
items = await Promise.all(
|
|
items.map((item) =>
|
|
ctx.cache.tryGet(item.link, async () => {
|
|
const { data: detailResponse } = await got(item.link, {
|
|
responseType: 'buffer',
|
|
});
|
|
|
|
const content = cheerio.load(iconv.decode(detailResponse, 'gbk'));
|
|
|
|
content('a.syq, a.xlsj, a.titleoverflow200, #fjump').remove();
|
|
content('i.pstatus').remove();
|
|
content('div.crly').remove();
|
|
|
|
const pubDate = content('span.pub-time').text() || content('span.fby span').first().prop('title') || content('span.fby').first().text().split('发表于').pop().trim();
|
|
|
|
content('img').each(function () {
|
|
content(this).replaceWith(
|
|
art(path.join(__dirname, 'templates/description.art'), {
|
|
image: {
|
|
src: content(this).prop('file'),
|
|
alt: content(this).prop('alt'),
|
|
},
|
|
})
|
|
);
|
|
});
|
|
|
|
item.title = content('h1').first().text();
|
|
item.description = content('div.art-content, td.t_f').first().html();
|
|
item.author = content('a.user-name, #author').first().text();
|
|
item.category = content('div.fl_dh a, div.site a')
|
|
.toArray()
|
|
.map((c) => content(c).text().trim());
|
|
item.pubDate = timezone(parseDate(pubDate, ['YYYY-MM-DD HH:mm', 'YYYY-M-D HH:mm']), +8);
|
|
|
|
return item;
|
|
})
|
|
)
|
|
);
|
|
|
|
const description = $('meta[name="description"]').prop('content').trim();
|
|
const icon = new URL('favicon', rootUrl).href;
|
|
|
|
ctx.state.data = {
|
|
item: items,
|
|
title: `${$('span.country, h2').text()} - ${description.split(',').pop()}`,
|
|
link: currentUrl,
|
|
description,
|
|
language: 'zh-cn',
|
|
icon,
|
|
logo: icon,
|
|
subtitle: $('meta[name="keywords"]').prop('content').trim(),
|
|
author: $('meta[name="author"]').prop('content'),
|
|
};
|
|
};
|