Authentication

There are several ways to authenticate in GoogleCalendar.

Credentials file

If you have a credentials.json (client_secret_*.json) file (see Getting started), GoogleCalendar will read all the needed data to generate the token and refresh-token from it.

To read credentials.json (client_secret_*.json) from the default directory (~/.credentials) use:

gc = GoogleCalendar()

In this case, if ~/.credentials/token.pickle file exists, it will read it and refresh only if needed. If token.pickle does not exist, it will be created during authentication flow and saved alongside with credentials.json (client_secret_*.json) in ~/.credentials/token.pickle.

To avoid saving the token use:

gc = GoogleCalendar(save_token=False)

After token is generated during authentication flow, it can be accessed in gc.credentials field.

To specify credentials.json (client_secret_*.json) file path use credentials_path parameter:

gc = GoogleCalendar(credentials_path='path/to/credentials.json')

or

gc = GoogleCalendar(credentials_path='path/to/client_secret_273833015691-qwerty.apps.googleusercontent.com.json')

Similarly, if token.pickle file exists in the same folder (path/to/), it will be used and refreshed only if needed. If it doesn’t exist, it will be generated and stored alongside the credentials.json (client_secret_*.json) (in path/to/token.pickle).

To specify different path for the pickled token file use token_path parameter:

gc = GoogleCalendar(credentials_path='path/to/credentials.json',
                    token_path='another/path/user1_token.pickle')

That could be useful if you want to save the file elsewhere, or if you have multiple google accounts.

Token object

If you store/receive/generate the token in a different way, you can pass loaded token directly:

from google.oauth2.credentials import Credentials

token = Credentials(
    token='<access_token>',
    refresh_token='<refresh_token>',
    client_id='<client_id>',
    client_secret='<client_secret>',
    scopes=['https://www.googleapis.com/auth/calendar'],
    token_uri='https://oauth2.googleapis.com/token'
)
gc = GoogleCalendar(credentials=token)

It will be refreshed using refresh_token during initialization of GoogleCalendar if needed.

Multiple calendars

To authenticate multiple Google Calendars you should specify different token_path for each of them. Otherwise, gcsa would overwrite default token file location:

gc_primary = GoogleCalendar(token_path='path/to/tokens/token_primary.pickle')
gc_secondary = GoogleCalendar(calendar='f7c1gf7av3g6f2dave17gan4b8@group.calendar.google.com',
                              token_path='path/to/tokens/token_secondary.pickle')

Browser authentication timeout

If you’d like to avoid your script hanging in case user closes the browser without finishing authentication flow, you can use the following solution with the help of Pebble.

First, install Pebble with pip install pebble.

from gcsa.google_calendar import GoogleCalendar
from concurrent.futures import TimeoutError
from pebble import concurrent


@concurrent.process(timeout=60)
def create_process():
    return GoogleCalendar()


if __name__ == '__main__':
    try:
        process = create_process()
        gc = process.result()
    except TimeoutError:
        print("User hasn't authenticated in 60 seconds")

Thanks to Teraskull for the idea and the example.