Add direct Google Calendar push script
This commit is contained in:
111
docs/scripts/direct_calendar_push.py
Executable file
111
docs/scripts/direct_calendar_push.py
Executable file
@@ -0,0 +1,111 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Direct Google Calendar API integration
|
||||||
|
Requires: pip install google-auth google-auth-oauthlib google-auth-httplib2 google-api-python-client
|
||||||
|
"""
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
try:
|
||||||
|
from google.oauth2.credentials import Credentials
|
||||||
|
from google.auth.transport.requests import Request
|
||||||
|
from googleapiclient.discovery import build
|
||||||
|
from googleapiclient.errors import HttpError
|
||||||
|
except ImportError:
|
||||||
|
print("❌ Missing dependencies. Install with:")
|
||||||
|
print(" pip install google-auth google-auth-oauthlib google-auth-httplib2 google-api-python-client")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
# Configuration
|
||||||
|
SCOPES = ['https://www.googleapis.com/auth/calendar']
|
||||||
|
EVENTS_FILE = '/home/serhii/stack/scrum/repo/docs/calendar_events_s1.json'
|
||||||
|
TOKEN_FILE = '/home/serhii/.config/google_calendar_token.json'
|
||||||
|
CREDENTIALS_FILE = '/home/serhii/.config/google_calendar_credentials.json'
|
||||||
|
|
||||||
|
def get_credentials():
|
||||||
|
"""Get valid user credentials from storage or OAuth flow"""
|
||||||
|
creds = None
|
||||||
|
|
||||||
|
# Check if token file exists
|
||||||
|
if os.path.exists(TOKEN_FILE):
|
||||||
|
creds = Credentials.from_authorized_user_file(TOKEN_FILE, SCOPES)
|
||||||
|
|
||||||
|
# If no valid credentials, need to authenticate
|
||||||
|
if not creds or not creds.valid:
|
||||||
|
if creds and creds.expired and creds.refresh_token:
|
||||||
|
creds.refresh(Request())
|
||||||
|
else:
|
||||||
|
print("❌ No valid credentials found.")
|
||||||
|
print("\n📌 To authenticate:")
|
||||||
|
print("1. Go to https://console.cloud.google.com/")
|
||||||
|
print("2. Create OAuth 2.0 credentials")
|
||||||
|
print("3. Download credentials.json")
|
||||||
|
print(f"4. Save it to: {CREDENTIALS_FILE}")
|
||||||
|
print("5. Run this script again")
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Save credentials for next run
|
||||||
|
with open(TOKEN_FILE, 'w') as token:
|
||||||
|
token.write(creds.to_json())
|
||||||
|
|
||||||
|
return creds
|
||||||
|
|
||||||
|
def create_events(service, events):
|
||||||
|
"""Create calendar events"""
|
||||||
|
created_count = 0
|
||||||
|
|
||||||
|
for event in events:
|
||||||
|
try:
|
||||||
|
created_event = service.events().insert(
|
||||||
|
calendarId='primary',
|
||||||
|
body=event
|
||||||
|
).execute()
|
||||||
|
|
||||||
|
print(f"✅ Created: {event['summary']}")
|
||||||
|
print(f" 🔗 {created_event.get('htmlLink')}")
|
||||||
|
created_count += 1
|
||||||
|
|
||||||
|
except HttpError as error:
|
||||||
|
print(f"❌ Error creating event: {error}")
|
||||||
|
|
||||||
|
return created_count
|
||||||
|
|
||||||
|
def main():
|
||||||
|
print("📅 Google Calendar Direct Push")
|
||||||
|
print("="*60)
|
||||||
|
|
||||||
|
# Load events
|
||||||
|
if not os.path.exists(EVENTS_FILE):
|
||||||
|
print(f"❌ Events file not found: {EVENTS_FILE}")
|
||||||
|
return
|
||||||
|
|
||||||
|
with open(EVENTS_FILE, 'r') as f:
|
||||||
|
events = json.load(f)
|
||||||
|
|
||||||
|
print(f"📋 Loaded {len(events)} events")
|
||||||
|
|
||||||
|
# Get credentials
|
||||||
|
creds = get_credentials()
|
||||||
|
if not creds:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Build service
|
||||||
|
try:
|
||||||
|
service = build('calendar', 'v3', credentials=creds)
|
||||||
|
print("✅ Connected to Google Calendar API")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"❌ Failed to connect: {e}")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Create events
|
||||||
|
print("\n🚀 Creating events...")
|
||||||
|
created = create_events(service, events)
|
||||||
|
|
||||||
|
print("\n" + "="*60)
|
||||||
|
print(f"✅ Successfully created {created}/{len(events)} events")
|
||||||
|
print("="*60)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user