fandaymon писал(а): ↑Пн авг 17, 2020 11:11 pm
Alexander Znamensky писал(а): ↑Пн авг 17, 2020 10:50 pm
Спасибо. Вроде бы суточный диапазон указал, как у Вас а примере. Я его сейчас раздвинул до 3 дней.
Но в основной календарь все равно ничего не залетает.....
Хотя из Google calendar данные начали приходить.....
Можно попробовать не добавлять сразу в календарь, а вывести сначала на экран, чтобы посмотреть что именно считывается. + обязательно добавить проверку на существование такой записи в календаре. Чтобы не добавлять каждый раз, когда запускается сценарий
Добрый день, уважаемый Fandaymon! Спасибо Вам за помощь, советы и разъяснения. Все сделал, настроил, все прекрасно работает!
Для тех, кто, как и я, не очень разбирается в тонкостях php, как и обещал, выкладываю пошаговую инструкцию (все сделано исключительно по рекомендациям Fandaymona - моей заслуги никакой).
1. Делаем сервисный аккаунт. По ссылке
https://console.cloud.google.com создаем новый проект - Create project, даем ему имя, создаем Service account, называем его (например, Google synchroinisation), Role – owner, DONE. Видим созданный сервисный e-mail.
- google.png (414.67 КБ) 3298 просмотров
- Service account.png (450.2 КБ) 3318 просмотров
Проваливаемся в сервисный e-mail (его нужно будет тоже скопировать и потом добавить в скрипт), Add key – добавляем ключ JSON. Json (это файл) сохраняем, например, в /home/pi/. Это позволит авторизоваться в Гугле используя файл, вместо временных токенов.
- Service e-mail
- google2.png (410.65 КБ) 3319 просмотров
- Json
- json.png (125.78 КБ) 3319 просмотров
2. Далее, идем в свой Гугл-календарь
https://calendar.google.com/calendar/r?tab=rc – настройка – настройка моих календарей – разрешения на доступ. Даем доступ нашему сервисному аккаунту (в доступе для отдельных пользователей добавляем свой сервисный e-mail, который был скопирован).
- Google calendar
- google3.png (403.75 КБ) 3319 просмотров
3. Скачиваем новую библиотеку
https://github.com/googleapis/google-api-php-client. Распаковываем и копируем, например, в /var/www/html/modules/.
4. Если будете использовать скрипт Fandaymona, исправьте кавычки в строке $client->setApplicationName(‘TestCalendarAPI’); Также имейте ввиду, что модуль Ивана Google Calendar использует старую библиотеку Гугла, поэтому в скрипте делаем обращение к новой библиотеке, не перепутайте, а то будут сыпаться ошибки при выполнении скрипта.
5. Далее, правим скрипт:
- убеждаемся, что путь к нашей новой библиотеке прописан верно: require_once '/var/www/html/modules/google-api-php-client/vendor/autoload.php';
- проверяем, что json доступен для пользователя МДМ и находится в /home/pi/;
- указываем ID своего календаря – он совпадает с вашим e-mail $calendarId = '
e-mail@gmail.com';
Код: Выделить всё
//Источники:
//https://mjdm.ru/forum/viewtopic.php?f=5&t=34&start=290#p96440
//https://github.com/googleapis/google-api-php-client
//https://cloud.google.com/docs/authentication/production#auth-cloud-implicit-php
//Скачиваем и распаковываем папку google-api-php-client с google-api-php-client
//Делаем сервисный аккаунт
//Календарь с задачами расшаривается для этого аккаунта
//Создаём json для авторизации от сервисного аккаунта
//Помещаем json на сервер (например, в /var/www/html/)
//Раз в день (или чаще) считываются задачи из гугл-календаря и записываются в МДМ
//Тут надо поставить правильный путь до файла autoload.php из новой библиотеки:
//include your composer dependencies
require_once '/var/www/html/modules/google-api-php-client/vendor/autoload.php';
//Здесь полный путь и название json:
//Set the path to these credentials using the GOOGLE_APPLICATION_CREDENTIALS environment variable:
putenv('GOOGLE_APPLICATION_CREDENTIALS=/home/pi/google_calendar.json');
//Tell the Google client to use your service account credentials to authenticate:
$client = new Google_Client();
$client->useApplicationDefaultCredentials();
//Set the scopes required for the API you are going to call
$client->setApplicationName('TestCalendarAPI');
$client->setScopes('https://www.googleapis.com/auth/calendar');
$service = new Google_Service_Calendar($client);
// Берём 20 задач за сегодня
$calendarId = 'e-mail@gmail.com'; // id основного календаря совпадает с е-мейлом
$optParams = array(
'maxResults' => 20,
'orderBy' => 'startTime',
'singleEvents' => TRUE,
'timeMin' => date('Y-m-d',strtotime('today')) .'T00:00:00+03:00',
'timeMax' => date('Y-m-d',strtotime('+1 day')) .'T00:00:00+03:00',
);
//удаляем записи из базы
$dateMin = date('Y-m-d',strtotime('today'));
$dateMax = date('Y-m-d',strtotime('+1 day'));
SQLExec("DELETE FROM calendar_events WHERE DUE='".$dateMin."' AND CALENDAR_CATEGORY_ID=20");
SQLExec("DELETE FROM calendar_events WHERE DUE='".$dateMax."' AND CALENDAR_CATEGORY_ID=20");
$results = $service->events->listEvents($calendarId, $optParams);
if (count($results->getItems()) > 0)
{
foreach ($results->getItems() as $event)
{
$rec=array();
$rec['TITLE']=$event->getSummary();
// Notes
$notes = $event->getDescription();
if ($notes){
$rec['NOTES'] = $event->getDescription();
}
// DUE
$due = $event->getStart();
if ($due) {
if ($due['dateTime']){
$rec['DUE'] = date('Y-m-d H:i:s', strtotime( $due['dateTime'] ));
} else if ($due['date']){
$rec['DUE'] = date('Y-m-d H:i:s', strtotime( $due['date'] ));
} else {
$RESULT_LOG[] = "Invalid start date :".print_r($due, true);
}
}
// DONE_WHEN
$done_when = $event->getEnd();
if ($done_when) {
if ($done_when['dateTime']){
$rec['DONE_WHEN'] = date('Y-m-d H:i:s', strtotime( $done_when['dateTime'] ));
} else if ($done_when['date']){
$rec['DONE_WHEN'] = date('Y-m-d H:i:s', strtotime( $done_when['date'] ));
} else {
$RESULT_LOG[] = "Invalid end date :".print_r($done_when, true);
}
}
$rec['CALENDAR_CATEGORY_ID']=20;
$rec['IS_TASK']=0; //1-Задача, 0-Событие
// ADDED
$added = $event->getCreated();
if ($added) {
$rec['ADDED'] = date('Y-m-d H:i:s', strtotime( $added ));
}
$rec['ID']=SQLInsert('calendar_events', $rec);
// echo json_encode($rec).'<br/>\n';
}
}
include_once('./modules/app_calendar/app_calendar.class.php');
$calendar = new app_calendar();
$calendar->calendar_getholidays();
Все, наслаждаемся обновлением календаря (я сделал под себя: 20 задач в день, синхронизация событий на предстоящий день в 00-00 часов). Естественно, можно все исправить под себя.
Еще лайф-хак – у меня рабочая почта из outlook синхронизируется с Гугл-календарем используя приложение для Винды
gSyncit.
Таким образом получаем утром напоминание из МДМ о всех делах на сегодня (и личные и рабочие).
Говорим спасибо Ивану и Fandaymonу.
Всем удачи!