rsshub
Version:
Make RSS Great Again!
100 lines (81 loc) • 3.9 kB
text/typescript
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)}` : ''}`;
},
},
],
};