feat(route): add some nowcoder route (#20712)
* feat(route): add nowcoder hots content route * refactor(nowcoder): use query param for hots size * feat(route): add nowcoder interview experience * fix(nowcoder/interview): align interview route with RSSHub conventions * fix(nowcoder/hots): align hots router with RSShub conventions * fix(nowcoder): polish hots route
This commit is contained in:
parent
83eb87e64b
commit
bef22f9500
|
|
@ -0,0 +1,73 @@
|
|||
import type { Route } from '@/types';
|
||||
import got from '@/utils/got';
|
||||
|
||||
export const route: Route = {
|
||||
path: '/hots/:type?',
|
||||
categories: ['bbs'],
|
||||
example: '/nowcoder/hots/1?limit=20',
|
||||
parameters: {
|
||||
type: '热榜类型,`1` 指热议话题,`2` 指全站热贴,默认为 `1`',
|
||||
},
|
||||
features: {
|
||||
requireConfig: false,
|
||||
requirePuppeteer: false,
|
||||
antiCrawler: false,
|
||||
supportBT: false,
|
||||
supportPodcast: false,
|
||||
supportScihub: false,
|
||||
},
|
||||
radar: [
|
||||
{
|
||||
source: ['mnowpick.nowcoder.com/m/discuss/hot'],
|
||||
},
|
||||
],
|
||||
name: '牛客热榜',
|
||||
description: '牛客热榜,包括热议话题和全站热贴',
|
||||
maintainers: ['xia0ne'],
|
||||
handler,
|
||||
url: 'nowcoder.com/',
|
||||
};
|
||||
|
||||
async function handler(ctx) {
|
||||
const type = ctx.req.param('type') ?? '1';
|
||||
const limit = Number.parseInt(ctx.req.query('limit') ?? '20', 10);
|
||||
const size = Number.isFinite(limit) && limit > 0 ? limit : 20;
|
||||
|
||||
let link = '';
|
||||
if (type === '1') {
|
||||
link = `https://gw-c.nowcoder.com/api/sparta/subject/hot-subject?limit=${size}&_=${Date.now()}&t=`;
|
||||
const responseBody = (await got.get(link)).data;
|
||||
if (responseBody.code !== 0) {
|
||||
throw new Error(`接口错误,错误代码:${responseBody.code},错误原因:${responseBody.msg}`);
|
||||
}
|
||||
const data = responseBody.data.result;
|
||||
return {
|
||||
title: '牛客网-热议话题',
|
||||
link: 'https://mnowpick.nowcoder.com/m/discuss/hot',
|
||||
description: '牛客网-热议话题',
|
||||
item: data.map((item) => ({
|
||||
title: item.content,
|
||||
description: `<img src="${item.numberIcon}" alt="rank">`,
|
||||
link: `https://www.nowcoder.com/creation/subject/${item.uuid}`,
|
||||
})),
|
||||
};
|
||||
} else if (type === '2') {
|
||||
link = `https://gw-c.nowcoder.com/api/sparta/hot-search/top-hot-pc?size=${size}&_=${Date.now()}&t=`;
|
||||
const responseBody = (await got.get(link)).data;
|
||||
if (responseBody.code !== 0) {
|
||||
throw new Error(`接口错误,错误代码: ${responseBody.code},错误原因: ${responseBody.msg}`);
|
||||
}
|
||||
const data = responseBody.data.result;
|
||||
return {
|
||||
title: '牛客网-全站热贴',
|
||||
link: 'https://mnowpick.nowcoder.com/m/discuss/hot',
|
||||
description: '牛客网-全站热贴',
|
||||
item: data.map((item) => ({
|
||||
title: item.title,
|
||||
link: `https://www.nowcoder.com/feed/main/detail/${item.uuid}`,
|
||||
})),
|
||||
};
|
||||
} else {
|
||||
throw new Error('Invalid type parameter');
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
import type { Route } from '@/types';
|
||||
import got from '@/utils/got';
|
||||
import { parseDate } from '@/utils/parse-date';
|
||||
|
||||
export const route: Route = {
|
||||
path: '/interview/:jobId',
|
||||
categories: ['bbs'],
|
||||
example: '/nowcoder/interview/11200',
|
||||
parameters: {
|
||||
jobId: '岗位 ID,如 11200(全部)、11002(Java)',
|
||||
},
|
||||
features: {
|
||||
requireConfig: false,
|
||||
requirePuppeteer: false,
|
||||
antiCrawler: false,
|
||||
supportBT: false,
|
||||
supportPodcast: false,
|
||||
supportScihub: false,
|
||||
},
|
||||
radar: [
|
||||
{
|
||||
source: ['www.nowcoder.com/interview/'],
|
||||
},
|
||||
],
|
||||
name: '牛客面试经验',
|
||||
description: `牛客面试经验`,
|
||||
maintainers: ['xia0ne'],
|
||||
handler,
|
||||
url: 'nowcoder.com/',
|
||||
};
|
||||
async function handler(ctx) {
|
||||
const jobId = ctx.req.param('jobId');
|
||||
|
||||
const link = `https://gw-c.nowcoder.com/api/sparta/job-experience/experience/job/list?_=${Date.now()}`;
|
||||
const payload = {
|
||||
jobId,
|
||||
level: 3,
|
||||
order: 3,
|
||||
page: 1,
|
||||
};
|
||||
|
||||
const responseBody = (await got.post(link, { json: payload })).data;
|
||||
if (responseBody.code !== 0) {
|
||||
throw new Error(`接口错误,错误代码:${responseBody.code},错误原因:${responseBody.msg}`);
|
||||
}
|
||||
|
||||
const items = (responseBody.data.records ?? [])
|
||||
.map((r) => r?.momentData)
|
||||
.filter((m) => m?.uuid)
|
||||
.map((m) => ({
|
||||
title: m.title || m.content || '面经',
|
||||
description: m.content ?? '',
|
||||
link: `https://www.nowcoder.com/feed/main/detail/${m.uuid}`,
|
||||
pubDate: parseDate(m.createdAt),
|
||||
}));
|
||||
|
||||
return {
|
||||
title: '牛客网-面试经验',
|
||||
link: 'https://www.nowcoder.com/interview/',
|
||||
description: '牛客网面试经验',
|
||||
item: items,
|
||||
};
|
||||
}
|
||||
Loading…
Reference in New Issue