diff --git a/docs/README.md b/docs/README.md
index c86331977..42cf28421 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -1139,6 +1139,26 @@ category 列表:
+### 昆明理工大学
+
+
+
+| 教务通知 | 教务新闻 |
+| -------- | -------- |
+| notify | news |
+
+
+
+
+
+| 校内宣讲会 | 校外宣讲会 |
+| ---------- | ---------- |
+| inner | outer |
+
+
+
+
+
## 传统媒体
### 央视新闻
diff --git a/router.js b/router.js
index ad042675b..b330ae660 100644
--- a/router.js
+++ b/router.js
@@ -539,6 +539,11 @@ router.get('/sctu/jwc/:type?', require('./routes/universities/sctu/jwc'));
router.get('/uestc/jwc/:type?', require('./routes/universities/uestc/jwc'));
router.get('/uestc/news/:type?', require('./routes/universities/uestc/news'));
+// 昆明理工大学
+router.get('/kmust/jwc/:type?', require('./routes/universities/kmust/jwc'));
+router.get('/kmust/job/careers/:type?', require('./routes/universities/kmust/job/careers'));
+router.get('/kmust/job/jobfairs', require('./routes/universities/kmust/job/jobfairs'));
+
// ifanr
router.get('/ifanr/appso', require('./routes/ifanr/appso'));
diff --git a/routes/universities/kmust/job/careers.js b/routes/universities/kmust/job/careers.js
new file mode 100644
index 000000000..5a7779b34
--- /dev/null
+++ b/routes/universities/kmust/job/careers.js
@@ -0,0 +1,34 @@
+const axios = require('../../../../utils/axios');
+const url = require('url');
+
+const baseUrl = 'http://job.kmust.edu.cn';
+
+module.exports = async (ctx) => {
+ const type = ctx.params.type || 'inner';
+ const title = `${type === 'inner' ? '校内宣讲会' : '校外宣讲会'}-昆明理工大学就业网`;
+ const pageUrl = url.resolve(baseUrl, `/module/getcareers?start_page=1&keyword=&type=${type}&day=&count=20&start=1&_=${+new Date()}`);
+ const response = await axios({
+ method: 'get',
+ url: pageUrl,
+ headers: {
+ Referer: baseUrl,
+ },
+ });
+ const data = response.data || {};
+
+ ctx.state.data = {
+ title,
+ link: url.resolve(baseUrl, `/module/careers${type === 'outer' && '?type=outer'}`),
+ item:
+ data.data &&
+ data.data.map((item) => {
+ const { meet_day = '', meet_time = '', company_name = '', school_name = '', address = '', company_property = '', industry_category = '', recommend_time = '', career_talk_id = '' } = item;
+ return {
+ title: `【${meet_day} ${meet_time}】${company_name}`,
+ description: `时间:${meet_day} ${meet_time}
地点:${school_name ? `${school_name}-${address}` : address}
类别:${company_property}
行业类别:${industry_category}`,
+ pubDate: new Date(recommend_time).toUTCString(),
+ link: url.resolve(baseUrl, `/detail/career?id=${career_talk_id}`),
+ };
+ }),
+ };
+};
diff --git a/routes/universities/kmust/job/jobfairs.js b/routes/universities/kmust/job/jobfairs.js
new file mode 100644
index 000000000..5b9c66d1b
--- /dev/null
+++ b/routes/universities/kmust/job/jobfairs.js
@@ -0,0 +1,33 @@
+const axios = require('../../../../utils/axios');
+const url = require('url');
+
+const baseUrl = 'http://job.kmust.edu.cn';
+
+module.exports = async (ctx) => {
+ const title = '双选会-昆明理工大学就业网';
+ const pageUrl = url.resolve(baseUrl, `/module/getjobfairs?start_page=1&keyword=&count=20&start=1&_=${+new Date()}`);
+ const response = await axios({
+ method: 'get',
+ url: pageUrl,
+ headers: {
+ Referer: baseUrl,
+ },
+ });
+ const data = response.data || {};
+
+ ctx.state.data = {
+ title,
+ link: url.resolve(baseUrl, '/module/jobfairs'),
+ item:
+ data.data &&
+ data.data.map((item) => {
+ const { meet_day = '', meet_time = '', title = '', school_name = '', address = '', recommend_time = '', fair_id = '' } = item;
+ return {
+ title: `【${meet_day} ${meet_time}】${title}`,
+ description: `时间:${meet_day} ${meet_time}
地点:${school_name ? `${school_name}-${address}` : address}`,
+ pubDate: new Date(recommend_time).toUTCString(),
+ link: url.resolve(baseUrl, `/detail/jobfair?id=${fair_id}`),
+ };
+ }),
+ };
+};
diff --git a/routes/universities/kmust/jwc.js b/routes/universities/kmust/jwc.js
new file mode 100644
index 000000000..bc4261326
--- /dev/null
+++ b/routes/universities/kmust/jwc.js
@@ -0,0 +1,48 @@
+const axios = require('../../../utils/axios');
+const cheerio = require('cheerio');
+const url = require('url');
+
+const baseUrl = 'http://jwc.kmust.edu.cn';
+const dataRegex = /(?:20\d{2})\/(?:\d{2})\/(?:\d{2})/;
+const typeProps = {
+ notify: {
+ url: '/html/jwtz/1.html',
+ title: '教务通知',
+ },
+ news: {
+ url: '/html/jwxw/1.html',
+ title: '教务新闻',
+ },
+};
+
+module.exports = async (ctx) => {
+ const type = ctx.params.type || 'notify';
+ const pageUrl = url.resolve(baseUrl, typeProps[type].url);
+ const title = `${typeProps[type].title}-昆明理工大学`;
+ const response = await axios({
+ method: 'get',
+ url: pageUrl,
+ headers: {
+ Referer: baseUrl,
+ },
+ });
+
+ const $ = cheerio.load(response.data);
+
+ ctx.state.data = {
+ link: pageUrl,
+ title,
+ item: $('table[width="92%"] a[target="_blank"]')
+ .map((_, elem) => ({
+ link: url.resolve(baseUrl, elem.attribs.href),
+ title: elem.children[0].data,
+ pubDate: new Date(
+ elem.attribs.href
+ .match(dataRegex)[0]
+ .split('/')
+ .join('-')
+ ),
+ }))
+ .get(),
+ };
+};