Как интегрировать календарь google в мой сайт?

Я пытаюсь получить доступ и показать google календарь любого пользователя (после входа) на моем сайте, используя django. Пользователь может изменить календарь с сайта и это должно быть видно в календаре google. Я не хочу делать календарь пользователя публичным. (Ref)

Вот что я сделал.

def connect_google_api():
    creds = None
    if os.path.exists('token.json'):
        creds = Credentials.from_authorized_user_file('token.json')
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file('credentials2.json',SCOPES)
            creds = flow.run_local_server(port=0)
        
        with open('token.json','w') as token:
            token.write(creds.to_json())
    
    service = build('calendar','v3',credentials=creds)

    now = datetime.datetime.utcnow().isoformat()+'Z'
    
    page_token = None
    calendar_ids = []
    while True:
        calendar_list = service.calendarList().list(pageToken=page_token).execute()
        for calendar_list_entry in calendar_list['items']:
            print(calendar_list_entry['id'])
            if "myorganization" in calendar_list_entry['id']:
                # print(calendar_list_entry['id'])
                calendar_ids.append(calendar_list_entry['id'])
        page_token = calendar_list.get('nextPageToken')
        if not page_token:
            break
    
    print(calendar_ids)

    for calendar_id in calendar_ids:
        count = 0
        print(calendar_id)
        eventsResult = service.events().list(
            calendarId = calendar_id,
            timeMin = now,
            maxResults = 5,
            singleEvents = True,
            orderBy = 'startTime').execute()
        events = eventsResult.get('items',[])
        # return calendar_ids,events
        response = JsonResponse(events,safe=False)
        # print(eventsResult)
        
        if not events:
            print('No upcoming events found')
        # print(events)
        print("-----------------------------------")

Мне удается получить все события из календаря пользователя. Теперь я хочу показать этот календарь пользователю. Я пытаюсь показать эти события, используя FullCalendar.

document.addEventListener('DOMContentLoaded', function () {
      var calendarEl = document.getElementById('calendar');
      var currentDate = new Date();
      var day = currentDate.getDate();
      var month = currentDate.getMonth() + 1;
      var year = currentDate.getFullYear();
      current_date = year + "-" + month + "-" + day;
      console.log(currentDate);
      var calendar = new FullCalendar.Calendar(calendarEl, {
        initialView: 'dayGridMonth',
        initialDate: currentDate,
        headerToolbar: {
          left: 'prev,next today',
          center: 'title',
          right: 'dayGridMonth,timeGridWeek,timeGridDay'
        },
        events: [
          {

          },

        ]
      });

      calendar.render();
    });


события, которые у меня есть, в этом формате, который не работает в FullCalendar. Я хочу получить предложение по отображению календаря google на моем сайте с помощью этих событий, которые могут или не могут включать FullCalendar.

events:

{
    'kind': 'calendar#event',
    'etag': '"1234567"',
    'id': '5c3b0081234567Z',
    'status': 'confirmed',
    'htmlLink': 'https://www.google.com/calendar/event?eid=123456',
    'created': 'datetime',
    'updated': 'datetime',
    'summary': 'Meetings',
    'creator': {
        'email': 'somemail@gmail.com'
    },
    'organizer': {
        'email': 'somemail@gmail.com'
    },
    'start': {
        'dateTime': 'datetime',
        'timeZone': 'timezone'
    },
    'end': {
        'dateTime': 'datetime',
        'timeZone': 'timezone'
    },
    'recurringEventId': 'oidsvnsodincso',
    'originalStartTime': {
        'dateTime': 'date time',
        'timeZone': 'timezone'
    },
    'iCalUID': 'soivnvndifuvn@google.com',
    'sequence': 0,
    'attendees': [{
        'email': 'somemail@gmail.com',
        'organizer': True,
        'responseStatus': 'accepted'
    }, {
        'email': 'mymail@gmail.com',
        'self': True,
        'responseStatus': 'needsAction'
    }],
    'hangoutLink': 'somelink',
    'conferenceData': {
        'createRequest': {
            'requestId': 'odivnodvinsodn',
            'conferenceSolutionKey': {
                'type': 'hangoutsMeet'
            },
            'status': {
                'statusCode': 'success'
            }
        },
        'entryPoints': [{
            'entryPointType': 'video',
            'uri': 'somelink',
            'label': 'somelabel'
        }, {
            'entryPointType': 'more',
            'uri': 'https://somelink',
            'pin': '1234567'
        }, {
            'regionCode': 'CountryCode',
            'entryPointType': 'phone',
            'uri': 'tel:+1234567',
            'label': '+1234567',
            'pin': '1234567'
        }],
        'conferenceSolution': {
            'key': {
                'type': 'hangoutsMeet'
            },
            'name': 'Google Meet',
            'iconUri': 'https://somefont.png'
        },
        'conferenceId': 'iodviduv',
        'signature': 'sivbuvbdufv'
    },
    'reminders': {
        'useDefault': True
    },
    'eventType': 'default'
}

То, что вы хотите сделать, невозможно. API google calendar даст вам программный доступ к данным, лежащим в основе сайта Google calendar. Ответ возвращается в формате JSon. Вам нужно будет самостоятельно отформатировать его отображение.

Если рассматриваемый календарь хранится в Google Workspace, то вы можете использовать учетную запись службы для доступа к нему, но только к данным. Отображение все равно придется делать вам, так как сервисные аккаунты позволяют только программный доступ к данным

Если вы хотите, чтобы кто-то мог просматривать календарь в веб-приложении google calendar, то календарь должен быть общедоступным или вы должны предоставить им доступ к нему. Если календарь просто установлен на public, то у них будет доступ только для чтения, и они не смогут ничего изменить.

Вернуться на верх