Partage
  • Partager sur Facebook
  • Partager sur Twitter

Google calendar API

Sujet résolu
    18 mai 2021 à 12:02:34

    Bonjour tout le monde !

    j'essaye de faire fonctionner cette fichu API google calendar, mais voilà, j'ai appris au bout de plusieurs jours de galère que la doc Google est périmée, je comprends donc mieux pourquoi c'est si compliqué, mais je ne sais pas à quoi je peux me fier o_O

    Voici ce que je pensais être un début de code, mais voilà, ca ne fonctionne pas, j'ai l'erreur suivante : 

    "error": { "code": 403, "message": "The request is missing a valid API key.", "errors": [ { "message": "The request is missing a valid API key.", "domain": "global", "reason": "forbidden" } ], "status": "PERMISSION_DENIED" }

    function getClient() {
    
    	$client = new Google_Client();
    
        $client->setApplicationName('Google Calendar API PHP Quickstart');
    
        $client->setScopes(Google_Service_Calendar::CALENDAR);
    
        $client->setAuthConfig('components/com_gixbooking/google-api/client_secret.json');
    
        $client->setAccessType('offline');
    
        $client->setPrompt('select_account consent');
    
        return $client;
    
    }
    
    
    
    	
    
    $client = getClient();
    
    $service = new Google_Service_Calendar($client);
    
    
    
    $calendarId = 'uljgsndmm95vj631ugd16coac8@group.calendar.google.com';
    
    $optParams = array(
    
      'maxResults' => 10,
    
      'orderBy' => 'startTime',
    
      'singleEvents' => true,
    
      'timeMin' => date('c'),
    
    );
    
    $results = $service->events->listEvents($calendarId, $optParams);
    
    $events = $results->getItems();
    
    
    
    if (empty($events)) {
    
        print "No upcoming events found.\n";
    
    } else {
    
        print "Upcoming events:\n";
    
        foreach ($events as $event) {
    
            $start = $event->start->dateTime;
    
            if (empty($start)) {
    
                $start = $event->start->date;
    
            }
    
            printf("%s (%s)\n", $event->getSummary(), $start);
    
        }
    
    }

    Je précise bien sûr que j'ai créé des identifiants valides sur la console Google, qui sont regroupé dans le fichier 'client_secret.json' ci dessous, et que le chemin est testé et approuvé.

    {"web":{"client_id":"797132088454-9p740okt76m1n8gta0i7lq92olup28pv.apps.googleusercontent.com","project_id":"data-air-146107","auth_uri":"https://accounts.google.com/o/oauth2/auth","token_uri":"https://oauth2.googleapis.com/token","auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs","client_secret":"MA_CLE","redirect_uris":["https://SITE.fr"]}}

    (SITE et MA_CLE sont bien sur remplacés dans mon vrai code)

    Pitié, si quelqu'un arrive à se servir de cette API, plz, partagez des infos récentes pour le plus grand bonheur de pas mal de monde qui cherche sur le net :ange:

    -
    Edité par KissCòól 18 mai 2021 à 12:06:31

    • Partager sur Facebook
    • Partager sur Twitter
      18 mai 2021 à 12:17:17

      Salut,

      Utilises bien la dernière version de la lib Google Client, moi je l'utilise de la sorte:

      // cette constante contient le path du fichier json
      putenv('GOOGLE_APPLICATION_CREDENTIALS='.CREDENTIALS);
      
      // Google Service Account Authentification
      $client = new Google\Client();
      $client->useApplicationDefaultCredentials();
      $client->addScope(Google_Service_Calendar::CALENDAR);
      $client->setScopes(Google_Service_Calendar::CALENDAR_READONLY);
      
      // Main
      $timeMin 	= date(DATE_RFC3339, strtotime('-90 days'));
      $timeMax 	= date(DATE_RFC3339);
      $service 	= new Google_Service_Calendar($client);
      $optParams 	= array(
      	'maxResults' 	=> 50,
      	'orderBy' 		=> 'startTime',
      	'singleEvents'	=> TRUE,
      	'timeMin'		=> $timeMin,
      	'timeMax'		=> $timeMax
      );

      Vérifie bien que ton client à le droit d'accèder à l'API Calendar sinon tu auras toujours une erreur (via la console Google).

      • Partager sur Facebook
      • Partager sur Twitter
        18 mai 2021 à 18:01:42

        Merci beaucoup d'avoir répondu, je me sens moins seul 

        J'ai vérifié que mon client ai bien le droit d'accéder à l'API calendar, il ne me semble pas avoir fait d'erreurs de ce coté là d'après mon screen ci dessous

        c'est ici que je télécharge mon fichier client_secret.json

        Pour ce qui est de la dernière version du client j'ai pris la 7.4 sur cette page https://github.com/googleapis/google-api-php-client/releases car il m'a semblé bizarre qu'il y ai une version 8.0 alors que php en est à 7.4, j'ai essayé les deux

        je me suis donc inspirée de ton code, j'ai rajouté la fin, juste les 2 dernières lignes qui posent problème puisque lorsqu'elles sont commentées, l'erreur ne s'affiche pas, donc ton code fonctionne bien chez moi, c'est juste mes 2 lignes qui posent problème :)

        j'obtiens l'erreur suivante : json key is missing the type field

        j'ai pas mal cherché sur le net, je n'arrive pas à résoudre ce problème :'(

        voici mon code complet :

        require_once 'components/com_gixbooking/google-api/vendor/autoload.php';
        putenv('GOOGLE_APPLICATION_CREDENTIALS=components/com_gixbooking/google-api/credentials.json');
        $calendarId = $params->get('calendar_id');
         
        // Google Service Account Authentification
        $client = new Google\Client();
        $client->useApplicationDefaultCredentials();
        $client->addScope(Google_Service_Calendar::CALENDAR);
        
        // Main
        $service    = new Google_Service_Calendar($client);
        $optParams  = array(
            'maxResults'    => 50,
            'orderBy'       => 'startTime',
            'singleEvents'  => TRUE,
            'timeMin'       => date('Y-m-d', strtotime('-90 days')),
            'timeMax'       => date('Y-m-d')
        );
        
        $results = $service->events->listEvents($calendarId, $optParams);
        $events = $results->getItems();


        Je continue de chercher :euh:

        -
        Edité par KissCòól 18 mai 2021 à 18:21:04

        • Partager sur Facebook
        • Partager sur Twitter
          18 mai 2021 à 18:44:30

          Une question bête, mais est-ce que tu as essayé de lire le fichier json et de faire un dump avec ton PHP juste pour être sûre que ce n'est pas un souci de permissions ?

          Ah et petite différence, mais moi, je n'utilise pas le client OAuth, j'utilise un compte de service Google donc mon json ne ressemble pas à ce que tu as posté et l'authentification ce fait directement (toujours en OAuth) grâce au contenu du fichier, avec le client OAuth, tu dois avoir une redirection sur une page d'authentification puis un callback vers ton script ! Tu as le choix lors de la création des identifiants.

          -
          Edité par xoxotf 18 mai 2021 à 18:46:14

          • Partager sur Facebook
          • Partager sur Twitter
            19 mai 2021 à 9:36:58

            C'est magnifique ! Ca marche ! Merci beaucoup ! :)

            J'ai créé un compte de service puis une clé dans ce compte de service, j'ai juste remplacé le contenu de mon fichier client-secret.json par la nouvelle clé et ca fonctionne.

            Voici mon code final

            require_once 'components/com_gixbooking/google-api/vendor/autoload.php';
            putenv('GOOGLE_APPLICATION_CREDENTIALS=components/com_gixbooking/google-api/credentials.json');
            $calendarId = $params->get('calendar_id');
            
            // Google Service Account Authentification
            $client = new Google\Client();
            $client->useApplicationDefaultCredentials();
            $client->addScope(Google_Service_Calendar::CALENDAR);
            
            // Main
            $timeMin    = date(DATE_RFC3339, strtotime('-90 days'));
            $timeMax    = date(DATE_RFC3339);
            $service    = new Google_Service_Calendar($client);
            $optParams  = array(
                'maxResults'    => 50,
                'orderBy'       => 'startTime',
                'singleEvents'  => TRUE,
                'timeMin'       => $timeMin,
                'timeMax'       => $timeMax
            );
            
            $results = $service->events->listEvents($calendarId, $optParams);
            $events = $results->getItems();

            Il ne me reste plus qu'à démêler la variable $events :)

            Merci encore c'est super !

            • Partager sur Facebook
            • Partager sur Twitter
              19 mai 2021 à 11:40:49

              Pas de soucis, passe ton sujet en résolu si c'est ok pour toi :)
              • Partager sur Facebook
              • Partager sur Twitter

              Google calendar API

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown