Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(route): add 集思录广场 #17972

Merged
merged 2 commits into from
Dec 25, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
119 changes: 119 additions & 0 deletions lib/routes/jisilu/category.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
import { type CheerioAPI, load } from 'cheerio';
import { type Context } from 'hono';

import { type DataItem, type Route, type Data, ViewType } from '@/types';

import ofetch from '@/utils/ofetch';

import { rootUrl, processItems } from './util';
import InvalidParameterError from '@/errors/types/invalid-parameter';

export const handler = async (ctx: Context): Promise<Data> => {
const { id } = ctx.req.param();

if (!id) {
throw new InvalidParameterError('请填入合法的分类 id,参见广场 https://www.jisilu.cn/explore/');
}
Comment on lines +14 to +16
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unreachable condition.

path: '/category/:id',
defines id as compulsory parameter. User who visiting the route without providing id will see a NotFoundError instead

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the reviews. 😊


const limit: number = Number.parseInt(ctx.req.query('limit') ?? '30', 10);

const targetUrl: string = new URL(`/category/${id}`, rootUrl).href;

const response = await ofetch(targetUrl);
const $: CheerioAPI = load(response);
const language: string = $('html').prop('lang') ?? 'zh';

const items: DataItem[] = await processItems($, $('div.aw-question-list'), limit);

$('div.pagination').remove();

const author = $('meta[name="keywords"]').prop('content').split(/,/)[0];
const feedImage = $('div.aw-logo img').prop('src');

return {
title: `${$('title').text()} - ${$('li.active')
.slice(1)
.toArray()
.map((l) => $(l).text())
.join('|')}`,
description: $('meta[name="description"]').prop('content'),
link: targetUrl,
item: items,
allowEmpty: true,
image: feedImage,
author,
language,
id: targetUrl,
};
};

export const route: Route = {
path: '/category/:id',
name: '分类',
url: 'www.jisilu.cn',
maintainers: ['nczitzk'],
handler,
example: '/jisilu/category/4',
parameters: {
id: '分类 id,可在对应分类页 URL 中找到',
},
description: `:::tip
若订阅 [债券/可转债](https://www.jisilu.cn/category/4),网址为 \`https://www.jisilu.cn/category/4\`,请截取 \`https://www.jisilu.cn/category/\` 到末尾的部分 \`4\` 作为 \`id\` 参数填入,此时目标路由为 [\`/jisilu/category/4\`](https://rsshub.app/jisilu/category/4)。
:::

| 新股 | 债券/可转债 | 套利 | 其他 | 基金 | 股票 |
| ---- | ----------- | ---- | ---- | ---- | ---- |
| 3 | 4 | 5 | 6 | 7 | 8 |
`,
categories: ['finance'],
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportRadar: true,
supportBT: false,
supportPodcast: false,
supportScihub: false,
},
radar: [
{
source: ['www.jisilu.cn/category/:id'],
target: (params) => {
const id = params.id;

return `/jisilu/category/${id}`;
},
},
{
title: '新股',
source: ['www.jisilu.cn/category/3'],
target: '/jisilu/category/3',
},
{
title: '债券/可转债',
source: ['www.jisilu.cn/category/4'],
target: '/jisilu/category/4',
},
{
title: '套利',
source: ['www.jisilu.cn/category/5'],
target: '/jisilu/category/5',
},
{
title: '其他',
source: ['www.jisilu.cn/category/6'],
target: '/jisilu/category/6',
},
{
title: '基金',
source: ['www.jisilu.cn/category/7'],
target: '/jisilu/category/7',
},
{
title: '股票',
source: ['www.jisilu.cn/category/8'],
target: '/jisilu/category/8',
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
target: '/jisilu/category/3',
},
{
title: '债券/可转债',
source: ['www.jisilu.cn/category/4'],
target: '/jisilu/category/4',
},
{
title: '套利',
source: ['www.jisilu.cn/category/5'],
target: '/jisilu/category/5',
},
{
title: '其他',
source: ['www.jisilu.cn/category/6'],
target: '/jisilu/category/6',
},
{
title: '基金',
source: ['www.jisilu.cn/category/7'],
target: '/jisilu/category/7',
},
{
title: '股票',
source: ['www.jisilu.cn/category/8'],
target: '/jisilu/category/8',
target: '/category/3',
},
{
title: '债券/可转债',
source: ['www.jisilu.cn/category/4'],
target: '/category/4',
},
{
title: '套利',
source: ['www.jisilu.cn/category/5'],
target: '/category/5',
},
{
title: '其他',
source: ['www.jisilu.cn/category/6'],
target: '/category/6',
},
{
title: '基金',
source: ['www.jisilu.cn/category/7'],
target: '/category/7',
},
{
title: '股票',
source: ['www.jisilu.cn/category/8'],
target: '/category/8',

},
],
view: ViewType.Articles,
};
79 changes: 79 additions & 0 deletions lib/routes/jisilu/explore.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import { type CheerioAPI, load } from 'cheerio';
import { type Context } from 'hono';

import { type DataItem, type Route, type Data, ViewType } from '@/types';

import ofetch from '@/utils/ofetch';

import { rootUrl, processItems } from './util';

export const handler = async (ctx: Context): Promise<Data> => {
const { filter } = ctx.req.param();
const limit: number = Number.parseInt(ctx.req.query('limit') ?? '30', 10);

const targetUrl: string = new URL(`/${filter ? 'home/' : ''}explore/${filter ?? ''}`, rootUrl).href;

const response = await ofetch(targetUrl);
const $: CheerioAPI = load(response);
const language: string = $('html').prop('lang') ?? 'zh';

const items: DataItem[] = await processItems($, $('div.aw-question-list'), limit);

$('div.pagination').remove();

const author = $('meta[name="keywords"]').prop('content').split(/,/)[0];
const feedImage = $('div.aw-logo img').prop('src');

return {
title: `${$('title').text()} - ${$('li.active')
.slice(1)
.toArray()
.map((l) => $(l).text())
.join('|')}`,
description: $('meta[name="description"]').prop('content'),
link: targetUrl,
item: items,
allowEmpty: true,
image: feedImage,
author,
language,
id: targetUrl,
};
};

export const route: Route = {
path: '/explore/:filter?',
name: '广场',
url: 'www.jisilu.cn',
maintainers: ['nczitzk'],
handler,
example: '/jisilu/explore',
parameters: {
category: '过滤器,默认为空,可在对应页 URL 中找到',
},
description: `:::tip
若订阅 [债券/可转债 - 热门 - 30天](https://www.jisilu.cn/home/explore/category-4__sort_type-hot__day-30),网址为 \`https://www.jisilu.cn/home/explore/category-4__sort_type-hot__day-30\`,请截取 \`https://www.jisilu.cn/home/explore/\` 到末尾的部分 \`category-4__sort_type-hot__day-30\` 作为 \`filter\` 参数填入,此时目标路由为 [\`/jisilu/explore/category-4__sort_type-hot__day-30\`](https://rsshub.app/jisilu/explore/category-4__sort_type-hot__day-30)。
:::
`,
categories: ['finance'],
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportRadar: true,
supportBT: false,
supportPodcast: false,
supportScihub: false,
},
radar: [
{
source: ['www.jisilu.cn/home/explore/:filter', 'www.jisilu.cn/home/explore', 'www.jisilu.cn/explore'],
target: (params) => {
const filter = params.filter;

return `/jisilu/explore${filter ? `/${filter}` : ''}`;
},
},
],
view: ViewType.Articles,
};
133 changes: 0 additions & 133 deletions lib/routes/jisilu/index.ts

This file was deleted.

1 change: 1 addition & 0 deletions lib/routes/jisilu/namespace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@ import type { Namespace } from '@/types';
export const namespace: Namespace = {
name: '集思录',
url: 'jisilu.cn',
description: '一个以数据为本的投资社区',
lang: 'zh-CN',
};
Loading
Loading