diff --git a/scripts/zhaopin-scrape.js b/scripts/zhaopin-scrape.js index 158c488..22b34fb 100755 --- a/scripts/zhaopin-scrape.js +++ b/scripts/zhaopin-scrape.js @@ -49,12 +49,11 @@ const ACCOUNT = process.env.ACCOUNT || 'hr1'; const TARGET_CITY = process.env.TARGET_CITY || '郑州'; const COMPANY_BLACKLIST = ['合塑', '派卡']; // 从 workDetail 提取公司名命中即跳过 -// ---------- 个人黑名单(v10.13, 2026-09-29 修订)---------- -// person_blacklist 表:用户指定的候选人。匹配必须基于弹窗真实数据,不做姓+年龄这种粗匹配(会误杀同姓同龄人) -// 匹配规则(弹窗打开后执行,匹配 raw_text): -// ① resumeNumber 精确匹配(如有) -// ② 全名精确匹配(平台显示全名时) -// ③ match_fields 关键词组(学校/工作单位等硬字段)全部命中 → 同人 +// ---------- 个人黑名单(v10.13, 2026-09-29 二次修订:多维度判定)---------- +// person_blacklist 表:用户指定的候选人。 +// 判定原则(用户定稿):必须多维度交叉命中才认定同人,单一维度不触发,防止误伤。 +// 维度:① resumeNumber(平台唯一ID,单独即可判定)② 全名 ③ 学校 ④ 工作单位 ⑤ 其他特征词 +// 规则:resumeNumber 命中 → 同人;否则 全名+任一特征词 或 学校+工作单位 等任意 ≥2 维命中 → 同人 let PERSON_BLACKLIST = []; function loadPersonBlacklist(db) { try { @@ -63,16 +62,18 @@ function loadPersonBlacklist(db) { fields: JSON.parse(p.match_fields || '[]'), })); if (PERSON_BLACKLIST.length) log(`个人黑名单已加载: ${PERSON_BLACKLIST.length} 人 [${PERSON_BLACKLIST.map(p => p.name).join('、')}]`); - } catch (e) { PERSON_BLACKLIST = []; } // 表不存在等异常不阻塞主流程 + } catch (e) { PERSON_BLACKLIST = []; } } -// 弹窗级匹配:resumeNumber / 全名 / 关键词组全命中 +// 弹窗级多维度匹配:统计命中维数,≥2 才认定 function personBlackHitModal(fullName, resumeNumber, rawText) { for (const p of PERSON_BLACKLIST) { - if (p.resume_number && resumeNumber && p.resume_number === resumeNumber) return `${p.name}(精确ID)`; - if (fullName && p.name && fullName === p.name) return p.name; - if (p.fields.length && rawText && p.fields.every(f => rawText.includes(f))) { - return `${p.name}(字段匹配:${p.fields.join('+')})`; + if (p.resume_number && resumeNumber && p.resume_number === resumeNumber) return `${p.name}(唯一ID)`; + const dims = []; + if (fullName && p.name && fullName === p.name) dims.push('全名'); + if (p.fields.length && rawText) { + for (const f of p.fields) if (rawText.includes(f)) dims.push(f.length > 8 ? f.slice(0, 8) + '…' : f); } + if (dims.length >= 2) return `${p.name}(多维命中:${dims.join('+')})`; } return null; }