Как интегрировать календарь 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, то у них будет доступ только для чтения, и они не смогут ничего изменить.