Добрый день.Alexander Znamensky писал(а): ↑Вс авг 30, 2020 3:36 pmДобрый день, уважаемый Fandaymon! Спасибо Вам за помощь, советы и разъяснения. Все сделал, настроил, все прекрасно работает!fandaymon писал(а): ↑Пн авг 17, 2020 11:11 pmМожно попробовать не добавлять сразу в календарь, а вывести сначала на экран, чтобы посмотреть что именно считывается. + обязательно добавить проверку на существование такой записи в календаре. Чтобы не добавлять каждый раз, когда запускается сценарийAlexander Znamensky писал(а): ↑Пн авг 17, 2020 10:50 pm
Спасибо. Вроде бы суточный диапазон указал, как у Вас а примере. Я его сейчас раздвинул до 3 дней.
Но в основной календарь все равно ничего не залетает.....
Хотя из Google calendar данные начали приходить.....
Для тех, кто, как и я, не очень разбирается в тонкостях php, как и обещал, выкладываю пошаговую инструкцию (все сделано исключительно по рекомендациям Fandaymona - моей заслуги никакой).
1. Делаем сервисный аккаунт. По ссылке https://console.cloud.google.com создаем новый проект - Create project, даем ему имя, создаем Service account, называем его (например, Google synchroinisation), Role – owner, DONE. Видим созданный сервисный e-mail.Проваливаемся в сервисный e-mail (его нужно будет тоже скопировать и потом добавить в скрипт), Add key – добавляем ключ JSON. Json (это файл) сохраняем, например, в /home/pi/. Это позволит авторизоваться в Гугле используя файл, вместо временных токенов.СпойлерПоказатьgoogle.pngService account.pngСпойлерПоказатьgoogle2.png2. Далее, идем в свой Гугл-календарь https://calendar.google.com/calendar/r?tab=rc – настройка – настройка моих календарей – разрешения на доступ. Даем доступ нашему сервисному аккаунту (в доступе для отдельных пользователей добавляем свой сервисный e-mail, который был скопирован).СпойлерПоказатьjson.png3. Скачиваем новую библиотеку https://github.com/googleapis/google-api-php-client. Распаковываем и копируем, например, в /var/www/html/modules/.СпойлерПоказатьgoogle3.png
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';Все, наслаждаемся обновлением календаря (я сделал под себя: 20 задач в день, синхронизация событий на предстоящий день в 00-00 часов). Естественно, можно все исправить под себя.Код: Выделить всё
//Источники: //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();
Еще лайф-хак – у меня рабочая почта из outlook синхронизируется с Гугл-календарем используя приложение для Винды gSyncit.
Таким образом получаем утром напоминание из МДМ о всех делах на сегодня (и личные и рабочие).
Говорим спасибо Ивану и Fandaymonу.
Всем удачи!
СпойлерПоказатьscript.php.rar
Подскажите пожалуйста, этот script.php.txt надо сохранить в какую-нибудь директорию под именем script.php и запустить в браузере, или это текст для сценария в mjdm? На самом деле я и то и то попробовал, ошибок не выдает, но данные не подтягиваются в календарь. Как можно задебажить?