diff --git a/docs/university.md b/docs/university.md
index 521336f34b..4128ee8301 100644
--- a/docs/university.md
+++ b/docs/university.md
@@ -2193,6 +2193,16 @@ type 列表:
+### 中国科学技术大学就业信息网
+
+
+
+| 专场招聘会 | 校园双选会 | 空中宣讲 | 招聘公告 |
+| ----------- | ------------ | --------- | -------- |
+| RecruitList | Doublechoice | Broadcast | joblist2 |
+
+
+
## 中国科学院
### 成果转化
diff --git a/lib/router.js b/lib/router.js
index 4fbf65b22d..8e85538b56 100644
--- a/lib/router.js
+++ b/lib/router.js
@@ -722,6 +722,7 @@ router.get('/cuc/yz', require('./routes/universities/cuc/yz'));
// 中国科学技术大学
router.get('/ustc/news/:type?', require('./routes/universities/ustc/index'));
router.get('/ustc/jwc/:type?', require('./routes/universities/ustc/jwc/index'));
+router.get('/ustc/job/:category?', require('./routes/universities/ustc/job'));
// UTdallas ISSO
router.get('/utdallas/isso', require('./routes/universities/utdallas/isso'));
diff --git a/lib/routes/universities/ustc/job.js b/lib/routes/universities/ustc/job.js
new file mode 100644
index 0000000000..e7cf558b70
--- /dev/null
+++ b/lib/routes/universities/ustc/job.js
@@ -0,0 +1,193 @@
+const got = require('@/utils/got');
+
+const titles = {
+ RecruitList: '专场招聘会',
+ Doublechoice: '校园双选会',
+ Broadcast: '空中宣讲',
+ joblist2: '招聘公告',
+};
+
+module.exports = async (ctx) => {
+ const category = ctx.params.category || 'joblist2';
+
+ const rand = 0.01234567890123456;
+ const apiRootUrl = 'http://ustc.ahbys.com';
+ const rootUrl = 'http://www.job.ustc.edu.cn';
+
+ const currentUrl = `${rootUrl}/${category}.html`;
+
+ const response = await got({
+ method: (() => {
+ switch (category) {
+ case 'RecruitList':
+ case 'Broadcast':
+ case 'joblist2':
+ return 'get';
+ case 'Doublechoice':
+ return 'post';
+ }
+ })(),
+
+ url: (() => {
+ switch (category) {
+ case 'RecruitList':
+ return `${apiRootUrl}/API/Web/index10358.ashx?rd=${rand}&pagesize=20&pageindex=1&action=bookinglist&kind=13`;
+ case 'Doublechoice':
+ return `${apiRootUrl}/API/Web/index10358.ashx?rd=${rand}`;
+ case 'Broadcast':
+ return `${apiRootUrl}/API/Web/index10358.ashx?rd=${rand}&pagesize=20&pageindex=1&action=bookinglist2&kind=2`;
+ case 'joblist2':
+ return `${apiRootUrl}/API/Web/index10358.ashx?action=joblist2&pagesize=50&pageindex=1&rand=${rand}`;
+ }
+ })(),
+
+ form: (() => {
+ switch (category) {
+ case 'RecruitList':
+ case 'Broadcast':
+ case 'joblist2':
+ return {};
+ case 'Doublechoice':
+ return {
+ pagesize: 15,
+ pageindex: 1,
+ action: 'recruitlist',
+ rand: rand,
+ };
+ }
+ })(),
+
+ allowGetBody: true,
+ });
+
+ const list = response.data.data.slice(0, 10).map((item) => {
+ switch (category) {
+ case 'RecruitList':
+ return {
+ title: item.ID,
+ pubDate: new Date(item.HoldDate),
+ link: `${rootUrl}/Recruit.html?id=${item.ID}`,
+ };
+ case 'Doublechoice':
+ return {
+ ID: item.ID,
+ title: item.Theme,
+ pubDate: new Date(item.HoldDate),
+ link: `${rootUrl}/R2.html?id=${item.ID}`,
+ };
+ case 'Broadcast':
+ return {
+ title: item.ID,
+ pubDate: new Date(item.HoldDate),
+ link: `${rootUrl}/R2.html?id=${item.ID}`,
+ };
+ case 'joblist2':
+ return {
+ title: item.JID,
+ pubDate: new Date(item.UpdateDate),
+ link: `${rootUrl}/Job2.html?jid=${item.JID}&cid=${item.CompanyID}`,
+ };
+ default:
+ return {};
+ }
+ });
+
+ const items = await Promise.all(
+ list.map(
+ async (item) =>
+ await ctx.cache.tryGet(item.link, async () => {
+ const detailResponse = await got({
+ method: (() => {
+ switch (category) {
+ case 'RecruitList':
+ case 'Broadcast':
+ case 'joblist2':
+ return 'get';
+ case 'Doublechoice':
+ return 'post';
+ }
+ })(),
+
+ url: (() => {
+ switch (category) {
+ case 'RecruitList':
+ return `${apiRootUrl}/API/Web/index10358.ashx?rd=${rand}&action=bookinginfo&rid=${item.title}&rand=${rand}`;
+ case 'Doublechoice':
+ return `${apiRootUrl}/API/Web/index10358.ashx`;
+ case 'Broadcast':
+ return `${apiRootUrl}/API/Web/index10358.ashx?rd=${rand}&action=binfo&rid=${item.title}&rand=${rand}`;
+ case 'joblist2':
+ return `${apiRootUrl}/API/Web/index10358.ashx?rd=${rand}&action=jobinfo2&jid=${item.title}&rand=${rand}`;
+ }
+ })(),
+
+ form: (() => {
+ switch (category) {
+ case 'RecruitList':
+ case 'Broadcast':
+ case 'joblist2':
+ return {};
+ case 'Doublechoice':
+ return {
+ pagesize: 100,
+ pageindex: 1,
+ action: 'recruitcompany',
+ rid: item.ID,
+ rand: rand,
+ };
+ }
+ })(),
+
+ allowGetBody: true,
+ });
+
+ item.title = (() => {
+ switch (category) {
+ case 'RecruitList':
+ case 'Broadcast':
+ return detailResponse.data.Theme;
+ case 'Doublechoice':
+ return item.title;
+ case 'joblist2':
+ return detailResponse.data.JobName;
+ }
+ })();
+
+ item.description = (() => {
+ switch (category) {
+ case 'RecruitList':
+ case 'Broadcast':
+ return detailResponse.data.Description;
+
+ case 'Doublechoice': {
+ let tbody =
+ '
' +
+ '| 单位名称 | ' +
+ '展位号 | ' +
+ '职位信息 |
';
+
+ for (const company of detailResponse.data.CompanyList) {
+ tbody += `| ${company.CompanyName} | '+
+ '${item.nPos} | ${item.JobList} |
`;
+ }
+
+ return `${tbody}
`;
+ }
+
+ case 'joblist2':
+ return detailResponse.data.PostionDesc;
+ }
+ })();
+
+ return item;
+ })
+ )
+ );
+
+ ctx.state.data = {
+ title: `${titles[category]} - 中国科学技术大学就业信息网`,
+ link: currentUrl,
+ item: items,
+ };
+};