UNPKG

rsshub

Version:
100 lines (81 loc) 3.9 kB
import { Route } from '@/types'; import cache from '@/utils/cache'; import got from '@/utils/got'; import iconv from 'iconv-lite'; import { load } from 'cheerio'; import { rootUrl, parseArticleList, parsePostList, parseArticle, parsePost } from './util'; export const handler = async (ctx) => { const { params } = ctx.req.param(); const limit = ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit'), 10) : 5; const decodedParams = params ? decodeURIComponent(params) .split(/&/) .filter((p) => p.split(/=/).length === 2) .join('&') : undefined; const currentUrl = new URL(`forum.php${decodedParams ? `?${decodedParams}` : ''}`, rootUrl).href; const { data: response } = await got(currentUrl, { responseType: 'buffer', }); const $ = load(iconv.decode(response, 'gbk')); const language = $('meta[http-equiv="Content-Language"]').prop('content'); let items = $('table#threadlisttableid').length === 0 ? parseArticleList($, limit) : parsePostList($, limit); items = await Promise.all( items.map((item) => cache.tryGet(item.link, async () => { const { data: detailResponse } = await got(item.link, { responseType: 'buffer', }); const $$ = load(iconv.decode(detailResponse, 'gbk').replaceAll(/<\/?ignore_js_op>/g, '')); item = $$('div.firstpost').length === 0 ? parseArticle($$, item) : parsePost($$, item); item.language = language; return item; }) ) ); const image = `https:${$('div.wp h2 a img').prop('src')}`; return { title: `飞客 - ${$('a.forum_name, li.a, li.cur, li.xw1, div.z > a.xw1') .toArray() .map((a) => $(a).text()) .join(' - ')}`, description: $('meta[name="description"]').prop('content'), link: currentUrl, item: items, allowEmpty: true, image, author: $('meta[name="application-name"]').prop('content'), }; }; export const route: Route = { path: '/forum/:params{.+}?', name: '会员说', url: 'www.flyert.com.cn', maintainers: ['nczitzk'], handler, example: '/flyert/forum', parameters: { params: '参数,默认为空,可在对应分类页 URL 中找到' }, description: `::: tip 若订阅 [酒店集团优惠](https://www.flyert.com.cn/forum.php?mod=forumdisplay&sum=all&fid=all&catid=322&filter=sortid&sortid=144&searchsort=1&youhui_type=19),网址为 \`https://www.flyert.com.cn/forum.php?mod=forumdisplay&sum=all&fid=all&catid=322&filter=sortid&sortid=144&searchsort=1&youhui_type=19\`。截取 \`https://www.flyert.com.cn/forum.php?\` 到末尾的部分 \`mod=forumdisplay&sum=all&fid=all&catid=322&filter=sortid&sortid=144&searchsort=1&youhui_type=19\` **进行 UrlEncode 编码** 后作为参数填入,此时路由为 [\`/flyert/forum/mod%3Dforumdisplay%26sum%3Dall%26fid%3Dall%26catid%3D322%26filter%3Dsortid%26sortid%3D144%26searchsort%3D1%26youhui_type%3D226\`](https://rsshub.app/flyert/forum/mod%3Dforumdisplay%26sum%3Dall%26fid%3Dall%26catid%3D322%26filter%3Dsortid%26sortid%3D144%26searchsort%3D1%26youhui_type%3D226)。 ::: `, categories: ['bbs'], features: { requireConfig: false, requirePuppeteer: false, antiCrawler: false, supportRadar: true, supportBT: false, supportPodcast: false, supportScihub: false, }, radar: [ { source: ['www.flyert.com.cn/forum.php'], target: (_, url) => { const params = [...url.searchParams.entries()].map(([key, value]) => key + '=' + value).join('&'); return `/forum${params ? `/${encodeURIComponent(params)}` : ''}`; }, }, ], };