From d668624267999060f7c2835c3285ea11e66f8840 Mon Sep 17 00:00:00 2001 From: hermes Date: Wed, 30 Sep 2026 01:13:19 +0000 Subject: [PATCH] =?UTF-8?q?v10.13=E4=BA=8C=E6=AC=A1=E4=BF=AE=E8=AE=A2:=20?= =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E9=BB=91=E5=90=8D=E5=8D=95=E5=A4=9A=E7=BB=B4?= =?UTF-8?q?=E5=BA=A6=E5=88=A4=E5=AE=9A(=E2=89=A52=E7=BB=B4=E5=91=BD?= =?UTF-8?q?=E4=B8=AD=E6=89=8D=E8=AE=A4=E5=AE=9A:=20=E5=94=AF=E4=B8=80ID/?= =?UTF-8?q?=E5=85=A8=E5=90=8D/=E5=AD=A6=E6=A0=A1/=E5=8D=95=E4=BD=8D?= =?UTF-8?q?=E7=AD=89=E4=BA=A4=E5=8F=89=E9=AA=8C=E8=AF=81),=20=E5=8D=95?= =?UTF-8?q?=E4=B8=80=E7=BB=B4=E5=BA=A6=E4=B8=8D=E8=A7=A6=E5=8F=91,=20?= =?UTF-8?q?=E9=98=B2=E8=AF=AF=E4=BC=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/zhaopin-scrape.js | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) 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; }