Install
openclaw skills install @thcjp/calendar-reminder-paidopenclaw skills install @thcjp/calendar-reminder-paid| 能力 | 免费版 | 专业版 |
|---|---|---|
| 单日历扫描 | 支持 | 支持 |
| 时段分类提醒 | 支持 | 支持 |
| 飞书通知 | 支持 | 支持 |
| 每晚定时扫描 | 支持 | 支持 |
| 多日历聚合 | - | 支持 |
| 递进式提醒 | - | 支持 |
| 日程冲突检测 | - | 支持 |
| 跨时区支持 | - | 支持 |
| 团队日程同步 | - | 支持 |
| 多渠道通知 | - | 支持 |
| 日程分析报表 | - | 支持 |
| 工作日/自定义过滤 | - | 支持 |
| 智能调度优化 | - | 支持 |
执行单日历扫描操作,处理用户输入并返回结果。
输入: 用户提供单日历扫描所需的参数和指令。
输出: 返回单日历扫描的处理结果。
单日历扫描操作,处理输入数据并返回结果单日历扫描相关配置参数进行设置执行时段分类提醒操作,处理用户输入并返回结果。
输入: 用户提供时段分类提醒所需的参数和指令。
输出: 返回时段分类提醒的处理结果。
时段分类提醒操作,处理输入数据并返回结果时段分类提醒相关配置参数进行设置执行飞书通知操作,处理用户输入并返回结果。
输入: 用户提供飞书通知所需的参数和指令。
输出: 返回飞书通知的处理结果。
飞书通知操作,处理输入数据并返回结果飞书通知相关配置参数进行设置本skill还覆盖以下能力场景: 企业级多日历智能、提醒平台、支持多日历聚合、团队同步、递进提醒与日程分、面向团队与企业的、多日历智能提醒与、调度平台、核心能力、多日历聚合扫描、智能提醒调度、适用场景、团队日程协调、高管助理提醒、跨时区会议安排、会议室资源调度、日程效率分析、差异化、专业版在免费版基、础上新增多日历与、兼容免费版扫描脚、本与提醒格式。这些能力在上述核心功能中均有对应处理逻辑。
聚合工作日历、个人日历与团队共享日历,统一扫描并按优先级排序提醒。
# calendar_reminder_pro.py
from datetime import datetime, timedelta
import json
# 多日历配置
CALENDARS = [
{"id": "work", "source": "owa_calendar", "priority": 1, "color": "🔵"},
{"id": "personal", "source": "owa_calendar", "priority": 2, "color": "🟢"},
{"id": "team", "source": "owa_calendar", "priority": 1, "color": "🟡"},
]
# 扫描明日全部日历
tomorrow = (datetime.now() + timedelta(days=1)).strftime("%Y-%m-%d")
all_events = []
for cal in CALENDARS:
events = owa_calendar.get_events(
calendar_id=cal["id"],
start_date=tomorrow,
end_date=tomorrow,
timezone="Asia/Shanghai"
)
for evt in events:
evt["calendar"] = cal["id"]
evt["priority"] = cal["priority"]
evt["color"] = cal["color"]
all_events.append(evt)
# 按时间排序
all_events.sort(key=lambda x: x["start_time"])
# 按时段分组
morning = [e for e in all_events if e["start_hour"] < 12]
afternoon = [e for e in all_events if e["start_hour"] >= 12]
# 生成聚合汇报
report = generate_report(morning, afternoon)
send_feishu(target=ADMIN_OPEN_ID, message=report)
聚合汇报示例
📅 明日日程扫描完成(2026-07-19)
🔵 工作日历 | 🟢 个人日历 | 🟡 团队日历
上午日程(提前2小时递进提醒):
🔵 09:00 项目周会 (会议室A) [高优先级]
🟡 10:30 团队站会 (线上)
🟢 11:30 健身预约 (健身房)
下午日程(12:00统一提醒):
🔵 14:00 技术方案评审 (会议室B) [高优先级]
🔵 16:00 客户电话 (线上)
🟢 19:00 家庭聚餐
共 6 项日程(3 工作 / 2 个人 / 1 团队)
⚠️ 检测到 1 个潜在冲突
✅ 已设置递进提醒
高优先级日程采用递进式提醒,多个时间节点逐步升级提醒力度。
# 递进提醒配置
PROGRESSIVE_REMINDERS = {
"high": [
{"offset_hours": 24, "message": "📋 明日有重要会议,请提前准备材料"},
{"offset_hours": 2, "message": "⏰ 重要会议 2 小时后开始"},
{"offset_hours": 0.5, "message": "🚨 重要会议 30 分钟后开始,请立即就位"},
],
"medium": [
{"offset_hours": 2, "message": "⏰ 会议 2 小时后开始"},
],
"low": [
{"offset_hours": 0.5, "message": "📅 会议 30 分钟后开始"},
],
}
# 为每个日程生成递进提醒
for event in all_events:
priority = event.get("priority_level", "medium")
for reminder in PROGRESSIVE_REMINDERS[priority]:
reminder_time = event["start_time"] - timedelta(hours=reminder["offset_hours"])
schedule_reminder(
trigger_at=reminder_time,
target=event["owner_open_id"],
message=f'{event["color"]} {reminder["message"]}\n📅 {event["title"]}\n🕐 {event["time_range"]}'
)
自动检测时间重叠的日程,提供调整建议。
# conflict_detection.py
def detect_conflicts(events):
"""检测日程冲突"""
conflicts = []
sorted_events = sorted(events, key=lambda x: x["start_time"])
for i in range(len(sorted_events) - 1):
curr = sorted_events[i]
next_evt = sorted_events[i + 1]
# 检测时间重叠
if curr["end_time"] > next_evt["start_time"]:
overlap = (curr["end_time"] - next_evt["start_time"]).total_seconds() / 60
conflicts.append({
"event1": curr,
"event2": next_evt,
"overlap_minutes": overlap,
"suggestion": suggest_resolution(curr, next_evt, overlap)
})
return conflicts
def suggest_resolution(e1, e2, overlap):
"""生成冲突解决建议"""
suggestions = []
if e1["priority"] > e2["priority"]:
suggestions.append(f"建议将「{e2['title']}」推迟 {overlap:.0f} 分钟")
elif e2["priority"] > e1["priority"]:
suggestions.append(f"建议将「{e1['title']}」提前结束或缩短")
else:
suggestions.append(f"两场日程重叠 {overlap:.0f} 分钟,建议协商调整")
if e1.get("location") == e2.get("location"):
suggestions.append("⚠️ 同一地点背靠背日程,注意转场时间")
return ";".join(suggestions)
# 执行冲突检测
conflicts = detect_conflicts(all_events)
if conflicts:
for c in conflicts:
alert = (
f"⚠️ 日程冲突告警\n"
f"📅 冲突1: {c['event1']['title']} ({c['event1']['time_range']})\n"
f"📅 冲突2: {c['event2']['title']} ({c['event2']['time_range']})\n"
f"⏱️ 重叠: {c['overlap_minutes']:.0f} 分钟\n"
f"💡 建议: {c['suggestion']}"
)
send_feishu(target=ADMIN_OPEN_ID, message=alert)
每周生成日程效率分析报表,帮助优化时间管理。
# weekly_analysis.py
import csv
from datetime import datetime, timedelta
# 获取本周全部已完成日程
week_start = datetime.now() - timedelta(days=datetime.now().weekday())
week_events = owa_calendar.get_events(
calendar_id="work",
start_date=week_start.strftime("%Y-%m-%d"),
end_date=datetime.now().strftime("%Y-%m-%d"),
status="completed"
)
# 统计分析
analysis = {
"total_meetings": len(week_events),
"total_hours": sum(e["duration_hours"] for e in week_events),
"by_type": {},
"by_day": {},
"conflict_count": 0,
"avg_duration": 0,
}
for evt in week_events:
# 按类型统计
mtype = evt.get("category", "其他")
analysis["by_type"][mtype] = analysis["by_type"].get(mtype, 0) + 1
# 按日期统计
day = evt["start_time"].strftime("%m-%d")
analysis["by_day"][day] = analysis["by_day"].get(day, 0) + evt["duration_hours"]
analysis["avg_duration"] = analysis["total_hours"] / max(analysis["total_meetings"], 1)
# 生成报表
report = f"""📊 本周日程效率分析({week_start.strftime('%m-%d')} ~ {datetime.now().strftime('%m-%d')})
📈 总览:
- 会议总数: {analysis['total_meetings']} 场
- 总时长: {analysis['total_hours']:.1f} 小时
- 平均时长: {analysis['avg_duration']:.1f} 小时
- 冲突次数: {analysis['conflict_count']} 次
📅 按日分布:"""
for day, hours in sorted(analysis["by_day"].items()):
bar = "█" * int(hours) + "░" * (8 - int(hours))
report += f"\n {day} {bar} {hours:.1f}h"
report += f"\n\n📋 按类型分布:"
for mtype, count in sorted(analysis["by_type"].items(), key=lambda x: -x[1]):
report += f"\n {mtype}: {count} 场"
report += "\n\n💡 优化建议:"
if analysis["total_hours"] > 20:
report += "\n - 本周会议时长偏高,建议增加专注时间块"
if analysis["avg_duration"] > 1.5:
report += "\n - 平均会议时长偏长,建议控制在 1 小时以内"
if analysis["conflict_count"] > 0:
report += "\n - 存在日程冲突,建议提前协调"
send_feishu(target=ADMIN_OPEN_ID, message=report)
# 导出 CSV
with open("weekly_calendar_report.csv", "w", encoding="utf-8-sig", newline="") as f:
writer = csv.writer(f)
writer.writerow(["日期", "开始时间", "结束时间", "时长(小时)", "标题", "类型", "地点"])
for evt in week_events:
writer.writerow([
evt["start_time"].strftime("%Y-%m-%d"),
evt["start_time"].strftime("%H:%M"),
evt["end_time"].strftime("%H:%M"),
f"{evt['duration_hours']:.1f}",
evt["title"],
evt.get("category", ""),
evt.get("location", "")
])
cd skills/calendar-reminder-tool-pro
pip install -r requirements.txt
python3 setup_pro.py
skill-platform cron add \
--name "calendar-daily-scan-pro" \
--cron "0 22 * * *" \
--tz "Asia/Shanghai" \
--session main \
--system-event "CALENDAR_SCAN: 请运行 python3 calendar_reminder_pro.py" \
--description "专业版每晚22:00多日历扫描与智能提醒"
python3 calendar_reminder_pro.py
-reminder-tool-pro: 命令参数,用于指定操作选项-daily-scan-pro: 命令参数,用于指定操作选项--session: 命令参数,用于指定操作选项--tz: 命令参数,用于指定操作选项--system-event: 命令参数,用于指定操作选项结果处理: 执行完成后,查看输出结果确认操作状态。成功时输出包含处理摘要和结果数据;失败时根据错误信息排查问题,参考错误处理章节获取恢复步骤。
-sig: 命令参数,用于指定操作选项| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| content | string | 是 | 相关说明 |
| content | string | 否 | 相关说明, 默认: 默认值 |
| content | string | 否 | 相关说明, 可选值: json/text/markdown |
| style | string | 否 | 输出风格, 参考 references/style.md |
{
"success": true,
"data": {
result: "相关说明",
result: "相关说明",
result: "相关说明",
"metadata": {
"template_used": "reviewer",
"word_count": 0,
"style": "专业"
}
},
"error": null
}
输出模板参考: assets/output.json
| 错误场景 | 原因 | 处理方式 |
|---|---|---|
| 配置错误 | 参数缺失或格式错误 | 检查依赖说明中的配置要求 |
| 运行时错误 | 运行环境不满足 | 确认运行环境符合依赖说明 |
| 网络错误 | 连接超时或不可达 | 执行ping命令测试网络连通性,检查防火墙和代理设置连接后执行ping命令测试网络连通性,检查防火墙和代理设置连接后重新执行命令,参考国内替代方案 |
zoneinfo 模块)| 依赖项 | 类型 | 是否必需 | 获取方式 |
|---|---|---|---|
| Python 3.9+ | 运行时 | 必需 | python.org 官方下载 |
| owa-outlook skill | skill 依赖 | 必需 | 提供 owa_calendar.py 日历读取模块 |
| skill-platform CLI | 命令行工具 | 必需 | 定时任务注册与管理 |
| 飞书机器人 | 通信渠道 | 必需 | 飞书开放平台创建应用机器人 |
| Telegram Bot | 通信渠道 | 可选 | 通过 @BotFather 创建(多渠道通知需要) |
| Outlook 账号(多日历) | 日历来源 | 必需 | 已配置的工作与个人邮箱 |
| LLM API | API | 必需 | 由 Agent 内置 LLM 提供 |
| 数据库 | 存储 | 可选 | 团队同步与历史分析(可选,默认文件存储) |
# 环境变量示例
export FEISHU_APP_ID="your_feishu_app_id"
export FEISHU_APP_SECRET="your_feishu_app_secret"
export OUTLOOK_WORK_EMAIL="work@company.com"
export OUTLOOK_PERSONAL_EMAIL="personal@outlook.com"
export TG_BOT_TOKEN="your_telegram_bot_token"
专业版配置支持多日历、递进提醒与团队同步。
{
"calendars": [
{"id": "work", "source": "owa", "priority": 1, "color": "🔵"},
{"id": "personal", "source": "owa", "priority": 2, "color": "🟢"},
{"id": "team", "source": "owa", "priority": 1, "color": "🟡"}
],
"reminder": {
"mode": "progressive",
"rules": {
"high": [{"offset_hours": 24}, {"offset_hours": 2}, {"offset_hours": 0.5}],
"medium": [{"offset_hours": 2}],
"low": [{"offset_hours": 0.5}]
},
"morning_threshold": "12:00",
"morning_advance_hours": 2,
"afternoon_reminder_time": "12:00"
},
"conflict_detection": {
"enabled": true,
"buffer_minutes": 15,
"auto_suggest": true
},
"timezone": "Asia/Shanghai",
"filters": {
"workdays_only": false,
"skip_categories": ["已取消", "请假"]
},
"notifications": {
"channels": ["feishu", "telegram"],
"admin_open_id": "ou_详情见说明详情见说明xx"
},
"analysis": {
"weekly_report": true,
"report_day": 5,
"export_format": "csv"
},
"team_sync": {
"enabled": false,
"team_members": []
}
}
专业版与免费版使用相同的扫描脚本接口与提醒消息格式。免费版的 cron 任务、飞书 open_id 配置可直接复用。升级后免费版的单日历扫描自动作为专业版多日历配置的一个条目。
不会。专业版对聚合后的日程去重(按标题+时间),同一日程只提醒一次。不同日历中相同日程会合并显示。
递进提醒仅对高优先级日程启用。可在 reminder.rules 中自定义每个优先级的提醒次数与时间点。低优先级日程默认仅提醒一次。
按日历 priority 字段判断(数字越小优先级越高)。同优先级冲突时,系统建议协商调整并提示转场时间。
专业版支持通过 owa-outlook 读取 Outlook 日历。可通过扩展 calendars[].source 配置接入其他日历源(如 Google Calendar API)。
专业版在日程中标注原始时区,提醒时间按用户本地时区(timezone 配置)转换。跨时区会议会在提醒中显示双方时区时间。
开启 team_sync 后,系统读取团队成员的忙/闲状态(不显示具体内容,仅显示时段是否占用),辅助会议时间协调。需团队成员授权日历读取权限。
可以。配置 analysis.weekly_report: true 与 analysis.report_day(1-7,周一到周日),系统在指定日期自动生成并发送周报到管理员。
| 错误场景 | 原因 | 处理方式 |
|---|---|---|
| LLM响应超时或无响应 | 网络延迟或模型负载过高 | 执行ping命令测试网络连通性,检查防火墙和代理设置连接,执行ping命令测试网络连通性,检查防火墙和代理设置连接后重新执行命令请求;确认Agent平台LLM服务正常 |
| 输入内容格式不正确 | 用户输入不符合skill预期格式 | 检查输入是否符合skill使用说明中的格式要求,参考示例章节 |
| 执行结果与预期不符 | 指令描述不够明确或上下文不足 | 提供更详细的指令描述,补充必要的上下文信息 |
| 命令执行失败 | 运行环境不满足要求或权限不足 | 确认运行环境符合依赖说明中的要求;检查命令权限设置 |