feat(route): add 豆瓣招聘 and refactor to V2 standard (#8937)

* Add(route): add 豆瓣招聘 and change to V2

* Fix(route): fix typo of filename

* Fix(route): sort routes

* Fix(route): Update lib/v2/douban/router.js

Co-authored-by: Tony <TonyRL@users.noreply.github.com>

Co-authored-by: Tony <TonyRL@users.noreply.github.com>
This commit is contained in:
Fatpandac 2022-02-02 22:56:13 +08:00 committed by GitHub
parent 96270cd1cc
commit 8891ad1020
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
30 changed files with 152 additions and 60 deletions

View File

@ -944,6 +944,16 @@ YouTube 官方亦有提供频道 RSS形如 <https://www.youtube.com/feeds/vid
</Route>
### 豆瓣招聘
<Route author="Fatpandac" example="/douban/jobs/campus" path="/douban/jobs/:type" :paramsDesc="['招聘类型,见下表']">
| 社会招聘 | 校园招聘 | 实习生招聘 |
| :------: | :------: | :--------: |
| social | campus | intern |
</Route>
## 饭否
::: warning 注意

View File

@ -2416,38 +2416,6 @@ module.exports = {
},
],
},
'douban.com': {
_name: '豆瓣',
www: [
{
title: '用户的广播',
docs: 'https://docs.rsshub.app/social-media.html#dou-ban',
source: '/people/:user/',
target: (params, url, document) => {
const uid = document && document.querySelector('html').innerHTML.match(/"id":"([0-9]+)"/)[1];
return uid ? `/douban/people/${uid}/status` : '';
},
},
{
title: '小组-最新',
docs: 'https://docs.rsshub.app/social-media.html#dou-ban',
source: '/group/:groupid',
target: '/douban/group/:groupid',
},
{
title: '小组-最热',
docs: 'https://docs.rsshub.app/social-media.html#dou-ban',
source: '/group/:groupid',
target: '/douban/group/:groupid/essence',
},
{
title: '小组-精华',
docs: 'https://docs.rsshub.app/social-media.html#dou-ban',
source: '/group/:groupid',
target: '/douban/group/:groupid/elite',
},
],
},
'okjike.com': {
_name: '即刻',
m: [

View File

@ -163,33 +163,6 @@ router.get('/pixiv/search/:keyword/:order?/:mode?', lazyloadRouteHandler('./rout
// pixiv-fanbox
router.get('/fanbox/:user?', lazyloadRouteHandler('./routes/fanbox/main'));
// 豆瓣
router.get('/douban/movie/playing', lazyloadRouteHandler('./routes/douban/playing'));
router.get('/douban/movie/playing/:score', lazyloadRouteHandler('./routes/douban/playing'));
router.get('/douban/movie/playing/:score/:city', lazyloadRouteHandler('./routes/douban/playing'));
router.get('/douban/movie/later', lazyloadRouteHandler('./routes/douban/later'));
router.get('/douban/movie/ustop', lazyloadRouteHandler('./routes/douban/ustop'));
router.get('/douban/movie/weekly/:type?', lazyloadRouteHandler('./routes/douban/weekly_best'));
router.get('/douban/movie/classification/:sort?/:score?/:tags?', lazyloadRouteHandler('./routes/douban/classification.js'));
router.get('/douban/group/:groupid/:type?', lazyloadRouteHandler('./routes/douban/group'));
router.get('/douban/explore', lazyloadRouteHandler('./routes/douban/explore'));
router.get('/douban/music/latest/:area?', lazyloadRouteHandler('./routes/douban/latest_music'));
router.get('/douban/book/latest', lazyloadRouteHandler('./routes/douban/latest_book'));
router.get('/douban/event/hot/:locationId', lazyloadRouteHandler('./routes/douban/event/hot'));
router.get('/douban/commercialpress/latest', lazyloadRouteHandler('./routes/douban/commercialpress/latest'));
router.get('/douban/bookstore', lazyloadRouteHandler('./routes/douban/bookstore'));
router.get('/douban/book/rank/:type?', lazyloadRouteHandler('./routes/douban/book/rank'));
router.get('/douban/doulist/:id', lazyloadRouteHandler('./routes/douban/doulist'));
router.get('/douban/explore/column/:id', lazyloadRouteHandler('./routes/douban/explore_column'));
router.get('/douban/people/:userid/status/:routeParams?', lazyloadRouteHandler('./routes/douban/people/status.js'));
router.get('/douban/people/:userid/wish/:routeParams?', lazyloadRouteHandler('./routes/douban/people/wish.js'));
router.get('/douban/replies/:uid', lazyloadRouteHandler('./routes/douban/replies'));
router.get('/douban/replied/:uid', lazyloadRouteHandler('./routes/douban/replied'));
router.get('/douban/topic/:id/:sort?', lazyloadRouteHandler('./routes/douban/topic.js'));
router.get('/douban/channel/:id/:nav?', lazyloadRouteHandler('./routes/douban/channel/topic.js'));
router.get('/douban/channel/:id/subject/:nav', lazyloadRouteHandler('./routes/douban/channel/subject.js'));
router.get('/douban/celebrity/:id/:sort?', lazyloadRouteHandler('./routes/douban/celebrity.js'));
// 法律白話文運動
router.get('/plainlaw/archives', lazyloadRouteHandler('./routes/plainlaw/archives.js'));

View File

@ -0,0 +1,27 @@
module.exports = {
'/book/latest': ['fengkx'],
'/book/rank/:type?': ['xyqfer', 'queensferryme'],
'/bookstore': ['xyqfer'],
'/celebrity/:id/:sort?': ['minimalistrojan'],
'/channel/:id/:nav?': ['umm233'],
'/channel/:id/subject/:nav': ['umm233'],
'/commercialpress/latest': ['xyqfer'],
'/doulist/:id': ['LogicJake'],
'/event/hot/:locationId': ['xyqfer'],
'/explore': ['clarkzsd'],
'/explore_column/:id': ['LogicJake'],
'/group/:groupid/:type?': ['DIYgod'],
'/jobs/:type': ['Fatpandac'],
'/movie/classification/:sort?/:score?/:tags?': ['zzwab'],
'/movie/later': ['DIYgod'],
'/movie/playing': ['DIYgod'],
'/movie/playing/:score': ['DIYgod'],
'/movie/ustop': ['DIYgod'],
'/movie/weekly/:type?': ['numm233', 'nczitzk'],
'/music/latest/:area?': ['fengkx', 'xyqfer'],
'/people/:userid/status/:routeParams': ['alfredcai'],
'/people/:userid/wish/:routeParams?': ['exherb'],
'/replied/:uid': ['nczitzk'],
'/replies/:uid': ['nczitzk'],
'/topic/:id/:sort?': ['LogicJake'],
};

View File

@ -1,4 +1,4 @@
const got = require('../../utils/got');
const got = require('@/utils/got');
const cheerio = require('cheerio');
module.exports = async (ctx) => {

View File

@ -0,0 +1,33 @@
const got = require('@/utils/got');
const cheerio = require('cheerio');
const rootUrl = 'https://jobs.douban.com';
const titleMap = {
social: '社会招聘',
campus: '校园招聘',
intern: '实习生招聘',
};
module.exports = async (ctx) => {
const type = ctx.params.type;
const url = `${rootUrl}/jobs/${type}`;
const response = await got.get(url);
const $ = cheerio.load(response.data);
const list = $('div.mod.position');
const items = list
.map((_, item) => ({
title: $(item).find('h3').text(),
link: `${url}#${$(item).find('h3').attr('id')}`,
description: $(item).find('div.bd').html(),
}))
.get();
ctx.state.data = {
title: `豆瓣${titleMap[type]}`,
link: url,
item: items,
};
};

54
lib/v2/douban/radar.js Normal file
View File

@ -0,0 +1,54 @@
module.exports = {
'douban.com': {
_name: '豆瓣',
www: [
{
title: '用户的广播',
docs: 'https://docs.rsshub.app/social-media.html#dou-ban',
source: '/people/:user/',
target: (params, url, document) => {
const uid = document && document.querySelector('html').innerHTML.match(/"id":"([0-9]+)"/)[1];
return uid ? `/douban/people/${uid}/status` : '';
},
},
{
title: '小组-最新',
docs: 'https://docs.rsshub.app/social-media.html#dou-ban',
source: '/group/:groupid',
target: '/douban/group/:groupid',
},
{
title: '小组-最热',
docs: 'https://docs.rsshub.app/social-media.html#dou-ban',
source: '/group/:groupid',
target: '/douban/group/:groupid/essence',
},
{
title: '小组-精华',
docs: 'https://docs.rsshub.app/social-media.html#dou-ban',
source: '/group/:groupid',
target: '/douban/group/:groupid/elite',
},
],
jobs: [
{
title: '社会招聘',
docs: 'https://docs.rsshub.app/social-media.html#dou-ban',
source: '/jobs/social',
target: '/jobs/social',
},
{
title: '校园招聘',
docs: 'https://docs.rsshub.app/social-media.html#dou-ban',
source: '/jobs/campus',
target: '/jobs/campus',
},
{
title: '实习生招聘',
docs: 'https://docs.rsshub.app/social-media.html#dou-ban',
source: '/jobs/intern',
target: '/jobs/intern',
},
],
},
};

27
lib/v2/douban/router.js Normal file
View File

@ -0,0 +1,27 @@
module.exports = function (router) {
router.get('/book/latest', require('./other/latest_book'));
router.get('/book/rank/:type?', require('./book/rank'));
router.get('/bookstore', require('./other/bookstore'));
router.get('/celebrity/:id/:sort?', require('./other/celebrity.js'));
router.get('/channel/:id/subject/:nav', require('./channel/subject.js'));
router.get('/channel/:id/:nav?', require('./channel/topic.js'));
router.get('/commercialpress/latest', require('./commercialpress/latest'));
router.get('/doulist/:id', require('./other/doulist'));
router.get('/event/hot/:locationId', require('./event/hot'));
router.get('/explore', require('./other/explore'));
router.get('/explore/column/:id', require('./other/explore_column'));
router.get('/group/:groupid/:type?', require('./other/group'));
router.get('/jobs/:type', require('./other/jobs.js'));
router.get('/movie/classification/:sort?/:score?/:tags?', require('./other/classification.js'));
router.get('/movie/later', require('./other/later'));
router.get('/movie/playing', require('./other/playing'));
router.get('/movie/playing/:score', require('./other/playing'));
router.get('/movie/ustop', require('./other/ustop'));
router.get('/movie/weekly/:type?', require('./other/weekly_best'));
router.get('/music/latest/:area?', require('./other/latest_music'));
router.get('/people/:userid/status/:routeParams?', require('./people/status.js'));
router.get('/people/:userid/wish/:routeParams?', require('./people/wish.js'));
router.get('/replied/:uid', require('./other/replied'));
router.get('/replies/:uid', require('./other/replies'));
router.get('/topic/:id/:sort?', require('./other/topic.js'));
};