recommend.js
1 /** 2 * BOSS直聘 recommend — view recommended candidates (新招呼/greet sort list). 3 */ 4 import { cli, Strategy } from '@jackwener/opencli/registry'; 5 import { requirePage, navigateToChat, bossFetch, fetchRecommendList, verbose } from './utils.js'; 6 cli({ 7 site: 'boss', 8 name: 'recommend', 9 description: 'BOSS直聘查看推荐候选人(新招呼列表)', 10 domain: 'www.zhipin.com', 11 strategy: Strategy.COOKIE, 12 navigateBefore: false, 13 browser: true, 14 args: [ 15 { name: 'limit', type: 'int', default: 20, help: 'Number of results to return' }, 16 ], 17 columns: ['name', 'job_name', 'last_time', 'labels', 'encrypt_uid', 'security_id', 'encrypt_job_id'], 18 func: async (page, kwargs) => { 19 requirePage(page); 20 verbose('Fetching recommended candidates...'); 21 await navigateToChat(page); 22 // Get label definitions for mapping 23 const labelData = await bossFetch(page, 'https://www.zhipin.com/wapi/zprelation/friend/label/get', { 24 allowNonZero: true, 25 }); 26 const labelMap = {}; 27 if (labelData.code === 0 && labelData.zpData?.labels) { 28 for (const l of labelData.zpData.labels) { 29 labelMap[l.labelId] = l.label; 30 } 31 } 32 const friends = await fetchRecommendList(page); 33 const limit = kwargs.limit || 20; 34 return friends.slice(0, limit).map((f) => ({ 35 name: f.name || '', 36 job_name: f.jobName || '', 37 last_time: f.lastTime || '', 38 labels: (f.relationLabelList || []).map((id) => labelMap[id] || String(id)).join(', '), 39 encrypt_uid: f.encryptUid || '', 40 security_id: f.securityId || '', 41 encrypt_job_id: f.encryptJobId || '', 42 })); 43 }, 44 });