Вставка нового события в Календарь Google определенного пользователя (с использованием PHP API) путем запуска сценария php (контроллер CI) в качестве задания cron - PullRequest
1 голос
/ 07 мая 2020

Я разрабатываю небольшое приложение, которое должно обновлять определенные события (судебное слушание) после изменения начальной даты. Пользователь имеет возможность, войдя в свою учетную запись приложения, вручную вставить такое событие в свой Календарь Google. После вставки приложение будет отслеживать любые изменения (по сравнению с API publi c), и как только изменение произойдет, оно обновит базу данных, отправит пользователю электронное письмо, информируя об изменении и вставляя такое новое событие в свой Google Календарь.

Я использую PHP и CodeIgniter 3.11.

Любое изменение ежедневно проверяется на соответствие API publi c, и, очевидно, когда изменение происходит, пользователь не присутствует перед его компьютер. Это делается с помощью задания cron, которое выполняется в определенные часы.

Первоначальная вставка события в Календарь Google пользователя выполняется нормально, как это делает пользователь вручную из браузера. Но у меня проблема с вставкой такого события, когда я запускаю контроллер, предназначенный для отслеживания изменений в cronjob. Я тестирую его на своей собственной учетной записи Gmail.

cronjob работает, поскольку контроллер выполняет две другие задачи (обновление базы данных и отправка электронной почты) без каких-либо проблем. Но обновления календаря никогда не происходит. Календарь обновляется только при повторном запуске контроллера через браузер. Контроллер, выполняющий мониторинг, отвечает за установку URL-адреса oauth и перенаправление на такой URL-адрес. Затем у меня есть другой элемент управления (который стоит за redirect_uri), который должен получать код доступа и состояние.

Я установил тип доступа офлайн, как предлагает документация Google Google PHP Документы API

 $client->setAccessType('offline');

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

Кажется, мне, что при запуске как cronjob контроллер, ответственный за обновление календаря (установленный как redirect_uri в конфигурации клиента google oauth), никогда не достигается. При этом мой вопрос:

  1. Можно ли достичь этого, то есть вставить новое событие в календарь Google пользователя, когда пользователь не присутствует в браузере? Документация Google предполагает такую ​​возможность, но не объясняет подробно, как это сделать. Цитата из документов:

Запрос автономного доступа является требованием для любого приложения, которому требуется доступ к Google API, когда пользователь отсутствует. Например, приложение, которое выполняет услуги резервного копирования или выполняет действия в заранее определенное время, должно иметь возможность обновлять sh свой токен доступа, когда пользователя нет


Является ли мой подход, основанный на использовании токена refre sh, правильным, или мне нужно выполнить другие задачи, чтобы выполнить обновление календаря Google?

Как я могу узнать, что мой контроллер перенаправляет на сервер Google при запуске как cronjob?

Есть ли какой-либо журнал сервера, который может проверить, установлено ли перенаправление в Monitor . php работает? Я проверил логи apache, но ошибок не обнаружено. Журналы codeigniter также не показывают никаких ошибок.

Как я могу узнать, что контроллер, ответственный за обновление, достигается ответом, отправленным сервером Google, у которого есть код доступа? Есть ли способ отладки, если ответ Google достигает контроллера за redirect_uri?

Если у вас есть какие-либо другие предложения о том, как это сделать, добро пожаловать.

Большое спасибо!

Ниже приведены некоторые из моих кодов: Monitor. php (контроллер работает как cronjob)

<?php
defined('BASEPATH') or exit('No direct script access allowed');

/**
 * Class Monitor
 */
class Monitor extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();

        $this->load->helper("utilities", "url");
        $this->load->model("users");
        $this->load->model("files");
        // $this->load->library("portal");
        require_once APPPATH . 'libraries/Portal.php';
        require_once 'vendor/autoload.php';
    }

    public function index()
    {
       if (!is_cli()) {
            return;
        }

        $files_query = $this->files->get_all_files();

        if (is_array($files_query)) {
            $files = array();
            foreach($files_query as $file_query) {
                array_push($files, $file_query['file_number']);
            }
            $files = array_values(array_unique($files));
            //print_r($files);
            foreach ($files as $file) {
                $email_body = "";
                $portal = new Portal($file);
                $portal->set_courtfile_data();
                if (empty($portal->error)) {
                    $court_file = $portal->court_file; //obtaining the court file
                    $termen = $portal->get_last_hearing(); // obtaining the hearing
                    $solutie = $portal->get_solutie(); //obtaining the existing solutions
                    if (is_array($solutie)) {
                        $solutie = $solutie['final'];
                    }
                    $court = $portal->get_court(); //obtaining the court
                    $stadiu = $portal->get_courtfile_stage(); //obtaining the stage
                    if (!$stadiu["apel"]) {
                        $stadiu = $stadiu["stadiu"];
                    } else {
                        $stadiu = $stadiu["apel"];
                    }
        ####--- various checks made against the result retrieve from the public API ---####
        ......
       if ($email_body !== "") {
                $emails = $this->get_user_email($file);
                // Sending the e-mail to the user;

                $template_id = $this->config->item('sendgrid_change_template');
                $dynamic_data = [
                    "file" => $file,
                    "change_body" => $email_body
                ];
                foreach ($emails as $email) {
                    send_grid_email($email, $template_id, $dynamic_data);
                }
                if ($hearing_query) {
                    ###--- function for setting the google auth url ---####
                    $url = $this->set_google_url($court_file); 
                    try {
                        header('Location: ' . $url);
                        //redirect($url);
                    } catch (Exception $e) {
                        log_message('error', $e['message']);
                    }
                }
            }
        } // End of foreach loop
    } else {
        $error = $this->db->error();
        log_message("error", $error["message"]);
    }
}// End of index function

#### -- function used to set the google oauth url ---###
protected function set_google_url($file)
{
    $client = new Google_Client();
    try {
        $client->setAuthConfig(APPPATH . 'credentials.json');
        $client->setApplicationName('Monitor App');
        $client->setRedirectUri($this->config->item('update_calendar_url'));
        $client->setScopes(Google_Service_Calendar::CALENDAR);
        $client->setState($file);
        $client->setAccessType('offline');
        $client->setApprovalPrompt('auto');
        $auth_url = $client->createAuthUrl();
        return filter_var($auth_url, FILTER_SANITIZE_URL);
    } catch (Exception $e) {
        log_message('error', $e['message']);
        return false;
    }

}

Update_google. php (контроллер за redirect_uri)

<?php
    defined('BASEPATH') or exit('No direct script access allowed');

    class Update_google extends CI_Controller
    {
        public function __construct()
        {
            parent::__construct();
            $this->load->helper("utilities");
            $this->load->model(array("files", "users"));
            require_once 'vendor/autoload.php';
        }

        public function index()
        {
            $query = $this->users->get_user_by("[user@gmail.com]", "email");
            if ($query) {

                $refresh_token = $query[0]["refreshToken"];
            }
            try {
                $client = new Google_Client();
                $client->setAuthConfig(APPPATH . 'credentials.json');
                $client->setRedirectUri($this->config->item('update_calendar_url'));

                if (isset($_GET['state']) && isset($_GET['code'])) {
                    $token = $client->fetchAccessTokenWithAuthCode($_GET['code']);
                } else {
                    if ($refresh_token != null) {
                        $token = $client->fetchAccessTokenWithRefreshToken($refresh_token);
                    }
                }

                    $client->setAccessToken($token);
                    $file = filter_var($_GET['state'], FILTER_SANITIZE_STRING);
                    $query = $this->files->get_file_by($file, "file_number");
                    if (is_array($query)) {
                        $service = new Google_Service_Calendar($client);
                        $event = new Google_Service_Calendar_Event(array(
                            'summary' => 'Termen instanță',
                            'location' => $query[0]['court'],
                            'description' => 'Termen în dosarul ' . $query[0]['file_number'],
                            'start' => array(
                                'dateTime' => $query[0]['last_hearing'] . 'T08:30:00',
                                'timeZone' => 'Europe/Bucharest',
                            ),
                            'end' => array(
                                'dateTime' => $query[0]['last_hearing'] . 'T12:00:00',
                                'timeZone' => 'Europe/Bucharest',
                            ),
                        ));
                        $calendarId = 'primary';
                        $service->events->insert($calendarId, $event);
                    }
            } catch (Exception $e) {
                log_message('error', $e['message']);
            }
        }
    }

1 Ответ

0 голосов
/ 25 мая 2020

Я понимаю, что вы хотите создать событие в календаре другого пользователя, используя Calendar API . Я предполагаю, что у вас нет аккаунта G Suite с делегированием всего домена . В этом случае для создания события в календаре другого пользователя требуется учетная запись службы . Вы можете увидеть здесь пример того, как настроить учетные данные в PHP с помощью Calendar API, вам нужно только изменить учетные данные примера на учетные данные из вашей новой учетной записи службы. Для создания события вы можете использовать Events.insert(), но помните, что пользователи должны были ранее предоставить общий доступ к календарю учетной записи службы. После того, как они поделятся своими календарями, вы должны создать их с помощью предыдущего метода, используя идентификаторы календаря. Чтобы пользователи могли найти свои идентификаторы календаря, перейдите на домашнюю страницу Календаря , просмотрев список календарей на Мои календари и щелкнув по правой стороне и ⋮ symbol ⮞ Settings and sharing ⮞ Calendar ID (under "Integrate calendar"). Пожалуйста, спросите меня, если вам понадобится дополнительная помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...