koronkowy/Threaty
GitHub: koronkowy/Threaty
Threaty 是一个专注于网络威胁情报、检测工程、事件响应和安全自动化的开源极简职位公告板,通过 GitHub Actions 和 AI 自动抓取并维护职位有效性。
Stars: 2 | Forks: 1
# 🛡️ Threaty: 高信号威胁情报工作公告板
**Threaty** 是一个精心策划的极简主义工作公告板,旨在过滤掉通用的工程噪音。它专门筛选出**网络威胁情报 (CTI)、检测工程、事件响应 (IR) 和安全自动化**领域的职位。
通过直接在仪表板上展示地区限制、工作模式和动态时效性指标,Threaty 帮助您快速找到符合特定地理位置和授权要求的职位。
**由 [Lacey Kasten](https://laceykasten.com/) 创建。**
**技术支持:** GitHub Actions、Gemini AI (Data Clerk) 和原生 JavaScript。
*Threaty 是一个开源项目。关注该项目或在 [GitHub](https://github.com/koronkowy/Threaty) 上贡献。*
---
## 📥 如何提交职位
要为公告板添加新职位,请遵循以下三个简单步骤:
1. **创建 Issue:** 进入 [GitHub Issues](https://github.com/koronkowy/Threaty/issues) 标签页,点击 "New issue"。*注意:Issue 标题可以任意填写,不影响提交。*
2. **粘贴并添加标签:** 将职位发布的直接 URL 粘贴到 Issue 正文中。**关键:** 在创建 Issue 时添加 `job-submission` 标签,以便自动化流程检测到它。
3. **审核与合并:** 我们的后台 "Data Clerk" 会自动抓取职位信息并创建一个 Pull Request。团队会收到通知来审核生成的 JSON。一旦我们批准更改,该职位将被合并并实时显示在公告板上。
---
Threaty 现在支持**批量导入**。您可以一次提交多个职位发布,以避免合并冲突并加快工作流程。
1. **创建 Issue:** 进入 [GitHub Issues](https://github.com/koronkowy/Threaty/issues) 标签页。
2. **粘贴 URL:** 将职位发布的直接 URL 粘贴到 Issue 正文中,每行一个。
3. **添加标签:** 在提交 Issue 之前应用 `job-submission` 标签。
4. **自动处理:** 我们的 "Data Clerk" 会处理这批数据,将其添加到 `jobs.json` 中,并打开一个单独的 Pull Request供您审核。失败的链接将直接报告回该 Issue。
---
## 🛠️ 系统架构与工作流程
Threaty 利用 GitHub 原生基础设施构建零成本、高性能的管道。
### 导入流程
1. **触发:** 一个带有标签的 GitHub Issue 启动一个 **GitHub Action** 运行器。
2. **提取:** 基于 Python 的 "Data Clerk" (`parser.py`) 抓取 URL,并使用 **Gemini AI** 提取结构化元数据。
3. **去重:** 脚本验证 URL 是否存在于 `jobs.json` 中。重复的 URL 会被拒绝;新职位会被分配一个顺序 ID。
4. **人工把关:** 生成一个 **Pull Request**。这使得可以在合并到 `main` 分支之前,对范围(CTI 相关性)、数据准确性和最终批准进行手动验证。
---
## 🤖 自动化:日常健康检查

为了确保公告板保持相关性,我构建了一个自动化的**健康检查**管道,每天运行以识别过期或失效的职位发布。
### 工作原理
`health_check.py` 脚本对数据库中的每个职位执行以下逻辑:
1. **维护感知:** 它会抓取页面内容中的关键词(例如 "maintenance"、"scheduled-downtime")。如果找到,则跳过该职位,防止在临时宕机期间误报 "expired" 状态。
2. **截止日期验证:** 任何已过 `deadline` 日期的职位都会被自动标记为 `expired`。
3. **链接完整性:** 脚本验证职位 URL 是否仍为有效、唯一的发布。它会检测:
* **HTTP 404/410 错误:** 确认的失效链接。
* **通用重定向:** 如果链接重定向到职业门户首页(而不是特定的职位 ID),则将该职位标记为 `expired`。
4. **自我修复:** 一旦职位被标记为 `expired`,脚本会更新 `jobs.json` 中的状态,这会自动触发前端将列表变暗,并将截止日期显示更新为 "Expired"。
### 自动化管道
此过程完全无需人工干预:
* **GitHub Actions:** 一个定时工作流每天午夜(UTC)运行该脚本。
* **自动提交:** 如果有任何职位被标记为过期,工作流会自动将更改提交到 `main` 分支,从而保持实时公告板更新,无需手动操作。
---
## 🛡️ 安全与完整性
### 密钥管理
您的 **Gemini API 密钥** 永远不会硬编码。它存储在 **GitHub 仓库机密**中,并在运行时注入到工作流中,确保完全安全。
---
## 🗺️ 地理与区域逻辑
| **区域** | **映射逻辑** | **示例/中心** |
| -------------- | -------------------------------------- | ------------------------------------------------------------------------------- |
| **US-All** | 全国范围的远程职位 | 美国境内的全远程岗位;包含所有区域中心 |
| **US-East** | 覆盖东海岸及 DC 都会区 (DMV) | 弗吉尼亚州、华盛顿特区、马里兰州、纽约市、波士顿;包含 DMV、三州地区、中大西洋、NOVA |
| **US-West** | 覆盖西海岸及太平洋西北地区 (PNW) | 西雅图、波特兰、旧金山、洛杉矶;包含 PNW、山区、西南地区、湾区、南加州 |
| **US-Central** | 覆盖中西部、中南地区及 TOLA | 奥斯汀、芝加哥、达拉斯、休斯顿;包含 TOLA、中西部 |
| **EMEA** | 覆盖欧洲、英国、DACH 及中东 | 伦敦、柏林、特拉维夫、布拉格;包含 DACH、比荷卢、海湾地区、以色列 |
| **APAC** | 覆盖亚洲/太平洋地区 | 班加罗尔、印度、东京、新加坡、悉尼;包含东盟、澳新 |
| **LATAM** | 覆盖拉丁美洲 | 圣保罗、墨西哥城、波哥大、布宜诺斯艾利斯 |
### 区域逻辑总结
* **智能扩展:** 当您搜索特定中心(例如 "Seattle"时,引擎会自动将查询扩展至包含父区域(`US-West`)和全国远程职位(`US-All`)。
* **卫星城市标准化:** 搜索字典会自动将通勤卫星城市(例如 Seattle 的 Redmond/Bellevue;DMV 的 Reston/McLean)映射到其父区域,确保不会因本地化命名而错过相关职位。
* **区域别名支持:** 引擎原生解析行业缩写。**在搜索栏中输入区域代码如 ** **TOLA**、**DMV**、**DACH**、**ANZ** 或 **PNW**,即可立即扩展查询,包含所有关联的城市、州和区域授权限制。**
---
*为社区而建。高信号,低噪音。*标签:CMS安全, DNS解析, Gemini AI, GitHub Actions, IR, JavaScript, 后端开发, 威胁情报, 威胁情报招聘, 安全岗位, 开发者工具, 开源项目, 批量提交, 数据可视化, 极简设计, 求职板, 网络安全, 职位聚合, 自动化抓取, 自动笔记, 逆向工具, 隐私保护