rsshub
Version:
Make RSS Great Again!
116 lines (107 loc) • 3.81 kB
text/typescript
import { Route } from '@/types';
import cache from '@/utils/cache';
import got from '@/utils/got';
import { load } from 'cheerio';
import { config } from '@/config';
import { parseDate } from '@/utils/parse-date';
import timezone from '@/utils/timezone';
import { art } from '@/utils/render';
import path from 'node:path';
export const route: Route = {
path: '/digest/:tid',
categories: ['bbs'],
example: '/saraba1st/digest/forum-6-1',
parameters: { tid: '论坛 id' },
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false,
},
name: '论坛摘要',
maintainers: ['shinemoon'],
handler,
description: `版面网址如果为 \`https://stage1st.com/2b/forum-6-1.html\` 那么论坛 id 就是 \`forum-6-1\`。`,
};
async function handler(ctx) {
const tid = ctx.req.param('tid');
const cookieString = config.saraba1st.cookie ?? '';
const host = config.saraba1st.host;
const res = await got(`${host}/2b/${tid}.html`, {
headers: {
Cookie: cookieString,
},
});
const $ = load(res.data);
const title = $('head title').text().replace(/-.*/, '');
const list = $('#threadlisttableid tbody[id^="normalthread_"] tr');
const count = list
.slice(0, ctx.req.query('limit') ? Number(ctx.req.query('limit')) : 20)
.toArray()
.map((each) => {
each = $(each);
const floor = each.find('th.new a.s.xst').text();
const floorUrl = each.find('th.new a.s.xst').attr('href');
return {
title: `${title}:${floor}`,
link: new URL(floorUrl, `${host}/2b/`).href,
author: each.find('td.by cite').text(),
pubDate: timezone(parseDate(each.find('td.by em').first().text()), +8),
};
});
const resultItems = await Promise.all(
count.map((i) =>
cache.tryGet(i.link, async () => {
i.description = await fetchContent(i.link);
return i;
})
)
);
return {
title: `Stage1 论坛 - ${title}`,
link: `${host}/2b/${tid}.html`,
// item: await resultItems,
item: resultItems,
};
}
async function fetchContent(url) {
// Fetch the subpageinof
const cookieString = config.saraba1st.cookie ?? '';
const subres = await got(url, {
headers: {
Cookie: cookieString,
},
});
const subind = load(subres.data);
const stubS = subind('<div>');
subind('#postlist')
.find('div[id*="post_"] ')
.each(function () {
if (subind(this).find('td[id*="postmessage_"]').length > 0) {
const section = art(path.join(__dirname, 'templates/digest.art'), {
author: {
link: subind(this).find('.pls.favatar div.authi a').attr('href'),
name: subind(this).find('.pls.favatar div.authi').text(),
postinfo: subind(this).find('div.authi em[id*=authorposton]').text(),
},
msg: subind(this).find('td[id*="postmessage_"]').html(),
host: config.saraba1st.host,
});
stubS.append(section);
}
});
stubS.find('img').each(function () {
const img = subind(this);
const file = img.attr('file');
if (file) {
img.attr('src', file);
img.removeAttr('zoomfile');
img.removeAttr('file');
img.removeAttr('onmouseover');
img.removeAttr('onclick');
}
});
return stubS.html();
}