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: `${desc}
`, - pubDate: new Date(item.createTime).toUTCString(), + pubDate: parseDate(item.createTime), link: `https://www.nowcoder.com/school/schedule/${item.id}`, }; }),