Reputation: 367
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': '[email protected]'},
{'email': '[email protected]'},
],
'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?
Upvotes: 1
Views: 5817
Reputation: 116868
You have authenticated with the following scope
This scope allows for read only access only you don't have permission to insert use this one instead.
Remember to delete any stored credentials and log the user in again with the new scope.
Upvotes: 5
Reputation: 110
Follow below steps and have the issue fixed for sure.
Upvotes: -1
Reputation: 2484
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
.
Upvotes: -1
Reputation:
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'
Upvotes: 1
Reputation: 116
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.
Upvotes: 1