Ching L dc2a4c0279 feat: 添加智能合并重复比赛功能 v4.2
- 新增 _merge_duplicate_matches() 方法
- 自动检测同时间具有共同队伍的比赛并合并
- 保留更长的队伍名称作为正式名称
- 解决队伍名称变体问题(如 OG vs OG Esports)

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-13 09:59:14 +08:00

5.9 KiB
Raw Blame History

Dota 2 Calendar Sync v4.2

自动从 Liquipedia 获取 Dota 2 Tier 1 比赛信息并同步到 Google Calendar支持自动更新比赛结果、时间变更、智能管理TBD占位事件、自动清理过期和重复比赛。

更新日志

v4.2 (2025-09-13)

  • 🔀 智能合并重复比赛:自动检测同时间具有共同队伍的比赛并合并(处理队伍名称变体)
  • 📝 队伍名称标准化:当发现 "OG" 和 "OG Esports" 这样的变体时,保留更长的完整名称
  • 优化数据获取:在获取数据时即进行去重,减少后续处理的复杂度

v4.1 (2025-09-13)

  • 🐛 修复TBD事件匹配逻辑现在可以正确识别并更新部分TBD事件如 "TBD vs Team" 或 "Team vs TBD"
  • 🔧 增强TBD事件清理删除所有与确认比赛同时间的TBD事件不再限于 "TBD vs TBD" 格式
  • 🎯 防止创建重复事件改进事件匹配算法确保TBD事件被更新而非创建新事件

v4.0 (2025-09-05)

  • 🏗️ 代码结构重构:使用 dataclass 替代字典,提高类型安全性
  • 🔄 增强错误处理:添加自动重试机制(指数退避)
  • 📝 专业日志系统:使用 Python logging 模块,支持多级别日志
  • 🛡️ 优雅降级:部分失败不影响整体同步流程
  • 代码模块化:拆分大函数,提高可维护性

功能

  • 自动获取 Liquipedia 上的 Tier 1 级别 Dota 2 比赛
  • 包括 The International、Major、Premier 级别赛事
  • 自动创建 Google Calendar 事件
  • 自动更新已完成比赛的结果和比分
  • 检测并更新比赛时间变更(赛程调整时自动同步)
  • 智能管理TBD占位事件(自动更新队伍信息,删除过期和被取代的事件)
  • 自动清理重复比赛(优先保留已完成的比赛记录)
  • 增强的TBD事件清理删除已结束但仍包含TBD的事件删除与确认比赛同时间的TBD占位符
  • 避免重复添加已存在的比赛
  • 支持 dry-run 模式进行测试

前置要求

1. Google Calendar 设置

你需要将你的 Google Calendar 分享给服务账号:

  1. 打开 Google Calendar
  2. 进入日历设置
  3. 在"与特定人员共享"部分,添加:
    • Email: calendar-bot@tunpok.iam.gserviceaccount.com
    • 权限: "进行更改"Make changes to events

2. Python 环境

使用 pyenv 和虚拟环境:

pyenv activate test-venv
pip install -r requirements.txt

使用方法

基本用法

# 激活虚拟环境
source $(pyenv prefix test-venv)/bin/activate

# 运行同步(使用默认的 primary 日历)
python sync_dota2_matches.py

# 指定特定的 Google Calendar
python sync_dota2_matches.py --calendar-id "091325d4ea74ad78387402db1a428390c4779dff573322863b6fca00194da024@group.calendar.google.com"

# 使用调试模式查看详细日志
python sync_dota2_matches.py --log-level DEBUG

Dry Run 模式

在实际添加事件之前,先测试看看会添加哪些比赛:

python sync_dota2_matches.py --dry-run

命令行参数

  • --calendar-id: Google Calendar ID 或邮箱地址(默认: primary
  • --dry-run: 只显示将要添加的比赛,不实际创建事件
  • --no-results: 跳过更新已完成比赛的结果
  • --no-time-updates: 跳过更新比赛时间变更
  • --credentials: 服务账号凭据文件路径(默认: credentials.json
  • --log-level: 设置日志级别 (DEBUG, INFO, WARNING, ERROR)

文件说明

  • sync_dota2_matches.py: 主同步脚本v4版本 - 优化版)
  • legacy/: 历史版本脚本存档
  • credentials.json: Google 服务账号凭据(需要自行添加)
  • requirements.txt: Python 依赖包
  • run_sync.sh: 便捷运行脚本
  • TIMEZONE_INFO.md: 时区转换说明
  • CHANGELOG.md: 版本更新历史
  • legacy/: 旧版本脚本存档

功能特点

  1. 智能匹配识别

    • 自动识别 Tier 1、Premier、Major 级别赛事
    • 支持 The International (TI) 赛事
    • 提取比赛格式Bo1、Bo3、Bo5
    • 智能去重:相同时间、相同轮次的 TBD 比赛只保留一个代表
    • TBD比赛保护确保TBD vs TBD的比赛不会被错误标记为已完成
    • 改进的TBD匹配1小时时间窗口匹配更好处理赛程调整
    • 重复比赛清理:自动检测并删除同队伍的重复事件
    • TBD事件自动删除当队伍确定后自动删除对应的TBD占位符
    • 增强的过期事件清理自动删除已结束但仍包含TBD的事件
    • 智能TBD vs TBD处理删除与确认比赛在同一时间段的TBD vs TBD占位符
  2. 日历事件管理

    • 自动设置比赛时长(根据 Bo 格式估算)
    • 添加 30 分钟提醒
    • 使用蓝色标记 Dota 2 事件
    • 避免重复添加
    • 自动更新已完成比赛的结果
    • 在标题添加完成标记(✓ + 比分)
    • TBD 比赛队伍确定后自动更新
    • 自动清理过期的TBD占位事件
  3. 错误处理

    • 网络请求超时处理
    • API 错误重试
    • 详细的错误日志
    • 改进的比分解析:避免将时间(19:00)误识别为比分

定时运行

可以设置 cron job 定期运行同步:

# 编辑 crontab
crontab -e

# 每天早上 9 点运行同步
0 9 * * * cd /Users/ching/develop/dota2-calendar && /Users/ching/.pyenv/versions/3.10.14/envs/test-venv/bin/python sync_dota2_matches.py --calendar-id your-email@gmail.com

注意事项

  1. 确保已经将日历分享给服务账号邮箱
  2. 首次运行建议使用 --dry-run 测试
  3. Liquipedia 页面结构可能会变化,如果解析失败需要更新解析逻辑

故障排查

如果没有找到比赛:

  1. 检查 Liquipedia 页面是否可以访问
  2. 运行 python fetch_liquipedia.py 查看页面结构
  3. 确认是否有正在进行的 Tier 1 赛事

如果无法添加到日历:

  1. 确认已经正确分享日历给服务账号
  2. 检查 credentials.json 文件是否有效
  3. 确认使用了正确的 calendar-id