Forked from nikhilkumarsingh/google_calendar_api_integration.ipynb
Created
December 31, 2021 05:17
-
-
Save jjackofall/ad6133b51479d51a76c2c2250e6a821a to your computer and use it in GitHub Desktop.
Integrating Google Calendar API in Python Projects
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Integrating Google Calendar API in Python Projects\n", | |
| "\n", | |
| "\n", | |
| "\n", | |
| "- [Google Calendar](https://calendar.google.com)\n", | |
| "\n", | |
| "- [Google Calendar API](https://developers.google.com/calendar/)\n", | |
| "\n", | |
| "- [Google Developers Console](https://console.developers.google.com/)\n", | |
| "\n", | |
| "- [Google Calendar API Scopes](https://developers.google.com/calendar/auth)\n", | |
| "\n", | |
| "- [Google Calendar API Reference](https://developers.google.com/calendar/v3/reference/)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Installation\n", | |
| "\n", | |
| "```\n", | |
| "pip install google-api-python-client\n", | |
| "```" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## OAuth 2.0 Setup" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 1, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "from apiclient.discovery import build\n", | |
| "from google_auth_oauthlib.flow import InstalledAppFlow" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 2, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "scopes = ['https://www.googleapis.com/auth/calendar']" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "flow = InstalledAppFlow.from_client_secrets_file(\"client_secret.json\", scopes=scopes)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "credentials = flow.run_console()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 3, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "import pickle" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "pickle.dump(credentials, open(\"token.pkl\", \"wb\"))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 4, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "credentials = pickle.load(open(\"token.pkl\", \"rb\"))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 5, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "service = build(\"calendar\", \"v3\", credentials=credentials)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Get My Calendars" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 6, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "result = service.calendarList().list().execute()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 7, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "{'kind': 'calendar#calendarListEntry',\n", | |
| " 'etag': '\"1557422762384000\"',\n", | |
| " 'id': '[email protected]',\n", | |
| " 'summary': '[email protected]',\n", | |
| " 'timeZone': 'Asia/Kolkata',\n", | |
| " 'colorId': '14',\n", | |
| " 'backgroundColor': '#9fe1e7',\n", | |
| " 'foregroundColor': '#000000',\n", | |
| " 'selected': True,\n", | |
| " 'accessRole': 'owner',\n", | |
| " 'defaultReminders': [{'method': 'popup', 'minutes': 30}],\n", | |
| " 'notificationSettings': {'notifications': [{'type': 'eventCreation',\n", | |
| " 'method': 'email'},\n", | |
| " {'type': 'eventChange', 'method': 'email'},\n", | |
| " {'type': 'eventCancellation', 'method': 'email'},\n", | |
| " {'type': 'eventResponse', 'method': 'email'}]},\n", | |
| " 'primary': True,\n", | |
| " 'conferenceProperties': {'allowedConferenceSolutionTypes': ['eventHangout']}}" | |
| ] | |
| }, | |
| "execution_count": 7, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "result['items'][0]" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Get My Calendar Events" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 8, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "calendar_id = result['items'][0]['id']" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 9, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "result = service.events().list(calendarId=calendar_id, timeZone=\"Asia/Kolkata\").execute()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 10, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "{'kind': 'calendar#event',\n", | |
| " 'etag': '\"3114856233680000\"',\n", | |
| " 'id': '0slqq110a9171scjmrfojjquse',\n", | |
| " 'status': 'confirmed',\n", | |
| " 'htmlLink': 'https://www.google.com/calendar/event?eid=MHNscXExMTBhOTE3MXNjam1yZm9qanF1c2UgaW5kaWFucHl0aG9uaXN0YUBt&ctz=Asia/Kolkata',\n", | |
| " 'created': '2019-05-09T18:55:16.000Z',\n", | |
| " 'updated': '2019-05-09T18:55:16.840Z',\n", | |
| " 'summary': 'Meeting',\n", | |
| " 'creator': {'email': '[email protected]', 'self': True},\n", | |
| " 'organizer': {'email': '[email protected]', 'self': True},\n", | |
| " 'start': {'dateTime': '2019-05-05T02:30:00+05:30'},\n", | |
| " 'end': {'dateTime': '2019-05-05T03:30:00+05:30'},\n", | |
| " 'iCalUID': '[email protected]',\n", | |
| " 'sequence': 0,\n", | |
| " 'extendedProperties': {'private': {'everyoneDeclinedDismissed': '-1'}},\n", | |
| " 'reminders': {'useDefault': True}}" | |
| ] | |
| }, | |
| "execution_count": 10, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "result['items'][0]" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Create a New Calandar Event" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 11, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "from datetime import datetime, timedelta" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 12, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "start_time = datetime(2019, 5, 12, 19, 30, 0)\n", | |
| "end_time = start_time + timedelta(hours=4)\n", | |
| "timezone = 'Asia/Kolkata'" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 13, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "event = {\n", | |
| " 'summary': 'IPL Final 2019',\n", | |
| " 'location': 'Hyderabad',\n", | |
| " 'description': 'MI vs TBD',\n", | |
| " 'start': {\n", | |
| " 'dateTime': start_time.strftime(\"%Y-%m-%dT%H:%M:%S\"),\n", | |
| " 'timeZone': timezone,\n", | |
| " },\n", | |
| " 'end': {\n", | |
| " 'dateTime': end_time.strftime(\"%Y-%m-%dT%H:%M:%S\"),\n", | |
| " 'timeZone': timezone,\n", | |
| " },\n", | |
| " 'reminders': {\n", | |
| " 'useDefault': False,\n", | |
| " 'overrides': [\n", | |
| " {'method': 'email', 'minutes': 24 * 60},\n", | |
| " {'method': 'popup', 'minutes': 10},\n", | |
| " ],\n", | |
| " },\n", | |
| "}" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 14, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "{'kind': 'calendar#event',\n", | |
| " 'etag': '\"3114964833447000\"',\n", | |
| " 'id': 'advb4ftvjbivf7jaru9g1dbp5s',\n", | |
| " 'status': 'confirmed',\n", | |
| " 'htmlLink': 'https://www.google.com/calendar/event?eid=YWR2YjRmdHZqYml2ZjdqYXJ1OWcxZGJwNXMgaW5kaWFucHl0aG9uaXN0YUBt',\n", | |
| " 'created': '2019-05-10T10:00:16.000Z',\n", | |
| " 'updated': '2019-05-10T10:00:16.759Z',\n", | |
| " 'summary': 'IPL Final 2019',\n", | |
| " 'description': 'MI vs TBD',\n", | |
| " 'location': 'Hyderabad',\n", | |
| " 'creator': {'email': '[email protected]', 'self': True},\n", | |
| " 'organizer': {'email': '[email protected]', 'self': True},\n", | |
| " 'start': {'dateTime': '2019-05-12T19:30:00+05:30',\n", | |
| " 'timeZone': 'Asia/Kolkata'},\n", | |
| " 'end': {'dateTime': '2019-05-12T23:30:00+05:30', 'timeZone': 'Asia/Kolkata'},\n", | |
| " 'iCalUID': '[email protected]',\n", | |
| " 'sequence': 0,\n", | |
| " 'reminders': {'useDefault': False,\n", | |
| " 'overrides': [{'method': 'email', 'minutes': 1440},\n", | |
| " {'method': 'popup', 'minutes': 10}]}}" | |
| ] | |
| }, | |
| "execution_count": 14, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "service.events().insert(calendarId=calendar_id, body=event).execute()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Utility function\n", | |
| "\n", | |
| "```\n", | |
| "pip install datefinder\n", | |
| "```" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 15, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "import datefinder" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 16, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "matches = datefinder.find_dates(\"5 may 9 PM\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 17, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "[datetime.datetime(2019, 5, 5, 21, 0)]" | |
| ] | |
| }, | |
| "execution_count": 17, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "list(matches)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 18, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def create_event(start_time_str, summary, duration=1, description=None, location=None):\n", | |
| " matches = list(datefinder.find_dates(start_time_str))\n", | |
| " if len(matches):\n", | |
| " start_time = matches[0]\n", | |
| " end_time = start_time + timedelta(hours=duration)\n", | |
| " \n", | |
| " event = {\n", | |
| " 'summary': summary,\n", | |
| " 'location': location,\n", | |
| " 'description': description,\n", | |
| " 'start': {\n", | |
| " 'dateTime': start_time.strftime(\"%Y-%m-%dT%H:%M:%S\"),\n", | |
| " 'timeZone': 'Asia/Kolkata',\n", | |
| " },\n", | |
| " 'end': {\n", | |
| " 'dateTime': end_time.strftime(\"%Y-%m-%dT%H:%M:%S\"),\n", | |
| " 'timeZone': 'Asia/Kolkata',\n", | |
| " },\n", | |
| " 'reminders': {\n", | |
| " 'useDefault': False,\n", | |
| " 'overrides': [\n", | |
| " {'method': 'email', 'minutes': 24 * 60},\n", | |
| " {'method': 'popup', 'minutes': 10},\n", | |
| " ],\n", | |
| " },\n", | |
| " }\n", | |
| " return service.events().insert(calendarId='primary', body=event).execute()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 19, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "{'kind': 'calendar#event',\n", | |
| " 'etag': '\"3114964858585000\"',\n", | |
| " 'id': '43rehpareejd6nm44u8upvsir8',\n", | |
| " 'status': 'confirmed',\n", | |
| " 'htmlLink': 'https://www.google.com/calendar/event?eid=NDNyZWhwYXJlZWpkNm5tNDR1OHVwdnNpcjggaW5kaWFucHl0aG9uaXN0YUBt',\n", | |
| " 'created': '2019-05-10T10:00:29.000Z',\n", | |
| " 'updated': '2019-05-10T10:00:29.322Z',\n", | |
| " 'summary': 'Meeting',\n", | |
| " 'creator': {'email': '[email protected]', 'self': True},\n", | |
| " 'organizer': {'email': '[email protected]', 'self': True},\n", | |
| " 'start': {'dateTime': '2019-05-15T21:00:00+05:30',\n", | |
| " 'timeZone': 'Asia/Kolkata'},\n", | |
| " 'end': {'dateTime': '2019-05-15T22:00:00+05:30', 'timeZone': 'Asia/Kolkata'},\n", | |
| " 'iCalUID': '[email protected]',\n", | |
| " 'sequence': 0,\n", | |
| " 'reminders': {'useDefault': False,\n", | |
| " 'overrides': [{'method': 'email', 'minutes': 1440},\n", | |
| " {'method': 'popup', 'minutes': 10}]}}" | |
| ] | |
| }, | |
| "execution_count": 19, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "create_event(\"15 may 9 PM\", \"Meeting\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [] | |
| } | |
| ], | |
| "metadata": { | |
| "kernelspec": { | |
| "display_name": "Python 3", | |
| "language": "python", | |
| "name": "python3" | |
| }, | |
| "language_info": { | |
| "codemirror_mode": { | |
| "name": "ipython", | |
| "version": 3 | |
| }, | |
| "file_extension": ".py", | |
| "mimetype": "text/x-python", | |
| "name": "python", | |
| "nbconvert_exporter": "python", | |
| "pygments_lexer": "ipython3", | |
| "version": "3.6.7" | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 2 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment