Comment Inter-agir avec Google Agenda ?
Résolu/Ferméemrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 - 26 juil. 2022 à 16:11
- Access_token_scope_insufficient
- Google maps satellite - Guide
- Dns google - Guide
- Synchroniser agenda google et outlook - Guide
- Google agenda pc - Télécharger - Agendas & Calendriers
- Google maps - Guide
10 réponses
26 juil. 2022 à 16:11
22 juil. 2022 à 18:58
Bonjour
Lors du lancement de ton script la première fois il a du te donner un code a ecrire dans la console..
Si tu l'as fait en local, il faut supprimer le token et le régénérer depuis ton site web.
Attention.. l'utilisation de cette api depuis un serveur mutualisé n'est pas garantie... Parfois, l'IP du serveur est bl par google... Et c'est complique de la faire débloquer.
22 juil. 2022 à 19:50
Merci Jordan pour cette mise en garde... Tu me conseilles de laisser tomber ?
En fait, j'aimerai "simplement" que mon formulaire d'enregistrement de contrat de location puisse avec les dates d'entrée et de sortie ajouter une entrée dans Google Agenda...
Quand j'ai lancé la commande php quickstart.php depuis mon terminal j'ai obtenu un lien que j'ai collé dans Chrome, qui m'a ensuite demandé de sélectionner un compte Google. J'ai choisi celui pour lequel j'avais besoin d'accéder à l'agenda.
Et c'est là que j'ai l'info : The developer hasn’t given you access to this app. It’s currently being tested and it hasn’t been verified by Google.
J'ai modifié l'URI de mon API en http://127.0.0.1/monsite/api/quickstart.php, mais j'ai la même erreur !
Je ne sais pas comment supprimer le token dont tu parles car je ne sais pas où il est !
Je ne peux générer aucune ligne de commande depuis mon site web car je n'ai aucun accès en SSH et si je lance le fichier quickstart.php depuis mon navigateur j'ai le message d'erreur :
Fatal error: Uncaught Exception: This application must be run on the command line
Modifié le 24 juil. 2022 à 18:42
Après le visionnage de 2 ou 3 tutos youtube (pas trouvé grand chose sur le sujet) dans un anglais au très fort accent Indien, j'ai quand même réussi à avancer dans mon projet d'inter-agir avec Google Agenda. J'ai créé dans ma console.cloud.google.com les bons accès à mon compte avec cette fois ci des autorisations fonctionnelles.
J'arrive maintenant via cette page de test https://developers.google.com/calendar/api/v3/reference/events/insert?hl=fr&apix=true#try-it à écrire dans mon agenda...
Le problème c'est que ces fameux tutos ne sont pas biens clairs quant à la procédure pour écrire depuis mes pages web en php dans mon agenda...
J'ai ce bout de code :
<?php $event = new Google_Service_Calendar_Event(array( 'summary' => 'TEST', 'location' => '800 Howard St., San Francisco, CA 94103', 'description' => 'A chance to hear more about Google\'s developer products.', 'start' => array( 'date' => '2022-01-01', 'timeZone' => 'America/Los_Angeles', ), 'end' => array( 'date' => '2022-01-05', 'timeZone' => 'America/Los_Angeles', ), 'recurrence' => array( 'RRULE:FREQ=DAILY;COUNT=2' ), 'attendees' => array(), 'reminders' => array( 'useDefault' => FALSE, 'overrides' => array( array('method' => 'email', 'minutes' => 24 * 60), array('method' => 'popup', 'minutes' => 10), ), ), )); $calendarId = 'monagenda.rhnorhnerhencpacnn.calendar.google.com'; $event = $service->events->insert($calendarId, $event); printf('Event created: %s\n', $event->htmlLink); ?>
Qui me donne cette erreur :
Fatal error: Uncaught Error: Class 'Google_Service_Calendar_Event' not found in /var/www/html/gite/gestion/api/event.php
Pourriez vous me conseiller ?
24 juil. 2022 à 18:48
J'ai également trouvé ce bout de code, qui en partie ressemble au précédent, mais plus complet parce qu'il contient un accès à mon credentials.json :
// Exit if accessed directly defined('ABSPATH') || exit; ini_set('memory_limit', '-1'); ini_set('max_execution_time', '-1'); ini_set('display_errors', 1); /** * update google code */ add_action('wp_footer', 'create_google_calendar_events'); function create_google_calendar_events() { $credentials = __DIR__ . '/credentials.json'; require __DIR__ . '/vendor/autoload.php'; $client = new Google_Client(); $client->setApplicationName('testoo'); $client->getScope(array(Google_Service_Calendar::CALENDAR)); $client->setAuthConfig($credentials); $client->setAccessType('offline'); $client->getAccessToken(); $client->getRefreshToken(); $service = new Google_Service_Calendar($client); $event = new Google_Service_Calendar_event(array( 'summary' => 'testing', 'location' => '800 Howard', 'description' => 'Bla Bla Bla', 'start' => array( 'date' => '2022-01-02', 'timeZone' => 'America/Los_Angeles', ), 'end' => array( 'date' => '2022-01-05', 'timeZone' => 'America/Los_Angeles', ), 'recurrence' => array( 'RRULE:FREQ=DAILY;COUNT=2' ), 'attendees' => array(), 'reminders' => array(), 'useDefault' => FALSE, 'overrides' => array( array('method' => 'email', 'minutes' => 24 * 60), array('method' => 'popup', 'minutes' => 10), ), ), );//)); $calendarId = 'eozirenonrezntornnr@group.calendar.google.com'; $event = $service->events->insert($calendarId, $event); print_r($event->htmlLink); } ?>
Malheureusement je ne parviens pas à récupérer les 12 premières lignes, du coup, même en neutralisant l'appel de la fonction la page reste désespérément vide ainsi que l'agenda !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question24 juil. 2022 à 19:02
Enfin, le fichier quickstart.php de Google donne plutôt un bon résultat (pas d'erreur en tous cas) mais je ne vois toujours pas comment écrire dans mon agenda :
<?php require __DIR__ . '/vendor/autoload.php'; /*if (php_sapi_name() != 'cli') { throw new Exception('This application must be run on the command line.'); }*/ use Google\Client; use Google\Service\Calendar; /** * Returns an authorized API client. * @return Client the authorized client object */ function getClient() { $client = new Client(); $client->setApplicationName('Google Calendar API PHP Quickstart'); $client->setScopes(Google_Service_Calendar::CALENDAR); //<= SELON DOC developers.google.com $client->setAuthConfig('credentials.json'); $client->setAccessType('offline'); $client->setPrompt('select_account consent'); // Load previously authorized token from a file, if it exists. // The file token.json stores the user's access and refresh tokens, and is // created automatically when the authorization flow completes for the first // time. $tokenPath = 'token.json'; if (file_exists($tokenPath)) { $accessToken = json_decode(file_get_contents($tokenPath), true); $client->setAccessToken($accessToken); } // If there is no previous token or it's expired. if ($client->isAccessTokenExpired()) { // Refresh the token if possible, else fetch a new one. if ($client->getRefreshToken()) { $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken()); } else { // Request authorization from the user. $authUrl = $client->createAuthUrl(); printf("Open the following link in your browser:\n%s\n", $authUrl); print 'Enter verification code: '; $authCode = trim(fgets(STDIN)); // Exchange authorization code for an access token. $accessToken = $client->fetchAccessTokenWithAuthCode($authCode); $client->setAccessToken($accessToken); // Check to see if there was an error. if (array_key_exists('error', $accessToken)) { throw new Exception(join(', ', $accessToken)); } } // Save the token to a file. if (!file_exists(dirname($tokenPath))) { mkdir(dirname($tokenPath), 0700, true); } file_put_contents($tokenPath, json_encode($client->getAccessToken())); } return $client; } // Get the API client and construct the service object. $client = getClient(); $service = new Calendar($client); // Print the next 10 events on the user's calendar. try{ $calendarId = 'xxxxxxxxxxxxxxxxxxx@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); } } } catch(Exception $e) { // TODO(developer) - handle error appropriately echo 'Message: ' .$e->getMessage(); } ?>
RÉSULTAT :
No upcoming events found.
25 juil. 2022 à 11:22
1. Suppression du projet initial
2. Création d'un nouveau projet "Gestion-Agenda" sur console.cloud.google.com
3. Activation de la bibliothèque Google Calendar Api
4. Création d'un User Type Externe pour OAuth 2.0
5. Création d'un identifiant Compte de Service
6. Ajout d'une clé de type JSON à ce compte de service (enregistré en credentials.json au même niveau que quickstart.php)
7. Modification de quickstart.php pour l'ajout d'un event :
<?php require __DIR__ . '/vendor/autoload.php'; /* if (php_sapi_name() != 'cli') { throw new Exception('This application must be run on the command line.'); } */ use Google\Client; use Google\Service\Calendar; /** * Returns an authorized API client. * @return Client the authorized client object */ function getClient() { $client = new Client(); $client->setApplicationName('Google Calendar API PHP Quickstart'); $client->setScopes('https://www.googleapis.com/auth/calendar');//.events.readonly'); $client->setAuthConfig('credentials.json'); $client->setAccessType('offline'); $client->setPrompt('select_account consent'); // Load previously authorized token from a file, if it exists. // The file token.json stores the user's access and refresh tokens, and is // created automatically when the authorization flow completes for the first // time. $tokenPath = 'token.json'; if (file_exists($tokenPath)) { $accessToken = json_decode(file_get_contents($tokenPath), true); $client->setAccessToken($accessToken); } // If there is no previous token or it's expired. if ($client->isAccessTokenExpired()) { // Refresh the token if possible, else fetch a new one. if ($client->getRefreshToken()) { $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken()); } else { // Request authorization from the user. $authUrl = $client->createAuthUrl(); printf("Open the following link in your browser:\n%s\n", $authUrl); print 'Enter verification code: '; $authCode = trim(fgets(STDIN)); // Exchange authorization code for an access token. $accessToken = $client->fetchAccessTokenWithAuthCode($authCode); $client->setAccessToken($accessToken); // Check to see if there was an error. if (array_key_exists('error', $accessToken)) { throw new Exception(join(', ', $accessToken)); } } // Save the token to a file. if (!file_exists(dirname($tokenPath))) { mkdir(dirname($tokenPath), 0700, true); } file_put_contents($tokenPath, json_encode($client->getAccessToken())); } return $client; } // Get the API client and construct the service object. $client = getClient(); $service = new Calendar($client); // Print the next 10 events on the user's calendar. /*try{ $calendarId = 'primary'; $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); } } } catch(Exception $e) { // TODO(developer) - handle error appropriately echo 'Message: ' .$e->getMessage(); }*/ // AJOUT À L'AGENDA : try{ $event = new Google_Service_Calendar_Event(array( 'summary' => 'TEST AJOUT', 'location' => '800 Howard St., San Francisco, CA 94103', 'description' => 'A chance to hear more about Google\'s developer products.', 'start' => array( 'date' => '2023-01-01', 'timeZone' => 'America/Los_Angeles', ), 'end' => array( 'date' => '2023-01-04', 'timeZone' => 'America/Los_Angeles', ), 'recurrence' => array( 'RRULE:FREQ=DAILY;COUNT=2' ), 'attendees' => array(), 'reminders' => array( 'useDefault' => FALSE, 'overrides' => array( array('method' => 'email', 'minutes' => 24 * 60), array('method' => 'popup', 'minutes' => 10), ), ), )); $calendarId = 'primary'; $event = $service->events->insert($calendarId, $event); printf('Event created: %s\n', $event->htmlLink); } catch(Exception $e) { // TODO(developer) - handle error appropriately echo 'Message: ' .$e->getMessage(); } ?>
MESSAGE AFFICHÉ À L'EXÉCUTION DE QUICKSTART.PHP :
Event created: https://www.google.com/calendar/event?eid=RRRWNwdm5vYjBpcnRRRRRRcjFqb2dfMjAyMjARRRRRdGlvbi1hZ2VuZGRRRRR2VuZGEtMzU3NDA5LmlhbS5RRRRVydmljZWFjRRRRRbnQuY29t%5Cn
Du mieux mais toujours rien dans l'agenda !
Le même code quickstart.php en lecture d'agenda, c'est à dire en dé-commentant la partie // Print the next 10 events on the user's calendar. me donne :
Upcoming events: TEST AJOUT (2023-01-01) TEST AJOUT (2023-01-02)
25 juil. 2022 à 11:43
bonjour,
Si je comprends bien, tu écris "toujours rien dans l'agenda", alors que ton code "en lecture d'agenda" prouve que les évènements sont dans l'agenda.
Nous as-tu expliqué ce qui se passait quand tu utilisait le lien vers l'évenement créé?
Ne serait-il pas préférable de ne pas toujours utiliser le même titre pour ces évènements, par exemple en ajoutant le moment d'exécution du script dans le titre?
25 juil. 2022 à 13:03
Bonjour yg_be,
Tu as bien compris, "Toujours rien dans l'agenda" signifie je quand j'utilise Google Chrome pour aller sur mon agenda, si je vais en JANVIER 2023, c'est tout vide !
Par contre, si je neutralise la partie du code concernant l'insertion de données pour activer celle de lecture, et que je fais F5 sur quickstart.php il me trouve bien mon ajout (cf Upcoming events...).
Ce qui se passe quand j'utilise le lien vers l'évenement créé :
Mon navigateur ouvre Google Angenda au mois de Juillet 2022
Toujours utiliser le même titre pour ces événements ?
Je change régulièrement mes intitulés, mais ça ne change rien
25 juil. 2022 à 13:05
Upcoming events: TEST AJOUT (2023-01-01) TEST AJOUT (2023-01-01) ETIENNE (2023-01-01T16:00:00Z) ETIENNE (2023-01-01T16:00:00Z) TEST AJOUT (2023-01-02) TEST AJOUT (2023-01-02) ETIENNE (2023-01-02T16:00:00Z) ETIENNE (2023-01-02T16:00:00Z)
25 juil. 2022 à 13:10
Si je change le $calendarId = 'primary'; par l'ID de mon agenda :
Message: { "error": { "errors": [ { "domain": "global", "reason": "notFound", "message": "Not Found" } ], "code": 404, "message": "Not Found" } }
(à l'insertion comme à la lecture)
25 juil. 2022 à 13:28
Je proposais de changer le titre afin de confirmer que le programme lecteur trouve bien les derniers évènements créés.
Via le navigateur, dans Google Agenda, tu ne vois aucun autre agenda pour le même compte?
Moi, j'essaierais, via le navigateur, dans Google Agenda, de créer un nouvel agenda (pour le même compte), et ensuite d'utiliser son nom comme $calendarId.
25 juil. 2022 à 13:41
Le compte Google utilise plusieurs agenda, chaque employé à le sien (5) + celui que j'ai créé GESTION.
Ils sont tous cochés "visible".
Toutes les tentatives de remplacer $calendarId par autre chose que 'primary' se soldent par le message #10
25 juil. 2022 à 14:11
Petite info au passage, mes tests se font depuis mon PC portable et il me semble avoir lu qu'il fallait être en https...
Du coup, j'ai transféré mes 17.000 fichiers (?!?!?) google, composer, paragonie, .... sur mon serveur Ionos qui lui est en https et maintenant j'ai cette erreur à l'insertion dans l'agenda :
Message: { "error": { "code": 403, "message": "Request had insufficient authentication scopes.", "errors": [ { "message": "Insufficient Permission", "domain": "global", "reason": "insufficientPermissions" } ], "status": "PERMISSION_DENIED", "details": [ { "@type": "type.googleapis.com/google.rpc.ErrorInfo", "reason": "ACCESS_TOKEN_SCOPE_INSUFFICIENT", "domain": "googleapis.com", "metadata": { "service": "calendar-json.googleapis.com", "method": "calendar.v3.Events.Insert" } } ] } }
Modifié le 25 juil. 2022 à 15:45
J'ai refait un compte de service, généré une nouvelle clé et je n'ai plus l'erreur 403 !
J'avais pas fais gaffe (car très discret) que le lien après insertion affichait :
Impossible de trouver l'événement demandé

J'ai essayé aussi des insertions sans les Timezone America/Los_Angeles et les DateTime,
j'ai ça en lecture :
Upcoming events: ETIENNE (2023-01-01) ETIENNE (2023-01-01T16:00:00Z) ETIENNE (2023-01-02) ETIENNE (2023-01-02T16:00:00Z)
Modifié le 25 juil. 2022 à 16:31
Grosse Grosse avancée :
Quand j'ai créé dans console.cloud.google.com un compte de service, puis ensuite pour ce compte j'ai créé une clé j'ai obtenu un fichier JSON + une adresse mail de type nomdemonprojet@nomdemonprojet-785123.iam.gserviceaccount.com
1. Je suis allé dans mon Agenda Google, sur l'agenda GESTION créé pour recevoir les event de mon code PHP pour ajouter cette adresse mail dans "partager avec des personnes en particulier".
2. J'ai récupéré l'ID de cet Agenda GESTION pour l'affecter à la variable $calendarId.
J'ai relancé ma page quickstart.php et TAAAADAAAAA :

<?php require __DIR__ . '/vendor/autoload.php'; /* if (php_sapi_name() != 'cli') { throw new Exception('This application must be run on the command line.'); } */ use Google\Client; use Google\Service\Calendar; /** * Returns an authorized API client. * @return Client the authorized client object */ function getClient() { $client = new Client(); $client->setApplicationName('Google Calendar API PHP Quickstart'); $client->setScopes('https://www.googleapis.com/auth/calendar');//.events.readonly');<= MODIFIER ICI $client->setAuthConfig('credentials.json');//<= Le fichier d'autentification $client->setAccessType('offline'); $client->setPrompt('select_account consent'); // Load previously authorized token from a file, if it exists. // The file token.json stores the user's access and refresh tokens, and is // created automatically when the authorization flow completes for the first // time. $tokenPath = 'token.json'; if (file_exists($tokenPath)) { $accessToken = json_decode(file_get_contents($tokenPath), true); $client->setAccessToken($accessToken); } // If there is no previous token or it's expired. if ($client->isAccessTokenExpired()) { // Refresh the token if possible, else fetch a new one. if ($client->getRefreshToken()) { $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken()); } else { // Request authorization from the user. $authUrl = $client->createAuthUrl(); printf("Open the following link in your browser:\n%s\n", $authUrl); print 'Enter verification code: '; $authCode = trim(fgets(STDIN)); // Exchange authorization code for an access token. $accessToken = $client->fetchAccessTokenWithAuthCode($authCode); $client->setAccessToken($accessToken); // Check to see if there was an error. if (array_key_exists('error', $accessToken)) { throw new Exception(join(', ', $accessToken)); } } // Save the token to a file. if (!file_exists(dirname($tokenPath))) { mkdir(dirname($tokenPath), 0700, true); } file_put_contents($tokenPath, json_encode($client->getAccessToken())); } return $client; } // Get the API client and construct the service object. $client = getClient(); $service = new Calendar($client); // LIRE DANS L'AGENDA /*try{ $calendarId = 'primary'; $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); } } } catch(Exception $e) { // TODO(developer) - handle error appropriately echo 'Message: ' .$e->getMessage(); }*/ // AJOUT À L'AGENDA : try{ $event = new Google_Service_Calendar_Event(array( 'summary' => 'VIVA', 'location' => '800 Howard St., San Francisco, CA 94103', 'description' => 'A chance to hear more about Google\'s developer products.', 'start' => array( 'date' => '2023-01-30', ), 'end' => array( 'date' => '2023-02-01', ), 'recurrence' => array(), 'attendees' => array(), 'reminders' => array(), )); $calendarId = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX@group.calendar.google.com'; $event = $service->events->insert($calendarId, $event); printf('Event created: %s\n', $event->htmlLink); } catch(Exception $e) { // TODO(developer) - handle error appropriately echo 'Message: ' .$e->getMessage(); } ?>
25 juil. 2022 à 16:35
J'ai dit grosse avancée, mais tout n'est pas réglé, car si on regarde le code on voit :
Date de début : 2023-01-30
Date de fin : 2023-02-01
Et si je regarde dans mon agenda je vois que je me suis fais gratter 1 jour !