dota2-match-calendar/delete_duplicates.py
Ching L 6fd21a64b9
All checks were successful
continuous-integration/drone/push Build is passing
修复进行中比赛更新创建重复事件的问题
- 改进事件匹配逻辑,增强基于队伍名称的查找机制
- 即使比分变化(如从1-0到1-1)也能正确识别同一场比赛
- 添加cleanup_duplicates.py工具用于查找和删除重复事件
- 添加delete_duplicates.py用于手动清理特定重复
- 更新CHANGELOG.md记录v3.4版本改动

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-06 00:09:44 +08:00

120 lines
4.2 KiB
Python

#!/usr/bin/env python3
"""
Delete duplicate calendar events based on screenshot
Manually delete the duplicate events that were created during live score updates
"""
from google.oauth2 import service_account
from googleapiclient.discovery import build
from datetime import datetime, timedelta
import pytz
import sys
def authenticate(credentials_file='credentials.json'):
"""Authenticate with Google Calendar using service account credentials"""
try:
credentials = service_account.Credentials.from_service_account_file(
credentials_file,
scopes=['https://www.googleapis.com/auth/calendar']
)
service = build('calendar', 'v3', credentials=credentials)
print(f"✓ Successfully authenticated with Google Calendar")
return service
except Exception as e:
print(f"✗ Authentication failed: {e}")
sys.exit(1)
def delete_specific_events(service, calendar_id='primary'):
"""Delete specific duplicate events based on partial scores"""
# Based on the screenshot, these are the duplicate events to look for:
duplicates_to_find = [
("1-0", "NGX", "Liquid"), # 19:00 1-0 NGX vs Liquid
("1-1", "NGX", "Liquid"), # 19:45 1-1 NGX vs Liquid
]
# Get events for Sept 5
target_date = datetime(2025, 9, 5, tzinfo=pytz.UTC)
time_min = target_date.isoformat()
time_max = (target_date + timedelta(days=1)).isoformat()
events_result = service.events().list(
calendarId=calendar_id,
timeMin=time_min,
timeMax=time_max,
maxResults=500,
singleEvents=True,
orderBy='startTime'
).execute()
events = events_result.get('items', [])
print(f"\nScanning {len(events)} events on September 5th...")
print("=" * 60)
events_to_delete = []
for event in events:
summary = event.get('summary', '')
# Check if this matches any of our duplicate patterns
for score, team1, team2 in duplicates_to_find:
if score in summary and team1 in summary and team2 in summary and '' not in summary:
events_to_delete.append({
'id': event['id'],
'summary': summary,
'start': event['start'].get('dateTime', event['start'].get('date'))
})
print(f"Found duplicate: {summary}")
print(f" Time: {event['start'].get('dateTime', event['start'].get('date'))}")
print(f" ID: {event['id']}")
break
if not events_to_delete:
print("\n❌ No duplicate events found in API.")
print("This could mean:")
print("1. The duplicates are in a different calendar")
print("2. They have already been deleted")
print("3. The calendar interface is showing cached data")
print("\nTry refreshing your browser (Ctrl+F5 or Cmd+Shift+R)")
return
print(f"\n⚠️ Found {len(events_to_delete)} duplicate events to delete")
print("-" * 60)
# Confirm before deleting
print("\nThese events will be deleted:")
for event in events_to_delete:
print(f" - {event['summary']} at {event['start'][:19]}")
response = input("\nDo you want to delete these events? (yes/no): ")
if response.lower() == 'yes':
deleted_count = 0
for event in events_to_delete:
try:
service.events().delete(
calendarId=calendar_id,
eventId=event['id']
).execute()
print(f"✓ Deleted: {event['summary']}")
deleted_count += 1
except Exception as e:
print(f"✗ Failed to delete {event['summary']}: {e}")
print(f"\n✓ Successfully deleted {deleted_count} duplicate events")
else:
print("\n❌ Deletion cancelled")
def main():
# Authenticate
service = authenticate()
# Delete specific duplicates
delete_specific_events(service)
print("\nPlease refresh your Google Calendar to see the changes.")
print("If you still see duplicates, they might be in a different calendar.")
if __name__ == "__main__":
main()