我们经常在生活中需要增加任务提醒,比如开会,吃药,行程,所以自动化添加日历提醒很方便。
于是我找到了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 配置
-
新建项目,名称如
claude-calendar -
左侧菜单 → API 和服务 → 启用 API 和服务 → 搜索
Google Calendar API→ 启用 -
左侧 → 凭据 → 创建凭据 → OAuth 客户端 ID
-
配置 OAuth 同意屏幕:选外部 → 填应用名称和邮箱 → 保存
-
发布状态改为"正式版"(否则会报 access_denied 错误) 不过自己测试可以不用,可以在目标对象添加测试用户,然后把你的测试email加进去即可。
-
应用类型选 桌面应用 → 创建
-
下载 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点提醒我喝水
效果图:
