← 返回
未分类 Key

约面招聘协调虾

面试邀约自动化协调。核心职责:自动联系候选人并协调面试官时间。业务价值:日程同步——自动查询全员日历空档,实现精准邀约。激活场景:用户提供面试安排表格(Excel/CSV),包含候选人邮箱、面试官信息,要求安排面试、约面试、发面试邀请、协调面试时间、查面试官空闲等。也适用于自然语言如帮我安排这几场面试、把这批候选...
面试邀约自动化协调:自动联系候选人并协调面试官时间。业务价值:日程同步——自动查询全员日历空档,实现精准邀约。激活场景:用户提供包含候选人邮箱、面试官信息的面试安排表(Excel/CSV),要求安排、约请、发送面试邀请、协调时间、查询空闲等;亦支持自然语言,如“帮我安排这几场面试”。
tujinsama
未分类 clawhub v1.0.0 1 版本 100000 Key: 需要
★ 0
Stars
📥 341
下载
💾 0
安装
1
版本
#latest

概述

约面招聘协调虾 — 面试邀约自动化

执行策略(按优先级)

🥇 优先级 1:飞书插件工具(openclaw-lark)

检查环境是否安装了 openclaw-lark 插件。涉及飞书日历和通讯录的操作优先使用插件原生工具:

工具名用途
--------------
feishu_search_user按姓名搜索员工 open_id
feishu_calendar_event创建/查询/修改/删除面试日程
feishu_calendar_freebusy批量查询面试官空闲忙状态(1-10 人)
feishu_calendar_event_attendee添加面试官为参会人
feishu_calendar_calendar获取/管理日历

判断条件:当前环境中可用 feishu_calendar_event 工具时,直接使用插件工具完成所有飞书操作,跳过优先级 2。

> ⚠️ 插件工具使用用户身份(user_access_token),需用户完成 OAuth 授权。如授权未完成,工具会自动引导用户授权。

插件工具要点

  • 时间格式:ISO 8601(带时区),如 2026-03-28T10:00:00+08:00
  • user_open_id 必填:值取 SenderId(ou_xxx
  • 参会人 ID 统一用 open_id
  • 创建日程时可直接传 attendees + vchat(视频会议),无需分步
  • list 自动展开重复日程,时间区间不超过 40 天

🥈 优先级 2:API 脚本方式

当飞书插件未安装或不可用时,退化为使用 API 脚本。

前置要求

> ⚠️ 脚本方式使用 tenant_access_token(应用身份),只能操作应用日历,无法查询用户 freebusy。查空闲功能将不可用。

📧 邮件发送(独立于飞书)

  • 有 SMTP 配置SMTP_HOST/SMTP_PORT/SMTP_USER/SMTP_PASS → Python smtplib 直接发送
  • 无 SMTP 配置:生成邮件草稿文本,用户手动发送

表格格式约定

输入表格(Excel/CSV)应包含以下字段:

必填:

字段说明
------------
候选人姓名候选人全名
候选人邮箱用于发送面试邀请
面试官面试官姓名(多人用中文逗号或顿号分隔)

可选:

字段说明默认值
-------------------
应聘岗位岗位名称"技术面试"
面试时长分钟数60
期望日期范围如"下周"、"3/28-3/30"最近 5 个工作日
备注补充信息

表头名称可灵活变体(如"邮箱"≈"电子邮件"≈"Email"),智能识别。


工作流

步骤 1:解析表格

读取 Excel/CSV(openpyxlpandas),逐行提取候选人信息。校验必填字段,缺失则标记并通知用户补充,不中断其他记录。

步骤 2:查询面试官 open_id

将面试官姓名转为飞书 open_id

找不到时向用户确认正确姓名或要求提供 open_id。缓存已查到的映射,同批次不重复查询。

步骤 3:查询空闲时间

对该候选人的所有面试官批量查询空闲时段:

  • 插件方式:调用 feishu_calendar_freebusy,传 user_ids(数组)+ time_min + time_max
  • 脚本方式:告知用户 freebusy 需要用户身份,引导安装飞书插件

查询范围按"期望日期范围"确定:

  • "下周" → 下周一至周五
  • "3/28-3/30" → 指定日期范围
  • 未指定 → 最近 5 个工作日(跳过周末)

步骤 4:计算并推荐时段

  1. 提取每位面试官的 busy 时段,合并取并集
  2. 在查询范围内找出 busy 之间的空闲间隔
  3. 按面试时长过滤(默认 60 分钟),保留足够长的空闲段
  4. 排序:工作日 > 周末,上午(9:00-12:00) > 下午(14:00-18:00)

向用户展示 2-3 个推荐时段,等待确认后再创建日程。不自动创建。

输出示例:

🎯 张三(前端工程师)面试官空闲时段推荐:

1. 3/28 周五 10:00-11:00  ✅ 首选
2. 3/31 周一 14:00-15:00
3. 4/1 周二 09:00-10:00

请确认时段(回复序号或指定时间)。

步骤 5:创建飞书会议日程

用户确认时段后创建带视频会议的面试日程:

插件方式:

{
  "action": "create",
  "summary": "面试 — 前端工程师 — 张三",
  "start_time": "2026-03-28T10:00:00+08:00",
  "end_time": "2026-03-28T11:00:00+08:00",
  "description": "岗位:前端工程师\n候选人:张三\n面试官:李四、王五",
  "user_open_id": "ou_xxx",
  "attendees": [
    {"type": "user", "id": "ou_aaa"},
    {"type": "user", "id": "ou_bbb"}
  ],
  "vchat": {"vc_type": "vc"}
}

脚本方式:

# 获取主日历
cal_id=$(./scripts/feishu-calendar.sh primary-calendar)

# 创建日程(--meeting 自动生成飞书视频会议链接)
resp=$(./scripts/feishu-calendar.sh create-event \
  "$cal_id" \
  "面试 — 前端工程师 — 张三" \
  "1711497600" "1711501200" \
  "岗位:前端工程师\n候选人:张三\n面试官:李四、王五" \
  --meeting)

event_id=$(echo "$resp" | jq -r '.data.event.event_id')

# 添加面试官为参会者(脚本方式必须分两步)
./scripts/feishu-calendar.sh add-attendees "$cal_id" "$event_id" /tmp/attendees.json

> ⚠️ 脚本方式关键注意:

> - timestamp 必须是秒级字符串(如 "1711497600"

> - 创建 event 不接受 attendees,必须先创建再单独添加

> - 插件方式无此限制

步骤 6:发送面试邀请邮件

邮件模板见 references/email-templates.md

根据候选人姓名自动选择尊称("先生"/"女士"),模板占位符全部替换为实际值。

  • 有 SMTP 配置smtplib 直接发送
  • 无 SMTP 配置:生成完整邮件文本,附在汇总中提示用户手动发送

步骤 7:输出汇总

每处理完一个候选人后输出结构化汇总:

✅ 面试安排完成

📋 已安排:
1. 张三(前端工程师)— 3/28 周五 10:00-11:00
   面试官:李四 · 邮件已发送 ✓ · 飞书会议已创建 ✓
   🔗 会议链接:https://vc.feishu.cn/j/xxx

⚠️ 待处理:
2. 王五(后端工程师)— 未找到面试官"赵六"的 ID,请确认姓名

📝 待发送邮件(未配置 SMTP):
收件人:wangwu@email.com
Subject: 【面试邀请】XX公司 — 后端工程师 — 王五
Body: (邮件正文)

批量处理时逐个展示,全部完成后给出总数统计。


关键规则

  • 插件优先:有飞书插件时必须优先使用,退化为脚本时明确告知用户限制
  • 先查空闲再创建:创建面试日程前必须确认面试官空闲
  • 逐条确认:推荐时段后等待用户确认,不自动创建日程
  • 去重保护:同一候选人 24 小时内不重复发送邀请
  • 错误隔离:单个候选人失败不影响其他候选人处理
  • 时区统一:所有时间处理用 Asia/Shanghai (UTC+8),展示用北京时间
  • 对外操作先确认:创建日程、发送邮件等操作需先与用户确认细节

插件工具速查

用户意图工具action必填参数
--------------------------------
搜索员工feishu_search_user-query
查空闲feishu_calendar_freebusylisttime_min, time_max, user_ids[]
创建面试日程feishu_calendar_eventcreatesummary, start_time, end_time, user_open_id
查日程feishu_calendar_eventliststart_time, end_time
邀请参会人feishu_calendar_event_attendeecreatecalendar_id, event_id, attendees[]

脚本命令速查(备选方案)

操作脚本命令
---------------
获取 tokenfeishu-calendar.sh token
获取主日历feishu-calendar.sh primary-calendar
创建日程(含会议)feishu-calendar.sh create-event <start> <end> [desc] --meeting</code></td></tr><tr><td>添加参会者</td><td><code>feishu-calendar.sh add-attendees <cal> <evt> <json></code></td></tr></tbody></table><p>> ⚠️ 脚本方式<strong>不支持</strong> <code>freebusy-batch</code>(查询空闲),需引导安装飞书插件。</p><p>> 详细 API 参考见 <a href="references/feishu-calendar-api.md" target="_blank" rel="noopener">references/feishu-calendar-api.md</a></p></div> </div> </div> <div id="tab-versions" class="detail-content"> <div class="detail-section"> <h2>版本历史</h2> <p style="margin-bottom:12px;font-size:14px;color:#94a3b8;">共 1 个版本</p> <ul class="version-list"> <li> <div> <span class="version-tag">v1.0.0</span> <span style="font-size:11px;color:#5b6abf;margin-left:8px;background:#eef0ff;padding:1px 8px;border-radius:10px;">当前</span> </div> <div style="font-size:12px;color:#94a3b8;"> 2026-05-07 13:07 </div> </li> </ul> </div> </div> <div id="tab-security" class="detail-content"> <div class="detail-section"> <h2>安全检测</h2> <div class="sec-grid"> <div class="sec-card"> <h4>腾讯云安全 (Keen)</h4> <div class="sec-status sec-queued"> 队列中 </div> </div> <div class="sec-card"> <h4>腾讯云安全 (Sanbu)</h4> <div class="sec-status sec-queued"> 队列中 </div> </div> </div> </div> </div> <!-- Recommended Skills --> <div style="margin-top:24px;"> <h2 style="font-size:18px;font-weight:600;margin-bottom:16px;">🔗 相关推荐</h2> <div class="rec-grid"> <div class="rec-card"> <span class="badge-cat" style="margin-bottom:8px;display:inline-block;">business-ops</span> <h3><a href="/s/discord">Discord</a></h3> <div class="rec-owner">steipete</div> <div class="rec-desc">当需要通过discord工具控制Discord时使用:发送消息、添加反应、发布或上传表情包、上传表情、创建投票、管理帖子/置顶/搜索、获取权限或成员/角色/频道信息,或在Discord私信或频道中处理管理操作。</div> <div class="rec-stats"> <span style="color:#f39c12;">★ 80</span> <span style="color:#5b6abf;">📥 38,102</span> </div> </div> <div class="rec-card"> <span class="badge-cat" style="margin-bottom:8px;display:inline-block;">business-ops</span> <h3><a href="/s/trello">Trello</a></h3> <div class="rec-owner">steipete</div> <div class="rec-desc">使用 Trello REST API 管理看板、列表和卡片</div> <div class="rec-stats"> <span style="color:#f39c12;">★ 162</span> <span style="color:#5b6abf;">📥 41,337</span> </div> </div> <div class="rec-card"> <span class="badge-cat" style="margin-bottom:8px;display:inline-block;">data-analysis</span> <h3><a href="/s/auto-data-analysis-claw">Auto Data Analysis Claw</a></h3> <div class="rec-owner">tujinsama</div> <div class="rec-desc">自动化财务与业务数据分析,深度挖掘数据价值,生成专业报表。激活场景:用户提供财务报表(利润表、资产负债表、现金流量表)、业务数据(销售数据、运营数据、客户数据、成本数据),或要求进行数据分析、数据挖掘、报表生成、KPI计算、趋势分析、差异分</div> <div class="rec-stats"> <span style="color:#f39c12;">★ 2</span> <span style="color:#5b6abf;">📥 2,042</span> </div> </div> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded',function(){ document.querySelectorAll('.detail-tab').forEach(function(btn){ btn.addEventListener('click',function(e){ var tab = this.getAttribute('data-tab'); document.querySelectorAll('.detail-tab').forEach(function(b){b.classList.remove('active')}); document.querySelectorAll('.detail-content').forEach(function(c){c.classList.remove('active')}); this.classList.add('active'); var el = document.getElementById('tab-'+tab); if(el) el.classList.add('active'); }); }); }); </script> <div class="footer"> <p>Skill工具集 © 2026</p> </div></body> </html>