Swift中获取Google Calendar事件及本地存储位置的技术咨询
Hey there! Since you’ve already got your Google API project configured and the Calendar API enabled, let’s break down exactly how to get those events, pull their locations, and save them locally. I’ll walk you through the steps with practical code examples (using Python, since it’s widely used for this kind of work—adjust to your language of choice if needed).
Step 1: Set Up Authentication
First, you’ll need to handle authentication to access the Calendar API. For a personal app, OAuth 2.0 is the right approach (service accounts are better for domain-wide access). Here’s how to get started:
- Download your OAuth 2.0 credentials file (JSON) from the Google Cloud Console (under "APIs & Services" > "Credentials").
- Use the official client library for your language to handle the auth flow. For Python, that’s
google-api-python-clientandgoogle-auth-httplib2.
Install the required packages first:
pip install google-api-python-client google-auth-httplib2 google-auth-oauthlib
Step 2: Fetch Calendar Events
Once authenticated, call the events.list method to retrieve events. You’ll want to specify the calendar ID (use 'primary' for the user’s main calendar) and any filters (like time range if you don’t want all past/future events).
Here’s a code snippet to fetch events:
from googleapiclient.discovery import build from google_auth_oauthlib.flow import InstalledAppFlow from google.auth.transport.requests import Request import pickle import os.path # Define the scope (readonly is enough since we're just pulling data) SCOPES = ['https://www.googleapis.com/auth/calendar.events.readonly'] def get_calendar_service(): creds = None # Load saved credentials if available if os.path.exists('token.pickle'): with open('token.pickle', 'rb') as token: creds = pickle.load(token) # If no valid credentials, log in 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.json', SCOPES) creds = flow.run_local_server(port=0) # Save credentials for next run with open('token.pickle', 'wb') as token: pickle.dump(creds, token) # Build the Calendar API service return build('calendar', 'v3', credentials=creds) def fetch_events(service): # Fetch events from the primary calendar (adjust timeMin/timeMax as needed) events_result = service.events().list( calendarId='primary', timeMin='2024-01-01T00:00:00Z', timeMax='2024-12-31T23:59:59Z', singleEvents=True, orderBy='startTime' ).execute() events = events_result.get('items', []) if not events: print('No upcoming events found.') return events
Step 3: Extract Location Data
Each event object in the response has a location field (it’s optional, so some events might not have one). Loop through the events and pull this field:
def extract_locations(events): locations = [] for event in events: location = event.get('location') if location: # You can also include other event details like title/start time for context locations.append({ 'event_title': event['summary'], 'location': location, 'start_time': event['start'].get('dateTime', event['start'].get('date')) }) return locations
Step 4: Store Locations Locally
Now save the extracted locations to a local file or database. For simplicity, let’s use a JSON file:
import json def save_locations_locally(locations, filename='calendar_locations.json'): with open(filename, 'w') as f: json.dump(locations, f, indent=2) print(f'Saved {len(locations)} locations to {filename}')
Put It All Together
Call the functions in order:
if __name__ == '__main__': service = get_calendar_service() events = fetch_events(service) locations = extract_locations(events) save_locations_locally(locations)
Key Notes to Remember
- Permissions: Make sure your OAuth consent screen has the
calendar.events.readonlyscope approved (for testing, you can add yourself as a test user). - Pagination: If you have a lot of events, the
events.listresponse might include anextPageToken—loop through and fetch additional pages until there’s no token left. - Error Handling: Add try/except blocks to handle network errors, invalid credentials, or API rate limits.
- Other Languages: If you’re using JavaScript, Java, etc., the logic is the same—use the official Google client libraries for your language, authenticate, call
events.list, extract thelocationfield, and save locally.
内容的提问来源于stack exchange,提问作者Kallum Caudwell

