/** * BOSS直聘 exchange — request phone/wechat exchange with a candidate. */ import { cli, Strategy } from '@jackwener/opencli/registry'; import { requirePage, navigateToChat, bossFetch, findFriendByUid, verbose } from './utils.js'; cli({ site: 'boss', name: 'exchange', access: 'write', description: 'BOSS直聘交换联系方式(请求手机/微信)', domain: 'www.zhipin.com', strategy: Strategy.COOKIE, navigateBefore: false, browser: true, args: [ { name: 'uid', required: true, positional: true, help: 'Encrypted UID of the candidate' }, { name: 'type', default: 'phone', choices: ['phone', 'wechat'], help: 'Exchange type: phone or wechat' }, ], columns: ['status', 'detail'], func: async (page, kwargs) => { requirePage(page); const exchangeType = kwargs.type || 'phone'; verbose(`Requesting ${exchangeType} exchange for ${kwargs.uid}...`); await navigateToChat(page); const friend = await findFriendByUid(page, kwargs.uid, { checkGreetList: true }); if (!friend) throw new Error('未找到该候选人'); const friendName = friend.name || '候选人'; const typeId = exchangeType === 'wechat' ? 2 : 1; const params = new URLSearchParams({ type: String(typeId), securityId: friend.securityId || '', uniqueId: String(friend.uid), name: friendName, }); await bossFetch(page, 'https://www.zhipin.com/wapi/zpchat/exchange/request', { method: 'POST', body: params.toString(), }); const typeLabel = exchangeType === 'wechat' ? '微信' : '手机号'; return [{ status: '✅ 交换请求已发送', detail: `已向 ${friendName} 发送${typeLabel}交换请求`, }]; }, });