claude增加自动化日历提醒功能,并同步到iphone日历

我们经常在生活中需要增加任务提醒,比如开会,吃药,行程,所以自动化添加日历提醒很方便。

于是我找到了Google Calendar,让他和claude一起为我们服务。

通过 Claude + Google Calendar API,可以实现直接告诉 Claude 添加提醒,自动同步到 iPhone。

一、前置准备

1. 安装 Python 依赖

复制代码
pip install google-api-python-client google-auth-httplib2 google-auth-oauthlib tzdata

2. Google Cloud Console 配置

  1. 打开 console.cloud.google.com

  2. 新建项目,名称如 claude-calendar

  3. 左侧菜单 → API 和服务启用 API 和服务 → 搜索 Google Calendar API → 启用

  4. 左侧 → 凭据创建凭据OAuth 客户端 ID

  5. 配置 OAuth 同意屏幕:选外部 → 填应用名称和邮箱 → 保存

  6. 发布状态改为"正式版"(否则会报 access_denied 错误) 不过自己测试可以不用,可以在目标对象添加测试用户,然后把你的测试email加进去即可。

  7. 应用类型选 桌面应用 → 创建

  8. 下载 JSON 文件,重命名为 credentials.json,放到项目目录

3. 首次授权

第一次运行脚本时会自动弹出浏览器授权页面:

  • 选择 Google 账号登录

  • 若提示"此应用未经验证"→ 点击高级继续

  • 授权完成后自动保存 token.json之后无需重复授权


二、核心脚本

脚本:add_calendar_event.py

python 复制代码
#!/usr/bin/env python3
"""
Google Calendar 自动添加提醒脚本
用法: python add_calendar_event.py --title "标题" --start "2024-12-25 15:00" --end "2024-12-25 16:00" [--reminder 10] [--description "描述"]
"""

import argparse
import json
import os
import sys
from datetime import datetime, timedelta
from zoneinfo import ZoneInfo

# Windows 终端 UTF-8 输出
if sys.platform == "win32":
    sys.stdout.reconfigure(encoding="utf-8")

from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError

SCOPES = ["https://www.googleapis.com/auth/calendar"]
TIMEZONE = "Asia/Dubai"  # UTC+4,阿联酋时间

SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
CREDENTIALS_FILE = os.path.join(SCRIPT_DIR, "credentials.json")
TOKEN_FILE = os.path.join(SCRIPT_DIR, "token.json")


def get_credentials():
    creds = None
    if os.path.exists(TOKEN_FILE):
        creds = Credentials.from_authorized_user_file(TOKEN_FILE, SCOPES)
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(CREDENTIALS_FILE, SCOPES)
            creds = flow.run_local_server(port=0)
        with open(TOKEN_FILE, "w") as f:
            f.write(creds.to_json())
    return creds


def parse_datetime(dt_str):
    """解析时间字符串,支持多种格式"""
    formats = [
        "%Y-%m-%d %H:%M",
        "%Y-%m-%d %H:%M:%S",
        "%Y/%m/%d %H:%M",
        "%Y/%m/%d %H:%M:%S",
    ]
    for fmt in formats:
        try:
            return datetime.strptime(dt_str, fmt)
        except ValueError:
            continue
    raise ValueError(f"无法解析时间格式: {dt_str},请使用 YYYY-MM-DD HH:MM 格式")


def add_event(title, start_str, end_str=None, reminder_minutes=10, description=""):
    tz = ZoneInfo(TIMEZONE)
    start_dt = parse_datetime(start_str).replace(tzinfo=tz)

    if end_str:
        end_dt = parse_datetime(end_str).replace(tzinfo=tz)
    else:
        end_dt = start_dt + timedelta(hours=1)

    creds = get_credentials()
    service = build("calendar", "v3", credentials=creds)

    event = {
        "summary": title,
        "description": description,
        "start": {
            "dateTime": start_dt.isoformat(),
            "timeZone": TIMEZONE,
        },
        "end": {
            "dateTime": end_dt.isoformat(),
            "timeZone": TIMEZONE,
        },
        "reminders": {
            "useDefault": False,
            "overrides": [
                {"method": "popup", "minutes": reminder_minutes},
            ],
        },
    }

    created = service.events().insert(calendarId="primary", body=event).execute()
    return created


def main():
    parser = argparse.ArgumentParser(description="添加 Google Calendar 事件")
    parser.add_argument("--title", required=True, help="事件标题")
    parser.add_argument("--start", required=True, help="开始时间 (YYYY-MM-DD HH:MM)")
    parser.add_argument("--end", default=None, help="结束时间 (YYYY-MM-DD HH:MM),默认开始后1小时")
    parser.add_argument("--reminder", type=int, default=10, help="提前提醒分钟数,默认10分钟")
    parser.add_argument("--description", default="", help="事件描述")

    args = parser.parse_args()

    try:
        event = add_event(
            title=args.title,
            start_str=args.start,
            end_str=args.end,
            reminder_minutes=args.reminder,
            description=args.description,
        )
        print(json.dumps({
            "success": True,
            "event_id": event["id"],
            "title": event["summary"],
            "start": event["start"]["dateTime"],
            "end": event["end"]["dateTime"],
            "link": event.get("htmlLink", ""),
        }, ensure_ascii=False, indent=2))
    except HttpError as e:
        print(json.dumps({"success": False, "error": str(e)}, ensure_ascii=False))
        sys.exit(1)
    except Exception as e:
        print(json.dumps({"success": False, "error": str(e)}, ensure_ascii=False))
        sys.exit(1)


if __name__ == "__main__":
    main()

参数说明

参数 必填 说明
--title 事件标题
--start 开始时间,格式:YYYY-MM-DD HH:MM
--end 结束时间,默认开始后 1 小时
--reminder 提前提醒分钟数,默认 10 分钟,填 0 表示准时提醒
--description 事件备注描述

使用示例

复制代码
# 基本用法
python add_calendar_event.py --title "喝水" --start "2026-03-20 06:00"
​
# 自定义结束时间和提醒
python add_calendar_event.py --title "开会" --start "2026-03-20 15:00" --end "2026-03-20 16:00" --reminder 15
​
# 带备注
python add_calendar_event.py --title "交报告" --start "2026-03-21 09:00" --reminder 60 --description "记得附上数据截图"

时区配置

脚本默认时区为 Asia/Dubai(UTC+4)。如需修改,编辑脚本第 17 行:

复制代码
TIMEZONE = "Asia/Dubai"  # 修改为你所在时区

常用时区:

  • 中国:Asia/Shanghai

  • 阿联酋:Asia/Dubai

  • 英国:Europe/London

  • 美东:America/New_York


三、iPhone 同步设置

选择以下任一方式:

方式 A(推荐): App Store 下载 Google Calendar app,登录同一 Google 账号

方式 B: iPhone 设置 → 日历 → 账户 → 添加账户 → Google → 登录

添加后日历事件会自动同步,提醒也会在 iPhone 上弹出通知。


四、与 Claude 配合使用

直接告诉 Claude 即可,例如:

"明天下午3点提醒我开会" "周五早上9点提醒我交报告,提前1小时提醒" "后天下午6点提醒我买菜,备注:买西红柿和鸡蛋"

Claude 会自动调用脚本创建事件,同步到 Google Calendar 和 iPhone。


五、文件清单

文件 说明
credentials.json Google OAuth 凭据(从 Cloud Console 下载)
token.json 授权 token(首次授权后自动生成,勿删除)
add_calendar_event.py 核心脚本

六、常见问题

Q:运行报 access_denied 错误 A:Google Cloud Console 中将 OAuth 同意屏幕的发布状态改为正式版

Q:token 失效需要重新授权 A:删除 token.json,重新运行脚本,浏览器会再次弹出授权页面。

Q:事件创建成功但 iPhone 看不到 A:确认 iPhone 已登录同一 Google 账号,等待几分钟让日历同步完成。

Q:时间不对 A:检查脚本中 TIMEZONE 是否与你所在时区一致。

本人亲测:

注意看一下claude的处理结果,别把日期搞错了。还有就是先检查电脑上的是否正常,然后看手机是否同步。

跟claude说:明天上午6点提醒我喝水

效果图:

相关推荐
lcj09246662 小时前
机房U位资产智能化管理解决方案:破解传统运维痛点
人工智能
正宗咸豆花2 小时前
端到端AI决策架构如何重塑实时协作体验?
人工智能·架构
lally.2 小时前
Claude code agent由哪些东西组成
人工智能
NOCSAH2 小时前
统好AI数智平台SRM:重塑采购管理新范式
大数据·人工智能·数智化一体平台·统好ai
superior tigre2 小时前
LLM/HPC常见术语汇总
人工智能·llm·hpc
乱世刀疤2 小时前
openclaw更换模型操作步骤
人工智能
高德开放平台2 小时前
Skill 上新|高德开放平台上线 Amap SDK Skills!
人工智能·信息可视化·开发者·高德地图
junjunzai1232 小时前
设置cuda:1但是cuda:0在波动的问题
人工智能·深度学习
Peter·Pan爱编程2 小时前
深度解析MiniMax M2.7:当AI学会“自我进化”,以及如何通过Ollama本地体验最强Agent
人工智能·ai编程·agent skills·openclaw