UNPKG

rsshub

Version:
116 lines (107 loc) 3.81 kB
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(); }