with one click
job-listing-collector
// 招聘信息采集器。支持从 URL 抓取或解析粘贴的招聘公告文本,智能提取职位信息并同步到 Notion 数据库。当用户说"采集招聘信息"、"采集招聘信息:[URL]"或粘贴招聘公告文本时触发。支持批量 URL 输入(逗号/换行分隔)和混合模式(URL + 文本)。⚠️ 本 Skill 为全自动执行,除致命错误外不会中断询问。
// 招聘信息采集器。支持从 URL 抓取或解析粘贴的招聘公告文本,智能提取职位信息并同步到 Notion 数据库。当用户说"采集招聘信息"、"采集招聘信息:[URL]"或粘贴招聘公告文本时触发。支持批量 URL 输入(逗号/换行分隔)和混合模式(URL + 文本)。⚠️ 本 Skill 为全自动执行,除致命错误外不会中断询问。
| name | job-listing-collector |
| description | 招聘信息采集器。支持从 URL 抓取或解析粘贴的招聘公告文本,智能提取职位信息并同步到 Notion 数据库。当用户说"采集招聘信息"、"采集招聘信息:[URL]"或粘贴招聘公告文本时触发。支持批量 URL 输入(逗号/换行分隔)和混合模式(URL + 文本)。⚠️ 本 Skill 为全自动执行,除致命错误外不会中断询问。 |
版本: v1.0 | 全自动化工作流 | 零中断执行
⚠️ 核心指令 - 必须遵守 ⚠️
在执行本 Skill 时,Claude 必须:
无任何允许的中断点 - 本 Skill 从头到尾一口气执行完毕。
| 触发模式 | 示例 |
|---|---|
| 精确触发 | 采集招聘信息 'collect-gongkaoleida' |
| 带单个 URL | 采集招聘信息:https://example.gov.cn/art/2025/1/6/art_123.html |
| 带多个 URL | 采集招聘信息:https://url1.com, https://url2.com |
| 换行分隔 URL | 采集招聘信息 后跟多行 URL |
| 纯文本 | 采集招聘信息 + 粘贴的招聘公告原文 |
| 混合模式 | URL 列表 + 文本内容混合 |
| 变体触发 | 采集招聘 / 抓取招聘信息 / 收集招聘信息 |
| 情况 | 原因 |
|---|---|
帮我找招聘信息 | 这是搜索请求,非采集任务 |
招聘信息有哪些 | 过于模糊,无具体输入 |
分析这个招聘公告 | 这是分析请求,非入库采集 |
| 输入类型 | 格式 | 说明 |
|---|---|---|
| URL 列表 | 逗号、换行、空格分隔均可 | 支持任意招聘网站详情页 URL |
| 纯文本 | 招聘公告原文 | 直接粘贴的招聘信息 |
| 混合 | URL + 文本 | 两种输入同时存在 |
| 输出目标 | 格式 |
|---|---|
| Notion 数据库 | 每条招聘信息 = 一条数据库记录 |
| 执行摘要 | Markdown 格式(在对话中显示) |
数据库名称: 📋 招聘信息库
| 字段名 | 类型 | 说明 | 缺失时默认值 |
|---|---|---|---|
| 职位名称 | Title | 主标题 | "未知职位" |
| 招聘单位 | Rich Text | 公司/机构名称 | "N/A" |
| 薪资范围 | Rich Text | 保留原文格式 | "未公开" |
| 工作地点 | Rich Text | 城市/地区 | "N/A" |
| 发布日期 | Date | 招聘公告发布时间 | 采集当天日期 |
| 来源网站 | Rich Text | URL 域名或"手动输入" | "手动输入" |
| 原文链接 | URL | 招聘详情页 URL | 留空 |
| 职位描述 | Rich Text | 完整 JD 原文 | "N/A" |
| 招聘人数 | Rich Text | 人数要求 | "N/A" |
| 学历要求 | Rich Text | 学历条件 | "N/A" |
| 报名截止 | Date | 截止日期 | 留空 |
| 采集时间 | Date | 数据采集时间 | 自动填充当前时间 |
| 状态 | Select | 新增/已查看/已申请/已过期 | "新增" |
┌─────────────────────────────────────────────────────────────────┐
│ Step 1: 解析用户输入 │
│ → 使用正则提取所有 URL(http/https 开头) │
│ → 剩余文本作为纯文本输入处理 │
│ → 记录:X 个 URL + Y 段文本 │
│ → ⚠️ 禁止询问"你输入的是什么类型" │
├─────────────────────────────────────────────────────────────────┤
│ Step 2: 检查/创建 Notion 数据库 │
│ → 使用 notion-search 搜索"📋 招聘信息库" │
│ → IF 存在 → 获取 data_source_id,继续 │
│ → IF 不存在 → 使用 notion-create-database 自动创建 │
│ → ⚠️ 禁止询问"数据库不存在,要创建吗" │
├─────────────────────────────────────────────────────────────────┤
│ Step 3: 处理 URL 列表(并行概念,逐个执行) │
│ FOR EACH url IN urls: │
│ → web_fetch(url) 获取页面内容 │
│ → 智能解析招聘字段(见下方解析规则) │
│ → 成功 → 加入待写入队列 │
│ → 失败 → 记录错误原因,继续下一个 │
│ → ⚠️ 禁止询问"这个URL打不开" │
├─────────────────────────────────────────────────────────────────┤
│ Step 4: 处理纯文本输入 │
│ FOR EACH text_block IN texts: │
│ → 智能识别招聘信息边界(多条招聘可能在一段文本中) │
│ → 提取字段,缺失标记默认值 │
│ → 加入待写入队列 │
│ → ⚠️ 禁止询问"这段文字格式不标准" │
├─────────────────────────────────────────────────────────────────┤
│ Step 5: 批量写入 Notion │
│ FOR EACH job IN queue: │
│ → notion-create-pages 创建数据库记录 │
│ → 成功 → success_count++ │
│ → 失败 → 记录错误,继续下一条 │
│ → ⚠️ 禁止询问"已处理N条,继续吗" │
├─────────────────────────────────────────────────────────────────┤
│ Step 6: 输出执行摘要 │
│ → 生成 Markdown 格式摘要 │
│ → 包含:成功/失败/跳过数量 + 数据库链接 + 处理详情 │
│ → 一次性完整输出 │
└─────────────────────────────────────────────────────────────────┘
对于政府招聘网站(如 jshrss.jiangsu.gov.cn),优先查找以下模式:
| 字段 | 识别模式 |
|---|---|
| 职位名称 | <title> 标签 / <h1> 标签 / 包含"招聘"的标题 |
| 招聘单位 | "招聘单位"、"用人单位"、"主管部门"后的文本 |
| 薪资范围 | "薪资"、"待遇"、"工资"、"年薪"、"月薪"后的文本 |
| 工作地点 | "工作地点"、"工作地址"、"地点"后的文本 |
| 发布日期 | "发布时间"、"发布日期"、"日期"、页面中的日期格式 |
| 招聘人数 | "招聘人数"、"人数"、"名额"、数字+人/名 |
| 学历要求 | "学历"、"学位"后的文本(本科/硕士/博士等) |
| 报名截止 | "截止"、"报名时间"、"报名截止"后的日期 |
| 职位描述 | Strictly content only: Extract only the body text of the announcement. Exclude headers, footers, sidebars, related links, download buttons, and comments. Focus on the main article content (e.g., inside <div class="article-content">). |
对于粘贴的文本,使用关键词匹配:
职位/岗位名称: xxx → 职位名称
单位/公司/机构: xxx → 招聘单位
薪资/待遇/工资: xxx → 薪资范围
地点/地址/城市: xxx → 工作地点
人数/名额: xxx → 招聘人数
学历/学位: xxx → 学历要求
截止/报名截止: xxx → 报名截止
多条招聘识别:如果文本中出现多个"招聘"/"岗位"关键词,或明显的分隔线(---、===、序号等),则拆分为多条记录。
| 场景 | 处理方式 | ❌ 绝对禁止 |
|---|---|---|
| URL 无法访问(404/超时) | 记录"访问失败",跳过此 URL | 询问"是否跳过" |
| 页面内容无法解析 | 尽可能提取,缺失字段用默认值 | 询问"格式不对怎么办" |
| 文本格式不标准 | 智能提取能识别的字段 | 询问"这段文字看不懂" |
| 日期格式无法解析 | 使用采集当天日期 | 询问"日期格式是什么" |
| Notion 数据库不存在 | 自动创建 | 询问"要创建吗" |
| 单条写入失败 | 记录错误,继续下一条 | 中断整个流程 |
| 无任何有效输入 | 输出提示,说明需要 URL 或文本 | 反复追问 |
| 字段 | 默认值 |
|---|---|
| 职位名称 | "未知职位" |
| 招聘单位 | "N/A" |
| 薪资范围 | "未公开" |
| 工作地点 | "N/A" |
| 发布日期 | 采集当天 |
| 来源网站 | "手动输入"(文本)/ URL域名(网页) |
| 职位描述 | "N/A" |
| 招聘人数 | "N/A" |
| 学历要求 | "N/A" |
| 状态 | "新增" |
## ✅ 招聘信息采集完成
| 统计项 | 数量 |
|--------|------|
| 📥 输入来源 | {url_count} 个 URL + {text_count} 段文本 |
| ✅ 成功写入 | {success_count} 条 |
| ⚠️ 部分字段缺失 | {partial_count} 条 |
| ❌ 处理失败 | {fail_count} 条 |
📊 **数据库链接**:[📋 招聘信息库]({notion_database_url})
---
### 处理详情
{detail_list}
detail_list 格式示例:
- ✅ `https://xxx.gov.cn/art/123` → 江苏省XX厅招聘公告 (成功)
- ⚠️ `https://xxx.gov.cn/art/456` → 未知职位 (薪资、学历缺失)
- ❌ `https://xxx.gov.cn/art/789` → 访问失败 (HTTP 404)
- ✅ 手动输入 #1 → 软件工程师 (成功)
- ✅ 手动输入 #2 → 产品经理 (成功)
用户输入:
采集招聘信息:https://jshrss.jiangsu.gov.cn/art/2025/1/6/art_78506_11449788.html
Claude 执行(正确):
[内部] 解析输入:1 个 URL, 0 段文本
[内部] 检查 Notion 数据库:存在 ✓
[内部] web_fetch URL...
[内部] 解析招聘信息:江苏省XX厅公开招聘...
[内部] 写入 Notion...
[输出] 完整执行摘要(一次性输出,无中间询问)
用户输入:
采集招聘信息:
https://example1.gov.cn/job/123
https://example2.gov.cn/job/456
https://example3.gov.cn/job/789
Claude 执行(正确):
[内部] 解析输入:3 个 URL
[内部] 逐个处理,静默执行
[输出] 完整执行摘要
用户输入:
采集招聘信息
招聘岗位:软件工程师
招聘单位:XX科技有限公司
工作地点:南京
薪资待遇:15-25K
学历要求:本科及以上
招聘人数:5人
岗位职责:负责后端开发...
Claude 执行(正确):
[内部] 解析输入:0 个 URL, 1 段文本
[内部] 智能提取字段
[内部] 写入 Notion
[输出] 完整执行摘要
用户输入:
采集招聘信息:https://example.com/job/123
Claude 执行(正确 - 数据库不存在时):
[内部] 检查 Notion 数据库:不存在
[内部] 自动创建"📋 招聘信息库"...
[内部] 继续处理 URL...
[输出] 完整执行摘要(包含新创建的数据库链接)
错误示范 1:询问是否继续
❌ "我已经处理了 2 个 URL,还有 3 个待处理。是否继续?"
→ 正确做法:静默处理所有 URL,最后统一输出摘要
错误示范 2:询问数据库创建
❌ "没有找到招聘信息数据库,需要我帮你创建一个吗?"
→ 正确做法:直接创建,在摘要中说明"已自动创建数据库"
错误示范 3:询问解析失败处理
❌ "这个 URL 的页面结构我无法识别,要跳过吗?"
→ 正确做法:尽可能提取,记录"部分字段缺失",继续执行
错误示范 4:分段输出
❌ "以下是前 5 条的处理结果...需要我继续处理剩余的吗?"
→ 正确做法:一次性处理完所有输入,统一输出完整摘要
错误示范 5:询问输入类型
❌ "请问你提供的是 URL 还是文本内容?"
→ 正确做法:自动识别 URL 和文本,分别处理
当数据库不存在时,使用以下参数调用 notion-create-database:
{
"title": [{"type": "text", "text": {"content": "📋 招聘信息库"}}],
"properties": {
"职位名称": {"title": {}, "type": "title"},
"招聘单位": {"rich_text": {}, "type": "rich_text"},
"薪资范围": {"rich_text": {}, "type": "rich_text"},
"工作地点": {"rich_text": {}, "type": "rich_text"},
"发布日期": {"date": {}, "type": "date"},
"来源网站": {"rich_text": {}, "type": "rich_text"},
"原文链接": {"url": {}, "type": "url"},
"职位描述": {"rich_text": {}, "type": "rich_text"},
"招聘人数": {"rich_text": {}, "type": "rich_text"},
"学历要求": {"rich_text": {}, "type": "rich_text"},
"报名截止": {"date": {}, "type": "date"},
"采集时间": {"date": {}, "type": "date"},
"状态": {
"type": "select",
"select": {
"options": [
{"name": "新增", "color": "blue"},
{"name": "已查看", "color": "yellow"},
{"name": "已申请", "color": "green"},
{"name": "已过期", "color": "gray"}
]
}
}
}
}
使用 notion-create-pages 工具,properties 格式示例:
{
"parent": {"data_source_id": "<从数据库获取的 data_source_id>"},
"pages": [{
"properties": {
"职位名称": "软件工程师",
"招聘单位": "XX公司",
"薪资范围": "15-25K",
"工作地点": "南京",
"date:发布日期:start": "2025-01-06",
"date:发布日期:is_datetime": 0,
"来源网站": "jshrss.jiangsu.gov.cn",
"原文链接": "https://example.com/job/123",
"职位描述": "负责后端开发...",
"招聘人数": "5人",
"学历要求": "本科及以上",
"date:报名截止:start": "2025-02-01",
"date:报名截止:is_datetime": 0,
"date:采集时间:start": "2025-01-06",
"date:采集时间:is_datetime": 0,
"状态": "新增"
}
}]
}
| 指令 | 说明 |
|---|---|
采集招聘信息 | 触发 Skill,等待 URL 或文本输入 |
采集招聘信息:[URL] | 直接处理指定 URL |
采集招聘信息:[URL1], [URL2] | 批量处理多个 URL |
采集招聘信息 + 粘贴文本 | 解析粘贴的招聘公告 |
[HINT] Download the complete skill directory including SKILL.md and all related files