UNPKG

rsshub

Version:
102 lines (96 loc) 3.64 kB
import { Route } from '@/types'; import { load } from 'cheerio'; import got from '@/utils/got'; import { parseDate } from '@/utils/parse-date'; import timezone from '@/utils/timezone'; import { art } from '@/utils/render'; import path from 'node:path'; /** * 获取最新的帖子回复(倒序查看) * * @param {*} id 帖子ID * @param {number} [lz=0] 是否只看楼主(0: 查看全部, 1: 只看楼主) * @param {number} [pn=7e6] 帖子最大页码(默认假设为 7e6,如果超出假设则根据返回的最大页码再请求一次,否则可以节省一次请求) * 这个默认值我测试下来 7e6 是比较接近最大值了,因为当我输入 8e6 就会返回第一页的数据而不是最后一页了 * @returns */ async function getPost(id, lz = 0, pn = 7e6) { const { data } = await got(`https://tieba.baidu.com/p/${id}?see_lz=${lz}&pn=${pn}&ajax=1`, { headers: { Referer: 'https://tieba.baidu.com/', }, }); const $ = load(data); const max = Number.parseInt($('[max-page]').attr('max-page')); if (max > pn) { return getPost(id, max); } return data; } export const route: Route = { path: ['/tieba/post/:id', '/tieba/post/lz/:id'], categories: ['bbs'], example: '/baidu/tieba/post/686961453', parameters: { id: '帖子 ID' }, features: { requireConfig: false, requirePuppeteer: false, antiCrawler: false, supportBT: false, supportPodcast: false, supportScihub: false, }, radar: [ { source: ['tieba.baidu.com/p/:id'], }, ], name: '帖子动态', maintainers: ['u3u'], handler, }; async function handler(ctx) { const id = ctx.req.param('id'); const lz = ctx.req.path.includes('lz') ? 1 : 0; const html = await getPost(id, lz); const $ = load(html); const title = $('.core_title_txt').attr('title'); // .substr(3); const list = $('.p_postlist > [data-field]:not(:has(.ad_bottom_view))'); return { title: lz ? `【只看楼主】${title}` : title, link: `https://tieba.baidu.com/p/${id}?see_lz=${lz}`, description: `${title}的最新回复`, item: list.toArray().map((element) => { const item = $(element); const { author, content } = item.data('field'); const tempList = item .find('.post-tail-wrap > .tail-info') .toArray() .map((element) => $(element).text()); let [pubContent, from, num, time] = ['', '', '', '']; if (0 === tempList.length && 'date' in content) { num = `${content.post_no}楼`; time = content.date; pubContent = item.find('.j_d_post_content').html(); } else if (2 === tempList.length) { [num, time] = tempList; pubContent = content.content; } else if (3 === tempList.length) { [from, num, time] = tempList; pubContent = content.content; } return { title: `${author.user_name}回复了帖子《${title}》`, description: art(path.join(__dirname, '../templates/post.art'), { pubContent, author: author.user_name, num, from, }), pubDate: timezone(parseDate(time, 'YYYY-MM-DD hh:mm'), +8), link: `https://tieba.baidu.com/p/${id}?pid=${content.post_id}#${content.post_id}`, }; }), }; }