I have used Google Calendars to schedule and control a number of projects (eg. sprinkler system, alarm clock, etc) . The following How To will get you started. You will of course need a google account.
Google Developers Console
This json file contains your API credentials needed to access the Google Calendar APIs.
Install Google API Libraries
$ sudo pip install --upgrade google-api-python-client
gflags may or may not be needed, depending on what code you use: (may be optional)
$ sudo pip install --upgrade python-gflags
If you would prefer alternatives, view the Google APIs Client Library for Python page.
1) Clone my sample code:
# git clone https://github.com/oeey/gcalendar.git
The sample code is just a slight modification from the Getting Started Sample Code. The Google sample code has some outdated code that will throw some obsoleted warnings.
2) The application has not been authorized to an account yet. Run the application once and you will be asked to paste a validation URL into your browser. Login to your desired target account (with the calendars you want to access) and then paste the validation URL into your browser.
For convenience I have a first_auth.py script that is the same script as the gcalendar.py script, but terminates after authorization. You can run any of the scripts to complete this authorization step.
The first_auth.py is pretty simple:
from apiclient.discovery import build from oauth2client.file import Storage from oauth2client.client import AccessTokenRefreshError from oauth2client.client import OAuth2WebServerFlow from oauth2client.tools import run_flow from oauth2client.client import flow_from_clientsecrets def main(): scope = 'https://www.googleapis.com/auth/calendar' flow = flow_from_clientsecrets('client_secret.json', scope=scope) storage = Storage('credentials.dat') credentials = storage.get() class fakeargparse(object): # fake argparse.Namespace noauth_local_webserver = True logging_level = "ERROR" flags = fakeargparse() if credentials is None or credentials.invalid: credentials = run_flow(flow, storage, flags) if __name__ == '__main__': main()
You may notice the "fakeargparse" code. The run_flow() call wants the flags to be set from the parameters pulled from argparse. I think that is overkill for what I needed, so I just created a fake container so run_flow() wouldn't complain.
Run the first_auth.py script to collect the application authorization.
$ python first_auth.py Go to the following link in your browser: https://accounts.google.com/o/oauth2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&client_id=1039XXXXXXXXXXXXXXXXXXXXXXXXXXcs46gdj2.apps.googleusercontent.com&access_type=offline Enter verification code:
$ python first_auth.py Go to the following link in your browser: https://accounts.google.com/o/oauth2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&client_id=46XXXXXXXXXX2-bXXXXXXXXXXXXXusvh6.apps.googleusercontent.com&access_type=offline Enter verification code: 4/WzAQfXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX2vw2M2Pl7OykQI Authentication successful.
Now that we have our API credentials and are authorized to access an account, we can begin to play with the Google Calendars.
View Upcoming Events
... if credentials is None or credentials.invalid: credentials = run_flow(flow, storage, flags) http = httplib2.Http() http = credentials.authorize(http) service = build('calendar', 'v3', http=http) print "Upcoming Events:" request = service.events().list(calendarId='primary') while request != None: response = request.execute() for event in response.get('items', ): print event.get('summary', 'NO SUMMARY') request = service.events().list_next(request, response)
This script defaults to the primary calendar associated with the account.
Next 12 Hours of Events
Finally, to specify a time range for events, I use the following code in my gcalendar.py script. This code will collect the next 12 hours worth of events.
... service = build('calendar', 'v3', http=http) # get the next 12 hours of events epoch_time = time.time() start_time = epoch_time - 3600 # 1 hour ago end_time = epoch_time + 12 * 3600 # 12 hours in the future tz_offset = - time.altzone / 3600 if tz_offset < 0: tz_offset_str = "-%02d00" % abs(tz_offset) else: tz_offset_str = "+%02d00" % abs(tz_offset) start_time = datetime.datetime.fromtimestamp(start_time).strftime("%Y-%m-%dT%H:%M:%S") + tz_offset_str end_time = datetime.datetime.fromtimestamp(end_time).strftime("%Y-%m-%dT%H:%M:%S") + tz_offset_str print "Getting calendar events between: " + start_time + " and " + end_time events = service.events().list(calendarId='primary', timeMin=start_time, timeMax=end_time, singleEvents=True).execute()singleEvents=True).execute() #pprint.pprint(events) for event in events['items']: print event["summary]
And this is the basis for the code I use to schedule my sprinkler system with.