Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
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
77 changes: 77 additions & 0 deletions lib/routes/nowcoder/hots.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import type { Route } from '@/types';
import got from '@/utils/got';

export const route: Route = {
path: '/hots/:type?',
categories: ['bbs'],
example: '/nowcoder/hots/1?size=20',
parameters: {
type: '热榜类型, `1` 指热议话题, `2`全站热贴, 默认为热议话题',
},
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false,
},
radar: [
{
source: ['mnowpick.nowcoder.com/m/discuss/hot'],
},
],
name: '牛客热榜',
description: `牛客热榜,包括热议话题和全站热贴
可选参数:
- size: 返回列表大小(query 参数,默认 20)
`,
maintainers: ['xia0ne'],
handler,
url: 'nowcoder.com/',
};

async function handler(ctx) {
const type = ctx.req.param('type') ?? '1';
const rawSize = ctx.req.query('size');
const sizeNum = Number.parseInt(rawSize ?? '20', 10);
const size = Number.isFinite(sizeNum) && sizeNum > 0 ? sizeNum : 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}>`,
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');
}
}
81 changes: 81 additions & 0 deletions lib/routes/nowcoder/interview.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import type { Route } from '@/types';
import got from '@/utils/got';

export const route: Route = {
path: '/interview/:jobId',
categories: ['bbs'],
example: '/nowcoder/interview/11200?page=1',
parameters: {
jobId: `
(必须)岗位ID, example:
11200: 全部
11002: Java
`,
},
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false,
},
radar: [
{
source: ['https://www.nowcoder.com/interview/'],
},
],
name: '牛客面试经验',
description: `牛客面试经验
可选参数:
- page (query 表示是第几页)
- companyList(query 公司列表,逗号分隔 example: 134,138
`,
maintainers: ['xia0ne'],
handler,
url: 'nowcoder.com/',
};
async function handler(ctx) {
const jobId = ctx.req.param('jobId');
const page = ctx.req.query('page') ?? '1';
const companyParam = ctx.req.query('companyList'); // string | undefined

const companyList = companyParam
? companyParam
.split(',')
.map((c) => Number(c.trim()))
.filter((n) => !Number.isNaN(n))
: [];
const link = `https://gw-c.nowcoder.com/api/sparta/job-experience/experience/job/list?_=${Date.now()}`;
const payload = {
companyList,
jobId,
level: 3,
order: 3,
page,
};
const responseBody = (
await got.post(link, {
json: payload,
})
).data;
if (responseBody.code !== 0) {
throw new Error(`接口错误,错误代码:${responseBody.code},错误原因:${responseBody.msg}`);
}
const data = responseBody.data.records;
const items = (data ?? [])
.map((r) => r?.momentData)
.filter(Boolean)
.map((m) => ({
title: m.title ?? m.content?.slice(0, 60) ?? '面经',
description: m.content ?? '',
link: m.uuid ? `https://www.nowcoder.com/feed/main/detail/${m.uuid}` : 'https://www.nowcoder.com/interview/',
}));

return {
title: '牛客网-面试经验',
link: 'https://www.nowcoder.com/interview/',
description: '面试经验',
item: items,
};
}
Loading