主程序
#导入模块
#logging:用于记录日志,方便调试和跟踪程序运行情况。
#icalendar:用于生成 iCalendar 格式的日历文件。
#datetime 和 timedelta:用于处理日期和时间。
#pytz:用于处理时区信息。
import logging
from icalendar import Calendar, Event
from datetime import datetime, timedelta
import pytz
# 配置信息
#OPENAI_API_KEY:OpenAI API 的密钥,用于调用 GPT 模型生成计划。
#TIMEZONE:设置时区为上海,确保时间处理的准确性。
#OPENAI_API_KEY = "您的OpenAI API密钥"
#TIMEZONE = pytz.timezone("Asia/Beijing")
# 时间解析函数
# 设置日志记录
logging.basicConfig(filename='planner.log', level=logging.INFO)
def parse_time_input(time_str):
"""将自然语言时间解析为datetime对象。
如果解析失败,记录错误并返回当前时间 + 3天的默认值。
"""
try:
return datetime.strptime(time_str, "%Y-%m-%d")
except ValueError as e:
logging.error(f"时间解析失败: {e}")
return datetime.now(TIMEZONE) + timedelta(days=3) # 默认3天后
# 创建时间解析函数
#parse_time_input:将用户输入的时间字符串解析为 datetime 对象。如果解析失败,记录错误并返回当前时间 + 3天的默认值。
def create_event(task, start_time):
"""创建一个 iCalendar 事件,并设置任务摘要、开始时间和结束时间。
参数:
task (str): 任务描述
start_time (datetime): 任务的开始时间
返回:
event (Event): 创建的 iCalendar 事件
"""
event = Event()
event.add('summary', task)
event.add('dtstart', start_time)
event.add('dtend', start_time + timedelta(hours=1)) # create_event:创建一个 iCalendar 事件,包括任务描述、开始时间和结束时间。默认持续1小时
return event
# 创建第一版日历文件函数
# create_ics:将生成的计划文本转换为 iCalendar 格式,并保存为 .ics 文件。该版本假设每个任务都从1小时后开始,且没有处理具体的截止时间
def create_ics(plan_text, output_path="plan.ics"):
"""将计划文本转换为 iCalendar 格式并保存为 .ics 文件。
参数:
plan_text (str): 包含任务和截止时间的计划文本
output_path (str): 输出的 .ics 文件路径,默认为 'plan.ics'
返回:
output_path (str): 生成的 .ics 文件路径
"""
cal = Calendar()
cal.add('prodid', '-//AI Planner//mxm.dk//')
cal.add('version', '2.0')
for line in plan_text.split('\n'):
if '.' in line:
task = line.split(') ')[1] if ')' in line else line
start_time = datetime.now(TIMEZONE) + timedelta(hours=1)
event = create_event(task, start_time)
cal.add_component(event)
with open(output_path, 'wb') as f:
f.write(cal.to_ical())
return output_path
#第一版主程序逻辑
if __name__ == "__main__":
# 用户输入
requirements = input("请输入您的计划需求(例如:开发新功能、准备报告等):")
current_status = input("请描述当前进展(例如:已完成50%、未开始等):")
deadline_input = input("请输入截止时间(YYYY-MM-DD)(如果不确定,直接按回车默认3天后):")
# 如果用户没有输入截止时间,默认为3天后
if not deadline_input.strip():
deadline = datetime.now(TIMEZONE) + timedelta(days=3)
else:
deadline = parse_time_input(deadline_input)
print("正在生成计划,请稍候...")
# 生成计划
openai.api_key = OPENAI_API_KEY
prompt = f"""需求:{requirements}
现状:{current_status}
期限:{deadline.strftime("%Y-%m-%d")}
请生成含时间节点的执行计划:"""
plan = generate_plan(prompt)
print("\n生成的计划:\n" + plan)
# 创建日历文件
ics_path = create_ics(plan)
print(f"\n日历文件已生成:{ics_path}")
# 同步到iPhone指引
print("""
[iPhone同步步骤]
1. 将生成的plan.ics文件发送到iPhone(邮件/隔空投送)
2. 在iPhone上点击附件 → 选择"添加到日历"
3. 打开"快捷指令"App执行自动化:
- 创建个人自动化 → 特定时间
- 添加"查找日程" + "发送提醒"操作
""")
#创建改进版日历文件函数
with open(output_path, 'wb') as f:
f.write(cal.to_ical().decode('utf-8').encode('utf-8'))
import re
def create_ics(plan_text, output_path="plan.ics"):
cal = Calendar()
cal.add('prodid', '-//AI Planner//mxm.dk//')
cal.add('version', '2.0')
# 使用正则表达式解析GPT响应
pattern = re.compile(r'(\d+)\.\s*(.+?)\s*\((.*?)\)')
for match in pattern.finditer(plan_text):
task = match.group(2)
deadline_str = match.group(3)
try:
deadline = datetime.strptime(deadline_str, "%Y-%m-%d").replace(tzinfo=TIMEZONE)
except ValueError:
deadline = datetime.now(TIMEZONE) + timedelta(days=3)
event = create_event(task, deadline)
cal.add_component(event)
with open(output_path, 'wb') as f:
f.write(cal.to_ical().decode('utf-8').encode('utf-8'))
return output_path
使用方法
1.安装依赖
2.配置OpenAI API
访问 OpenAI Platform 获取API密钥
替换代码中的OPENAI_API_KEY
3.运行程序
4.iPhone同步
将生成的plan.ics通过AirDrop/邮件发送到iPhone
点击附件选择"添加到日历"
高级自动化(需iOS 13+)
在iPhone上创建快捷指令:
// 每天早8点提醒当日计划
on run
find events where start date is today
get details of each event
show alert with list
end run
设置自动化触发条件:
"特定时间" → 选择早上8:00
添加操作:"运行快捷指令"选择上述指令
补充说明:
1.智能解析
支持自然语言时间描述(如"下周一下午3点")
自动分配任务间隔时间(可修改create_ics函数调整)
2.日历兼容
生成的ICS文件兼容Apple Calendar/Google Calendar
自动添加时区信息
3.安全机制
所有处理在本地完成
无需越狱或第三方云服务
扩展建议
添加Microsoft To Do API支持:可将计划同步到Office 365账户
集成SMTP模块:自动发送日历邀请
添加进度跟踪功能:通过iOS Shortcuts更新任务状态
(以上内容仅个人学习成果分享,如有更好的建议,欢迎随时提议)