diff --git a/lib/config.ts b/lib/config.ts index 782e831a1ac52..6a3dfff1a2b4c 100644 --- a/lib/config.ts +++ b/lib/config.ts @@ -151,6 +151,9 @@ export type Config = { google: { fontsApiKey?: string; }; + guozaoke: { + cookies?: string; + }; hefeng: { key?: string; }; @@ -550,6 +553,9 @@ const calculateValue = () => { google: { fontsApiKey: envs.GOOGLE_FONTS_API_KEY, }, + guozaoke: { + cookies: envs.GUOZAOKE_COOKIES, + }, hefeng: { // weather key: envs.HEFENG_KEY, diff --git a/lib/routes/guozaoke/index.ts b/lib/routes/guozaoke/index.ts new file mode 100644 index 0000000000000..7fb6121568594 --- /dev/null +++ b/lib/routes/guozaoke/index.ts @@ -0,0 +1,102 @@ +import { Route } from '@/types'; +import got from '@/utils/got'; +import { load } from 'cheerio'; +import { parseRelativeDate } from '@/utils/parse-date'; +import { config } from '@/config'; +import cache from '@/utils/cache'; +import asyncPool from 'tiny-async-pool'; + +export const route: Route = { + path: '/default', + categories: ['bbs'], + example: '/guozaoke/default', + parameters: {}, + features: { + requireConfig: false, + requirePuppeteer: false, + antiCrawler: true, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, + name: '过早客', + maintainers: ['xiaoshame'], + handler, + url: 'guozaoke.com/', +}; + +async function handler() { + const url = `https://www.guozaoke.com/`; + const res = await got({ + method: 'get', + url, + headers: { + Cookie: config.guozaoke.cookies, + 'User-Agent': config.ua, + }, + }); + const $ = load(res.data); + + const list = $('div.topic-item').toArray(); + const maxItems = 20; // 最多取20个数据 + const items = []; + for (const item of list) { + if (items.length >= maxItems) { + break; + } + const $item = $(item); + const title = $item.find('h3.title a').text(); + const link = $item.find('h3.title a').attr('href'); + const author = $item.find('span.username a').text(); + const lastTouched = $item.find('span.last-touched').text(); + const time = parseRelativeDate(lastTouched); + if (link) { + items.push({ title, link, author, time }); + } + } + + const out = []; + for await (const result of asyncPool(2, items, (item) => + cache.tryGet(item.link, async () => { + const url = `https://www.guozaoke.com${item.link}`; + const res = await got({ + method: 'get', + url, + headers: { + Cookie: config.guozaoke.cookies, + 'User-Agent': config.ua, + }, + }); + + const $ = load(res.data); + let content = $('div.ui-content').html(); + content = content ? content.trim() : ''; + const comments = $('.reply-item').map((i, el) => { + const $el = $(el); + const comment = $el.find('span.content').text().trim(); + const author = $el.find('span.username').text(); + return { + comment, + author, + }; + }); + if (comments && comments.length > 0) { + for (const item of comments) { + content += '
' + item.author + ': ' + item.comment; + } + } + + item.link = item.link.split('#')[0]; + item.description = content; + return item; + }) + )) { + out.push(result); + } + + return { + title: '过早客', + link: url, + item: out, + }; +} diff --git a/lib/routes/guozaoke/namespace.ts b/lib/routes/guozaoke/namespace.ts new file mode 100644 index 0000000000000..386ab893f8812 --- /dev/null +++ b/lib/routes/guozaoke/namespace.ts @@ -0,0 +1,6 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: 'guozaoke', + url: 'guozaoke.com', +};