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点提醒我喝水

效果图:

相关推荐
Chef_Chen2 分钟前
Agent学习--LLM--推理熵
人工智能·学习·机器学习
小鹿软件办公3 分钟前
OpenAI 面向高频用户推出全新 100 美元档 ChatGPT Pro 套餐
人工智能·chatgpt
ECT-OS-JiuHuaShan6 分钟前
科学的本来意义,是基于规范的共识逻辑,而非共识方法
人工智能·科技·学习·算法·生活
CoderJia程序员甲12 分钟前
GitHub 热榜项目 - 日榜(2026-04-09)
人工智能·ai·大模型·github·ai教程
chaofan98013 分钟前
从文字响应到动态沙盒:深度解析 Gemini 交互模拟 API 的技术实现与集成
人工智能·交互·api
hay_lee13 分钟前
匿名屠榜,阿里认领:HappyHorse 1.0 如何重写AI视频生成规则?
人工智能·音视频
无忧智库14 分钟前
某新区“十五五”智慧城市数字底座与数字孪生城市建设全栈技术深度解析(WORD)
人工智能·物联网·智慧城市
kishu_iOS&AI21 分钟前
机器学习 —— 线性回归(实例)
人工智能·python·机器学习·线性回归
路飞说AI23 分钟前
Claude Code WebFetch:Unable to verify domain 快速解决
ai编程·claudecode·webfetch
天天进步201528 分钟前
[架构篇] 解构项目蓝图:Toonflow 的模块化设计与 AI 管道流转
人工智能·架构