php - Insertar entradas de Google Calendar con cuenta de servicio
google-calendar-api google-api-php-client (2)
Aquí está la forma de hacerlo del Cliente API de Google 2.0
Siga la respuesta de Alex Vaya a la consola del desarrollador de Google para crear una cuenta de servicio, pero cree una credencial en JSON
Siga la github.com/google/google-api-php-client/blob/master/… , instálela por compositor e inclúyala
require_once ''vendor/autoload.php'';
Siga la respuesta de Alex para ir a Google Calendar para compartir el calendario con la ID de cuenta de servicio
Tomar Ref. a continuación, la codificación y la más importante es que la identificación del calendario debe ser el correo electrónico del creador del calendario, pero no el principal
<?php
require_once __DIR__.''/vendor/autoload.php'';
session_start();
$client = new Google_Client();
$application_creds = __DIR__.''/secret.json''; //the Service Account generated cred in JSON
$credentials_file = file_exists($application_creds) ? $application_creds : false;
define("APP_NAME","Google Calendar API PHP"); //whatever
$client->setAuthConfig($credentials_file);
$client->setApplicationName(APP_NAME);
$client->addScope(Google_Service_Calendar::CALENDAR);
$client->addScope(Google_Service_Calendar::CALENDAR_READONLY);
//Setting Complete
//Go Google Calendar to set "Share with ..." Created in Service Account ([email protected])
//Example of Use of API
$service = new Google_Service_Calendar($client);
$calendarId = ''[email protected]''; //NOT primary!! , but the email of calendar creator that you want to view
$optParams = array(
''maxResults'' => 10,
''orderBy'' => ''startTime'',
''singleEvents'' => TRUE,
''timeMin'' => date(''c''),
);
$results = $service->events->listEvents($calendarId, $optParams);
if (count($results->getItems()) == 0) {
print "No upcoming events found./n";
} else {
echo "Upcoming events:";
echo "<hr>";
echo "<table>";
foreach ($results->getItems() as $event) {
$start = $event->start->dateTime;
if (empty($start)) {
$start = $event->start->date;
}
echo "<tr>";
echo"<td>".$event->getSummary()."</td>";
echo"<td>".$start."</td>";
echo "</tr>";
}
echo "</table>";
}
Estoy tratando de usar una cuenta de servicio para crear entradas en un calendario de Google.
Estoy muy cerca de esto, pero la última línea no funcionará.
Recibo un
500 Internal Service Error
cuando dejo que esto se ejecute.
De lo contrario, el programa se ejecuta sin errores, por lo que sea que valga.
El contenido del archivo
Calendar.php
se puede encontrar
here
.
El método
insert()
que estoy intentando llamar comienza en la línea 1455 de ese archivo.
<?php
function calendarize ($title, $desc, $ev_date, $cal_id) {
session_start();
/************************************************
Make an API request authenticated with a service
account.
************************************************/
set_include_path( ''../google-api-php-client/src/'');
require_once ''Google/Client.php'';
require_once ''Google/Service/Calendar.php'';
// (not real keys)
$client_id = ''843319906820-jarm3f5ctbtjj9b7lp5qdcqal54p1he6.apps.googleusercontent.com'';
$service_account_name = ''843319906820-jarm3f5ctbtjj7b7lp5qdcqal54p1he6@developer.gserviceaccount.com'';
$key_file_location = ''../google-api-php-client/calendar-249226a7a27a.p12'';
// echo pageHeader("Service Account Access");
if (!strlen($service_account_name) || !strlen($key_file_location))
echo missingServiceAccountDetailsWarning();
$client = new Google_Client();
$client->setApplicationName("xxxx Add Google Calendar Entries");
if (isset($_SESSION[''service_token''])) {
$client->setAccessToken($_SESSION[''service_token'']);
}
$key = file_get_contents($key_file_location);
$cred = new Google_Auth_AssertionCredentials(
$service_account_name,
array(''https://www.googleapis.com/auth/calendar''),
$key
);
$client->setAssertionCredentials($cred);
if($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion($cred);
}
$_SESSION[''service_token''] = $client->getAccessToken();
// Prior to this, the code has mostly come from Google''s example
// google-api-php-client / examples / service-account.php
// and relates to getting the access tokens.
// The rest of this is about setting up the calendar entry.
//Set the Event data
$event = new Google_Service_Calendar_Event();
$event->setSummary($title);
$event->setDescription($desc);
$start = new Google_Service_Calendar_EventDateTime();
$start->setDate($ev_date);
$event->setStart($start);
$end = new Google_Service_Calendar_EventDateTime();
$end->setDate($ev_date);
$event->setEnd($end);
$calendarService = new Google_Service_Calendar($client);
$calendarList = $calendarService->calendarList;
$events = $calendarService->events;
// if I leave this line, my code won''t crash (but it won''t do anything, either)
//echo "here"; die();
$events.insert($cal_id, $event, false);
}
?>
Me di cuenta de esto. Como no veo ningún ejemplo completo del uso de cuentas de servicio con API v3, solo publicaré mi solución completa como referencia. Sin embargo, hay algunas cosas que debe hacer además de implementar el código:
1) Debe ir a la consola del desarrollador de Google y marcar su cuenta como ''cuenta de servicio''. Esto lo diferenciará de una aplicación web. La diferencia importante es que a nadie se le pedirá que inicie sesión en su cuenta antes de que se agreguen los eventos, ya que la cuenta pertenecerá a su aplicación, no un usuario final. Para obtener más información, consulte este article , comenzando en la página 5.
2) Necesita crear un par de claves pública / privada.
Desde la consola del desarrollador, haga clic en Credenciales.
Debajo de su cuenta de servicio, haga clic en ''Generar nueva clave P12''.
Tendrás que guardar esto en algún lugar.
Esa ubicación de archivo se convierte en la cadena de variable
$key_file_location
en el código a continuación.
3) También desde la consola del desarrollador, debe habilitar la API de
Calendar
.
Desde su proyecto, en el margen izquierdo verá
APIs
.
Seleccione eso y busque la API de
Calendar
.
Haga clic en él, acepte los términos de servicio y verifique que ahora se muestre en
Enabled APIs
con el estado
On
4) En Google Calendar al que desea agregar eventos, en la configuración, haga clic en Configuración del calendario y luego en ''Compartir este calendario'' en la parte superior. En "Compartir con personas específicas" en el campo "Persona", pegue la dirección de correo electrónico de las credenciales de la cuenta de servicio. Cambie la configuración de permisos a ''Realizar cambios en eventos''. No olvides guardar el cambio.
Luego, implemente este código en alguna parte.
Comente si algo es confuso u omitido. ¡Buena suerte!
<?php
function calendarize ($title, $desc, $ev_date, $cal_id) {
session_start();
/************************************************
Make an API request authenticated with a service
account.
************************************************/
set_include_path( ''../google-api-php-client/src/'');
require_once ''Google/Client.php'';
require_once ''Google/Service/Calendar.php'';
//obviously, insert your own credentials from the service account in the Google Developer''s console
$client_id = ''843319906820-xxxxxxxxxxxxxxxxxxxdcqal54p1he6.apps.googleusercontent.com'';
$service_account_name = ''843319906820-xxxxxxxxxxxxxxxxxxxdcqal54p1he6@developer.gserviceaccount.com'';
$key_file_location = ''../google-api-php-client/calendar-xxxxxxxxxxxx.p12'';
if (!strlen($service_account_name) || !strlen($key_file_location))
echo missingServiceAccountDetailsWarning();
$client = new Google_Client();
$client->setApplicationName("Whatever the name of your app is");
if (isset($_SESSION[''service_token''])) {
$client->setAccessToken($_SESSION[''service_token'']);
}
$key = file_get_contents($key_file_location);
$cred = new Google_Auth_AssertionCredentials(
$service_account_name,
array(''https://www.googleapis.com/auth/calendar''),
$key
);
$client->setAssertionCredentials($cred);
if($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion($cred);
}
$_SESSION[''service_token''] = $client->getAccessToken();
$calendarService = new Google_Service_Calendar($client);
$calendarList = $calendarService->calendarList;
//Set the Event data
$event = new Google_Service_Calendar_Event();
$event->setSummary($title);
$event->setDescription($desc);
$start = new Google_Service_Calendar_EventDateTime();
$start->setDateTime($ev_date);
$event->setStart($start);
$end = new Google_Service_Calendar_EventDateTime();
$end->setDateTime($ev_date);
$event->setEnd($end);
$createdEvent = $calendarService->events->insert($cal_id, $event);
echo $createdEvent->getId();
}
?>
Algunos recursos útiles:
Ejemplo de Github para cuentas de servicio
Consola de desarrolladores de Google para insertar eventos en API v3
article