использование учетной записи службы Google для создания общедоступного календаря

#google-api #calendar #google-calendar-api

#google-api #Календарь #google-calendar-api

Вопрос:

Я пытался использовать учетную запись службы Google для создания общедоступного календаря, а затем вставить в него некоторые события.

Убедившись, что события являются общедоступными ( 'visibility': 'public' ) Я все еще не мог получить к ним доступ. Затем я прочитал, что сам календарь должен быть общедоступным, но в документации Google нет параметра для insert функции нового календаря, который позволяет создавать его как общедоступный календарь (документы).

Вот небольшой класс утилит, который я написал для этого:

 import json

from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from google.oauth2 import service_account


class CalendarUtils:
    SCOPES = ['https://www.googleapis.com/auth/calendar']
    SERVICE_ACCOUNT_FILE = 'token.json'
    CAL_MAPPING_JSON_PATH = 'calendar_mapping.json'

    def __init__(self):
        creds = service_account.Credentials.from_service_account_file(
            self.SERVICE_ACCOUNT_FILE, scopes=self.SCOPES)
        self.service = build('calendar', 'v3', credentials=creds)
        self.mapping = json.load(open(self.CAL_MAPPING_JSON_PATH))

    def list_all_calendars(self):
        res = self.service.calendarList().list().execute()
        return res['items']

    def create_new_calendar(self, location_name):
        calendar = {
            'summary': location_name,
            'timeZone': 'America/Los_Angeles',
            'visibility': 'public',
        }
        return self.service.calendars().insert(body=calendar).execute()

    def insert_event(self, location_name, event):
        exiting_calendars = [i['name'] for i in self.mapping['map']]
        if location_name not in exiting_calendars:
            calendar_id = self.create_new_calendar(location_name)['id']
            self.mapping['map'].append({'name': location_name, 'calendar_id': calendar_id})
            json.dump(self.mapping, open(self.CAL_MAPPING_JSON_PATH, 'w'))
        else:
            calendar_id = [i for i in self.mapping['map'] if i['name'] == location_name][0]['calendar_id']

        event = self.service.events().insert(calendarId=calendar_id, body=event).execute()
        print(f'Event created: {event.get("htmlLink")}')


if __name__ == '__main__':
    cal_util = CalendarUtils()
    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': '2015-05-28T09:00:00-07:00',
            'timeZone': 'America/Los_Angeles',
        },
        'end': {
            'dateTime': '2015-05-28T17:00:00-07:00',
            'timeZone': 'America/Los_Angeles',
        },
        'visibility': 'public',
        'privateCopy': False,
        'locked': False,
        'anyoneCanAddSelf': True,
    }
    cal_util.insert_event('test', event)
 

При этом создается календарь и вставляется событие, но оно не является общедоступным.

Ответ №1:

Чтобы сделать календарь общедоступным, вам необходимо задать тип области действия списка управления доступом календаря default равным .

Пример:

 rules = {
  "role": "reader",
  "scope": {
    "type": "default",
  }
}
created_rule = service.acl().insert(calendarId='Insert calendar id here', body=rules).execute()
 

Здесь я создал событие внутри календаря, созданного с использованием учетной записи службы, к которому применяется Acl

 eventDetails = {
  'summary': '67407093 test event',
  'location': 'Dummy',
  'description': 'Dummy',
  'start': {
    'dateTime': '2021-05-28T09:00:00-07:00',
    'timeZone': 'America/Los_Angeles',
  },
  'end': {
    'dateTime': '2021-05-28T17:00:00-07:00',
    'timeZone': 'America/Los_Angeles',
  }
}

event = service.events().insert(calendarId='Insert calendar id here', body=eventDetails).execute()
 

Вывод:

введите описание изображения здесь

Ссылка: