Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions chrome-extension/fixture-export.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
(function (root) {
const VERSION = "structural-fixture/1";
const REDACTION_VERSION = "structural-fixture/2";
const REDACTION_VERSION = "structural-fixture/3";
const errors = Object.freeze({
UNSUPPORTED_PAGE: "当前页面不是受支持的 BOSS / 智联 HTTPS 招聘页。",
CHAT_PAGE: "聊天页面不支持导出,请切换到岗位搜索列表或详情。",
Expand Down Expand Up @@ -86,7 +86,12 @@
if (!text) return " ";
if (fixedText.has(text)) return text;
if (/^今日还可沟通\d{1,3}次$/.test(text)) return text === "今日还可沟通0次" ? text : "今日还可沟通3次";
const field = fields.find(([selector]) => parent?.closest(selector))?.[1];
// A title/layout wrapper can contain salary or company fields. The nearest
// matching element determines the replacement, not the order of distant ancestors.
let field;
for (let node = parent; node && !field; node = node.parentElement) {
field = fields.find(([selector]) => node.matches(selector))?.[1];
}
if (field === "title") return alias(titles, text, "示例产品运营");
if (field === "company") return alias(companies, text, "示例科技公司");
if (field === "salary") return platform === "boss" ? "15-25K" : "8000-12000元";
Expand Down
2 changes: 1 addition & 1 deletion chrome-extension/manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"manifest_version": 3,
"name": "投递牛马 Chrome Bridge",
"version": "1.8.13",
"version": "1.8.14",
"key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzzdIlNVOv76Y/cSWrjD5Tg2Vlsha8yWHzsn46PBsg724/2dftOUzIIr2n70VRaRgGwEd8FjO/Y768Ori443zF4pQpWvuxXxm05YO25ILQ/+aJLmUycAEdWbkdhcagr4YXnXJdYlSCGSAToSQBjk+owQOdlBLQn5wofPoshrqayoJjRQ5aAUj1SuSlnNv9iimle8GMA1IaA1l5rw6K/chfcgwMTg6HxRAIoludt5JGbIBryi2Lu1hOJRMaDnL7A57ofBnn3qx3H2HIGWGkkTW9EMkls0XMXwx8+mJVIj5HSYl0EeuCvEoTa1W3i1CbOf3kY2yCPKS3Qz3lOvJiwJ4ZQIDAQAB",
"description": "Use signed-in Chrome tabs to scan jobs, confirm deliveries, and review BOSS HR reply drafts for 投递牛马.",
"icons": {
Expand Down
2 changes: 1 addition & 1 deletion chrome-extension/tests/boss-hr-assistant.test.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ test("manifest loads the direct HR bridge and one-minute alarm capability", () =
const bossScripts = manifest.content_scripts.find((entry) => entry.matches.includes("https://www.zhipin.com/*")).js;
assert.deepEqual(bossScripts.slice(-3), ["boss-hr-support.js", "boss-hr-bridge.js", "boss-hr-assistant.js"]);
assert.ok(manifest.permissions.includes("alarms"));
assert.equal(manifest.version, "1.8.13");
assert.equal(manifest.version, "1.8.14");
});

test("assistant exposes policy-gated dedicated watch and preserves explicit manual send", () => {
Expand Down
2 changes: 2 additions & 0 deletions chrome-extension/tests/fixtures/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
`catalog.json` 是样本索引,每条包含平台、页面类型、来源、HTML 路径及期望结果。保留 23 份根据已有测试和采集器编写的 **synthetic** 样本(`capturedAt` 为 null),另有用户主动导出的 **structural-redacted** 样本;二者不能互相冒充,也不等于真实投递验收。

- `boss/detail/redacted-header-only-20260915`:用户使用 1.8.12 导出的真实结构,正文和身份已替换。只含标题区域与地址,缺 JD、公司和岗位身份,是导出不完整的故障证据。禁止用标题/地址的文本回退结果证明完整 JD 已采集。原始截图未提交。
- `boss/search/redacted-split-20260915`:1.8.13 导出 15 张卡片及 15 个链接;保留薪资被错误替换为标题别名的原始故障,缺公司结构标记。
- `boss/detail/redacted-split-partial-20260915`:同次用户提交的详情有一个链接,缺公司/JD 结构标记。跨文件别名不证明真实岗位关联;两份样本均不能作为完整采集或投递验收通过。

- BOSS 列表覆盖去重、外部链接、导航伪链接、空列表及替换后的卡片;详情覆盖岗位与公司信息。
- 智联复用现代采集器,覆盖无岗位链接的列表卡片、独立详情身份、过期详情和空列表。
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
<div style="display: block; visibility: visible; opacity: 1;">
<div style="display: block; visibility: visible; position: static; opacity: 1;">
<div class="job-detail-header" style="display: flex; visibility: visible; position: static; opacity: 1;">
<div style="display: block; visibility: visible; position: static; opacity: 1;">
<div style="display: flex; visibility: visible; position: static; opacity: 1;">
<span class="job-name" style="display: block; visibility: visible; position: static; opacity: 1;">示例产品运营001</span>
<span class="job-salary" style="display: block; visibility: visible; position: static; opacity: 1;">15-25K</span>
</div>
<ul class="tag-list" style="display: flex; visibility: visible; position: static; opacity: 1;">
<li style="display: flex; visibility: visible; position: relative; opacity: 1;">
<a style="display: block; visibility: visible; position: static; opacity: 1;">3-5年 本科</a>
</li>
<li style="display: flex; visibility: visible; position: relative; opacity: 1;">
<span style="display: block; visibility: visible; position: static; opacity: 1;">3-5年 本科</span>
</li>
<li style="display: flex; visibility: visible; position: relative; opacity: 1;">
<span style="display: block; visibility: visible; position: static; opacity: 1;">3-5年 本科</span>
</li>
</ul>
</div>
<div style="display: block; visibility: visible; position: static; opacity: 1;">
<a style="display: flex; visibility: visible; position: static; opacity: 1;">脱敏文本</a>
<a style="display: block; visibility: visible; position: static; opacity: 1;">立即沟通</a>
</div>
</div>
<div style="display: block; visibility: visible; position: static; opacity: 1;">
<div style="display: block; visibility: visible; position: static; opacity: 1;">
<a style="display: flex; visibility: visible; position: relative; opacity: 1;">脱敏文本</a>
<div style="display: block; visibility: visible; position: relative; opacity: 1;">
<a style="visibility: visible; position: relative; opacity: 1;">脱敏文本</a>
</div>
</div>
<h3 style="display: block; visibility: visible; position: static; opacity: 1;">脱敏文本</h3>
<ul style="display: block; visibility: visible; position: static; opacity: 1;">
<li style="visibility: visible; position: static; opacity: 1;">脱敏文本</li>
<li style="visibility: visible; position: static; opacity: 1;">脱敏文本</li>
<li style="visibility: visible; position: static; opacity: 1;">脱敏文本</li>
<li style="visibility: visible; position: static; opacity: 1;">脱敏文本</li>
<li style="visibility: visible; position: static; opacity: 1;">脱敏文本</li>
<li style="visibility: visible; position: static; opacity: 1;">脱敏文本</li>
</ul>
<p style="display: block; visibility: visible; position: static; opacity: 1;">脱敏文本<span style="display: inline-block; visibility: hidden; position: static; opacity: 1;">脱敏文本</span>脱敏文本<span style="display: inline-block; visibility: hidden; position: static; opacity: 1;">脱敏文本</span>脱敏文本<span style="display: inline-block; visibility: hidden; position: static; opacity: 1;">脱敏文本</span>脱敏文本<span style="display: inline-block; visibility: hidden; position: static; opacity: 1;">脱敏文本</span>脱敏文本<span style="display: inline-block; visibility: hidden; position: static; opacity: 1;">脱敏文本</span>脱敏文本</p>
<div style="display: flex; visibility: visible; position: static; opacity: 1;">
<div style="display: flex; visibility: visible; position: relative; opacity: 1;">
</div>
<div style="display: block; visibility: visible; position: static; opacity: 1;">
<h2 style="display: flex; visibility: visible; position: static; opacity: 1;">脱敏文本<span class="boss-active-time" style="display: block; visibility: visible; position: static; opacity: 1;"> </span>
</h2>
<div style="display: flex; visibility: visible; position: static; opacity: 1;">脱敏文本</div>
</div>
<div style="display: block; visibility: visible; position: relative; opacity: 1;">脱敏文本<br style="display: inline; visibility: visible; position: static; opacity: 1;">脱敏文本<div style="display: block; visibility: visible; position: absolute; opacity: 0;">
<div style="display: block; visibility: visible; position: absolute; opacity: 1;">
</div>
<span style="display: block; visibility: visible; position: static; opacity: 1;">脱敏文本<br style="display: inline; visibility: visible; position: static; opacity: 1;">脱敏文本</span>
</div>
</div>
</div>
<a href="https://www.zhipin.com/job_detail/fixture001.html" style="display: block; visibility: visible; position: static; opacity: 1;">查看更多信息</a>
</div>
</div>
<div style="display: block; visibility: visible; position: static; opacity: 1;">
<div style="display: block; visibility: visible; position: static; opacity: 1;">脱敏文本</div>
<div style="display: flex; visibility: visible; position: static; opacity: 1;">
<div style="display: block; visibility: visible; position: relative; opacity: 1;">
<a style="display: inline; visibility: visible; position: relative; opacity: 1;">
</a>
</div>
<div style="display: block; visibility: visible; position: relative; opacity: 1;">
<div style="display: block; visibility: visible; position: static; opacity: 1;">脱敏文本</div>
<div style="display: block; visibility: visible; position: static;">脱敏文本<br style="display: inline; visibility: visible; position: static; opacity: 1;">脱敏文本</div>
<div style="display: inline-block; visibility: visible; position: static; opacity: 1;">
<span style="display: inline; visibility: visible; position: static; opacity: 1;">脱敏文本</span>
</div>
</div>
</div>
</div>
<div style="display: block; visibility: visible; position: static; opacity: 1;">
<ul style="display: block; visibility: visible; position: static; opacity: 1;">
<li style="visibility: visible; position: relative; opacity: 1;">脱敏文本</li>
<li style="visibility: visible; position: relative; opacity: 1;">脱敏文本</li>
<li style="visibility: visible; position: relative; opacity: 1;">脱敏文本</li>
<li style="visibility: visible; position: relative; opacity: 1;">脱敏文本</li>
</ul>
<div style="display: block; visibility: visible; position: static; opacity: 1;">
<a style="display: inline-block; visibility: visible; position: static; opacity: 1;">脱敏文本</a>
<a style="display: inline-block; visibility: visible; position: static; opacity: 1;">脱敏文本</a>
<a style="display: inline-block; visibility: visible; position: static; opacity: 1;">脱敏文本</a>
<a style="display: inline-block; visibility: visible; position: static; opacity: 1;">脱敏文本</a>
<a style="display: inline-block; visibility: visible; position: static; opacity: 1;">脱敏文本</a>
<a style="display: inline-block; visibility: visible; position: static; opacity: 1;">脱敏文本</a>
<a style="display: inline-block; visibility: visible; position: static; opacity: 1;">脱敏文本</a>
<a style="display: inline-block; visibility: visible; position: static; opacity: 1;">脱敏文本</a>
<a style="display: inline-block; visibility: visible; position: static; opacity: 1;">脱敏文本</a>
<a style="display: inline-block; visibility: visible; position: static; opacity: 1;">脱敏文本</a>
<a style="display: inline-block; visibility: visible; position: static; opacity: 1;">脱敏文本</a>
<a style="display: inline-block; visibility: visible; position: static; opacity: 1;">脱敏文本</a>
<a style="display: inline-block; visibility: visible; position: static; opacity: 1;">脱敏文本</a>
<a style="display: inline-block; visibility: visible; position: static; opacity: 1;">脱敏文本</a>
<a style="display: inline-block; visibility: visible; position: static; opacity: 1;">脱敏文本</a>
<a style="display: inline-block; visibility: visible; position: static; opacity: 1;">脱敏文本</a>
<a style="display: inline-block; visibility: visible; position: static; opacity: 1;">脱敏文本</a>
<a style="display: inline-block; visibility: visible; position: static; opacity: 1;">脱敏文本</a>
<a style="display: inline-block; visibility: visible; position: static; opacity: 1;">脱敏文本</a>
<a style="display: inline-block; visibility: visible; position: static; opacity: 1;">脱敏文本</a>
</div>
</div>
<div style="display: block; visibility: visible; position: static; opacity: 1;">
<ul style="display: block; visibility: visible; position: static; opacity: 1;">
<li style="visibility: visible; position: relative; opacity: 1;">
<a style="display: block; visibility: visible; position: static; opacity: 1;">脱敏文本</a>
</li>
<li style="visibility: visible; position: relative; opacity: 1;">
<a style="display: block; visibility: visible; position: static; opacity: 1;">脱敏文本</a>
</li>
</ul>
</div>
</div>
<div style="display: none; visibility: visible; position: static; opacity: 1;">
<div style="display: block; visibility: visible; position: static; opacity: 1;">
</div>
<div style="display: block; visibility: visible; position: static; opacity: 1;">
</div>
</div>
Loading
Loading