RSSHub/lib/v2/8264/list.js

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'),
};
};