diff --git a/docs/bbs.md b/docs/bbs.md
index 16ed9c9867..62052464af 100644
--- a/docs/bbs.md
+++ b/docs/bbs.md
@@ -524,6 +524,18 @@ pageClass: routes
## 牛客网
+### 面经
+
+
+
+可选参数:
+
+- companyId:公司 id,[🔗查询链接](https://www.nowcoder.com/discuss/tag/exp), 复制打开
+- order:3 - 最新;1 - 最热
+- phaseId:0 - 所有;1 - 校招;2 - 实习;3 - 社招
+
+
+
### 讨论区
@@ -536,11 +548,11 @@ pageClass: routes
### 校招日程
-
+
### 求职推荐
-
+
### 实习广场 & 社招广场
diff --git a/lib/router.js b/lib/router.js
index d17817048a..23398f1eb0 100644
--- a/lib/router.js
+++ b/lib/router.js
@@ -1387,11 +1387,11 @@ router.get('/hupu/bbs/:id/:order?', lazyloadRouteHandler('./routes/hupu/bbs'));
router.get('/hupu/all/:caty', lazyloadRouteHandler('./routes/hupu/all'));
router.get('/hupu/dept/:dept', lazyloadRouteHandler('./routes/hupu/dept'));
-// 牛客网
-router.get('/nowcoder/discuss/:type/:order', lazyloadRouteHandler('./routes/nowcoder/discuss'));
-router.get('/nowcoder/schedule/:propertyId?/:typeId?', lazyloadRouteHandler('./routes/nowcoder/schedule'));
-router.get('/nowcoder/recommend', lazyloadRouteHandler('./routes/nowcoder/recommend'));
-router.get('/nowcoder/jobcenter/:recruitType?/:city?/:type?/:order?/:latest?', lazyloadRouteHandler('./routes/nowcoder/jobcenter'));
+// 牛客网 migrated to v2
+// router.get('/nowcoder/discuss/:type/:order', lazyloadRouteHandler('./routes/nowcoder/discuss'));
+// router.get('/nowcoder/schedule/:propertyId?/:typeId?', lazyloadRouteHandler('./routes/nowcoder/schedule'));
+// router.get('/nowcoder/recommend', lazyloadRouteHandler('./routes/nowcoder/recommend'));
+// router.get('/nowcoder/jobcenter/:recruitType?/:city?/:type?/:order?/:latest?', lazyloadRouteHandler('./routes/nowcoder/jobcenter'));
// Xiaomi.eu
router.get('/xiaomieu/releases', lazyloadRouteHandler('./routes/xiaomieu/releases'));
diff --git a/lib/routes/nowcoder/discuss.js b/lib/v2/nowcoder/discuss.js
similarity index 100%
rename from lib/routes/nowcoder/discuss.js
rename to lib/v2/nowcoder/discuss.js
diff --git a/lib/v2/nowcoder/experience.js b/lib/v2/nowcoder/experience.js
new file mode 100644
index 0000000000..ea814662c0
--- /dev/null
+++ b/lib/v2/nowcoder/experience.js
@@ -0,0 +1,48 @@
+const got = require('@/utils/got');
+const cheerio = require('cheerio');
+const { parseDate } = require('@/utils/parse-date');
+const timezone = require('@/utils/timezone');
+
+const host = 'https://www.nowcoder.com';
+
+module.exports = async (ctx) => {
+ const params = new URLSearchParams(ctx.query);
+ params.append('tagId', ctx.params.tagId);
+
+ const link = new URL('/discuss/experience/json', host);
+
+ // const link = `https://www.nowcoder.com/discuss/experience/json?tagId=${tagId}&order=${order}&companyId=${companyId}&phaseId=${phaseId}`;
+ link.search = params;
+ const response = await got.get(link.toString());
+ const data = response.data.data;
+
+ const list = data.discussPosts.map((x) => {
+ const info = {
+ title: x.postTitle,
+ link: new URL('discuss/' + x.postId, host).href,
+ author: x.author,
+ pubDate: timezone(parseDate(x.createTime), +8),
+ category: x.postTypeName,
+ };
+ return info;
+ });
+
+ const out = await Promise.all(
+ list.map((info) =>
+ ctx.cache.tryGet(info.link, async () => {
+ const response = await got.get(info.link);
+ const $ = cheerio.load(response.data);
+
+ info.description = $('.nc-post-content').html();
+
+ return info;
+ })
+ )
+ );
+
+ ctx.state.data = {
+ title: `牛客面经Tag${ctx.params.tagId}`,
+ link: link.href,
+ item: out,
+ };
+};
diff --git a/lib/routes/nowcoder/jobcenter.js b/lib/v2/nowcoder/jobcenter.js
similarity index 100%
rename from lib/routes/nowcoder/jobcenter.js
rename to lib/v2/nowcoder/jobcenter.js
diff --git a/lib/v2/nowcoder/maintainer.js b/lib/v2/nowcoder/maintainer.js
new file mode 100644
index 0000000000..462a59960c
--- /dev/null
+++ b/lib/v2/nowcoder/maintainer.js
@@ -0,0 +1,7 @@
+module.exports = {
+ '/discuss/:type/:order': ['LogicJake'],
+ '/experience/:tagId': ['huyyi'],
+ '/jobcenter/:recruitType?/:city?/:type?/:order?/:latest?': ['nczitzk'],
+ '/recommend': ['junfengP'],
+ '/schedule/:propertyId?/:typeId?': ['junfengP'],
+};
diff --git a/lib/v2/nowcoder/radar.js b/lib/v2/nowcoder/radar.js
new file mode 100644
index 0000000000..a67ec8ac29
--- /dev/null
+++ b/lib/v2/nowcoder/radar.js
@@ -0,0 +1,40 @@
+module.exports = {
+ 'nowcoder.com': {
+ _name: '牛客网',
+ '.': [
+ {
+ title: '面经',
+ docs: 'https://docs.rsshub.app/bbs.html#niu-ke-wang-mian-jing',
+ source: ['/'],
+ target: '/nowcoder/experience',
+ },
+ {
+ title: '讨论区',
+ docs: 'https://docs.rsshub.app/bbs.html#niu-ke-wang',
+ source: ['/discuss'],
+ target: (_params, url) => {
+ const href = new URL(url);
+ return `/nowcoder/${href.searchParams.get('type')}/${href.searchParams.get('order')}`;
+ },
+ },
+ {
+ title: '实习广场 & 社招广场',
+ docs: 'https://docs.rsshub.app/bbs.html#niu-ke-wang',
+ source: ['/'],
+ target: '/nowcoder/jobcenter',
+ },
+ {
+ title: '校招日程',
+ docs: 'https://docs.rsshub.app/bbs.html#niu-ke-wang',
+ source: ['/'],
+ target: '/nowcoder/schedule',
+ },
+ {
+ title: '求职推荐',
+ docs: 'https://docs.rsshub.app/bbs.html#niu-ke-wang',
+ source: ['/'],
+ target: '/nowcoder/recommend',
+ },
+ ],
+ },
+};
diff --git a/lib/routes/nowcoder/recommend.js b/lib/v2/nowcoder/recommend.js
similarity index 89%
rename from lib/routes/nowcoder/recommend.js
rename to lib/v2/nowcoder/recommend.js
index 49b4896332..81677a0cf2 100644
--- a/lib/routes/nowcoder/recommend.js
+++ b/lib/v2/nowcoder/recommend.js
@@ -13,7 +13,7 @@ module.exports = async (ctx) => {
description: '牛客网-推荐',
item: data.map((item) => ({
title: item.name,
- description: `
`,
+ description: `
`,
link: `https://www.nowcoder.com${item.url}`,
})),
};
diff --git a/lib/v2/nowcoder/router.js b/lib/v2/nowcoder/router.js
new file mode 100644
index 0000000000..6960e9b0e2
--- /dev/null
+++ b/lib/v2/nowcoder/router.js
@@ -0,0 +1,7 @@
+module.exports = function (router) {
+ router.get('/discuss/:type/:order', require('./discuss'));
+ router.get('/experience/:tagId', require('./experience'));
+ router.get('/jobcenter/:recruitType?/:city?/:type?/:order?/:latest?', require('./jobcenter'));
+ router.get('/recommend', require('./recommend'));
+ router.get('/schedule/:propertyId?/:typeId?', require('./schedule'));
+};
diff --git a/lib/routes/nowcoder/schedule.js b/lib/v2/nowcoder/schedule.js
similarity index 85%
rename from lib/routes/nowcoder/schedule.js
rename to lib/v2/nowcoder/schedule.js
index 2fc3d15b30..364c861bdc 100644
--- a/lib/routes/nowcoder/schedule.js
+++ b/lib/v2/nowcoder/schedule.js
@@ -1,15 +1,16 @@
const got = require('@/utils/got');
+const { parseDate } = require('@/utils/parse-date');
module.exports = async (ctx) => {
const propertyId = ctx.params.propertyId ? ctx.params.propertyId : 0;
const typeId = ctx.params.typeId ? ctx.params.typeId : 0;
const link = `https://www.nowcoder.com/school/schedule/data?token=&query=&typeId=${typeId}&propertyId=${propertyId}&onlyFollow=false&_=${new Date().getTime()}`;
- const responseBody = (await got.get(link)).data;
+ const responseBody = (await got(link)).data;
if (responseBody.code !== 0) {
throw Error(`接口错误,错误代码:${responseBody.code},错误原因:${responseBody.msg}`);
}
- const data = responseBody.data;
+ const data = responseBody.data.companyList;
ctx.state.data = {
title: '名企校招日程',
@@ -23,7 +24,7 @@ module.exports = async (ctx) => {
return {
title: item.name,
description: ``,
- pubDate: new Date(item.createTime).toUTCString(),
+ pubDate: parseDate(item.createTime),
link: `https://www.nowcoder.com/school/schedule/${item.id}`,
};
}),