1

I want to create an event with google calendar API using python. I used the sample code from here https://developers.google.com/google-apps/calendar/v3/reference/events/insert

I thought GMT would be an issue but then I also changed the GMT as in the code with the google calendar settings. But still having the same error. Full code is given bellow

from __future__ import print_function
import httplib2
import os

from apiclient import discovery
from oauth2client import client
from oauth2client import tools
from oauth2client.file import Storage

import datetime

try:
    import argparse
    flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
    flags = None

# If modifying these scopes, delete your previously saved credentials
# at ~/.credentials/calendar-python-quickstart.json
SCOPES = 'https://www.googleapis.com/auth/calendar.readonly'
CLIENT_SECRET_FILE = 'client_secret.json'
APPLICATION_NAME = 'Google Calendar API Python Quickstart'


def get_credentials():
    """Gets valid user credentials from storage.

    If nothing has been stored, or if the stored credentials are invalid,
    the OAuth2 flow is completed to obtain the new credentials.

    Returns:
        Credentials, the obtained credential.
    """
    home_dir = os.path.expanduser('~')
    credential_dir = os.path.join(home_dir, '.credentials')
    if not os.path.exists(credential_dir):
        os.makedirs(credential_dir)
    credential_path = os.path.join(credential_dir, 'calendar-python-quickstart.json')

    store = Storage(credential_path)
    credentials = store.get()
    if not credentials or credentials.invalid:
        flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
        flow.user_agent = APPLICATION_NAME
        if flags:
            credentials = tools.run_flow(flow, store, flags)
        else: # Needed only for compatibility with Python 2.6
            credentials = tools.run(flow, store)
        print('Storing credentials to ' + credential_path)
    return credentials

def main():
    """Shows basic usage of the Google Calendar API.

    Creates a Google Calendar API service object and outputs a list of the next
    10 events on the user's calendar.
    """
    credentials = get_credentials()
    http = credentials.authorize(httplib2.Http())
    service = discovery.build('calendar', 'v3', http=http)

    now = datetime.datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time
    print('Getting the upcoming 10 events')
    eventsResult = service.events().list(
        calendarId='primary', timeMin=now, maxResults=10, singleEvents=True,
        orderBy='startTime').execute()
    events = eventsResult.get('items', [])

    if not events:
        print('No upcoming events found.')
    for event in events:
        start = event['start'].get('dateTime', event['start'].get('date'))
        print(start, event['summary'])
    event = {
        'summary': 'Google I/O 2015',
        'location': '800 Howard St., San Francisco, CA 94103',
        'description': 'A chance to hear more about Google\'s developer products.',
        'start': {
            'dateTime': '2017-03-24T09:00:00-07:00',
            'timeZone': 'America/Los_Angeles',
        },
        'end': {
            'dateTime': '2017-03-24T17:00:00-07:00',
            'timeZone': 'America/Los_Angeles',
        },
        'recurrence': [
            'RRULE:FREQ=DAILY;COUNT=2'
        ],
        'attendees': [
            {'email': 'lpage@example.com'},
            {'email': 'sbrin@example.com'},
        ],
        'reminders': {
            'useDefault': False,
            'overrides': [
                {'method': 'email', 'minutes': 24 * 60},
                {'method': 'popup', 'minutes': 10},
            ],
        },
    }

    event = service.events().insert(calendarId='primary', body=event).execute()
    print('Event created: %s' % (event.get('htmlLink')))

if __name__ == '__main__':
    main()

The error is:

Traceback (most recent call last):
  File "D:/cs/projects/googleApi/quickstart.py", line 106, in <module>
    main()
  File "D:/cs/projects/googleApi/quickstart.py", line 102, in main
    event = service.events().insert(calendarId='primary', body=event).execute()
  File "D:\cs\anaconda\lib\site-packages\oauth2client\_helpers.py", line 133, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "D:\cs\anaconda\lib\site-packages\googleapiclient\http.py", line 840, in execute
    raise HttpError(resp, content, uri=self.uri)
googleapiclient.errors.HttpError: <HttpError 403 when requesting https://www.googleapis.com/calendar/v3/calendars/primary/events?alt=json returned "Insufficient Permission">

I am new in google API. I found some similar questions but they were for gmail or other services but no calendar. What could be possible solutions for the error. Can please anyone help on this?

Linda Lawton - DaImTo
  • 106,405
  • 32
  • 180
  • 449
M Alam Telot
  • 367
  • 3
  • 9

5 Answers5

5

You have authenticated with the following scope

'https://www.googleapis.com/auth/calendar.readonly'

This scope allows for read only access only you don't have permission to insert use this one instead.

https://www.googleapis.com/auth/calendar

Remember to delete any stored credentials and log the user in again with the new scope.

Linda Lawton - DaImTo
  • 106,405
  • 32
  • 180
  • 449
  • @MAlamTelot did you reconnect the user after that? If your user only had the `readonly` scope and you then extended it, you have to reset the user for the changes to happen. – gdvalderrama Sep 19 '17 at 16:39
1

My initial guess is that you need to generate a new access token after changing the scope. If you need more info on how google calendar uses Oauth2, I have contributed an answer to a similar question.

Pard
  • 116
  • 3
  • 11
1

The actual solution here is to use:

SCOPES = 'https://www.googleapis.com/auth/calendar'

And then following the comment:

# If modifying these scopes, delete your previously saved credentials
# at ~/.credentials/calendar-python-quickstart.json

By going into '~/.credentials/' and deleting the file 'calendar-python-quickstart.json'

-1

I had the same issue but solved as follow:

As @DalmTo mentioned as a comment, you have to delete the client_secret.json file in the .credentials folder after changing the scope from https://www.googleapis.com/auth/calendar.readonly to https://www.googleapis.com/auth/calendar.

anothernode
  • 5,100
  • 13
  • 43
  • 62
Park
  • 2,446
  • 1
  • 16
  • 25
-1

Follow below steps and have the issue fixed for sure.

  1. Delete token.pickle file from system.
  2. Rerun the code
Wai Ha Lee
  • 8,598
  • 83
  • 57
  • 92