/** * BOSS直聘 invite — send interview invitation to a candidate. */ import { cli, Strategy } from '@jackwener/opencli/registry'; import { requirePage, navigateToChat, bossFetch, findFriendByUid, verbose } from './utils.js'; cli({ site: 'boss', name: 'invite', access: 'write', description: 'BOSS直聘发送面试邀请', domain: 'www.zhipin.com', strategy: Strategy.COOKIE, navigateBefore: false, browser: true, args: [ { name: 'uid', positional: true, required: true, help: 'Encrypted UID of the candidate' }, { name: 'time', required: true, help: 'Interview time (e.g. 2025-04-01 14:00)' }, { name: 'address', default: '', help: 'Interview address (uses saved address if empty)' }, { name: 'contact', default: '', help: 'Contact person name (uses saved contact if empty)' }, ], columns: ['status', 'detail'], func: async (page, kwargs) => { requirePage(page); verbose(`Sending interview invitation to ${kwargs.uid}...`); await navigateToChat(page); const friend = await findFriendByUid(page, kwargs.uid, { checkGreetList: true }); if (!friend) throw new Error('未找到该候选人'); const friendName = friend.name || '候选人'; // Get saved contact info const contactData = await bossFetch(page, 'https://www.zhipin.com/wapi/zpinterview/boss/interview/contactInit', { allowNonZero: true, timeout: 10_000 }); const contactName = kwargs.contact || contactData.zpData?.contactName || ''; const contactPhone = contactData.zpData?.contactPhone || ''; const contactId = contactData.zpData?.contactId || ''; // Get saved address const addressData = await bossFetch(page, 'https://www.zhipin.com/wapi/zpinterview/boss/interview/listAddress', { allowNonZero: true, timeout: 10_000 }); const savedAddress = addressData.zpData?.list?.[0] || {}; const addressText = kwargs.address || savedAddress.cityAddressText || savedAddress.addressText || ''; // Parse interview time const interviewTime = new Date(kwargs.time).getTime(); if (isNaN(interviewTime)) { throw new Error(`时间格式错误: ${kwargs.time},请使用格式如 2025-04-01 14:00`); } const params = new URLSearchParams({ uid: String(friend.uid), securityId: friend.securityId || '', encryptJobId: friend.encryptJobId || '', interviewTime: String(interviewTime), contactId, contactName, contactPhone, address: addressText, interviewType: '1', }); await bossFetch(page, 'https://www.zhipin.com/wapi/zpinterview/boss/interview/invite.json', { method: 'POST', body: params.toString(), }); return [{ status: '✅ 面试邀请已发送', detail: `已向 ${friendName} 发送面试邀请\n时间: ${kwargs.time}\n地点: ${addressText}\n联系人: ${contactName}`, }]; }, });