Как да четете събития и да изтривате всички събития в Google Calendar с помощта на API V3 PHP

След часове четене на документация за API на Google и търсене в мрежата успях да напиша проста PHP функция за вмъкване на събитие в моя календар в Google (ако някой иска кода, просто попитайте).

Но следващото нещо, което искам да направя, е да изтрия цялото съдържание на моя календар в Google. Първоначално мислех, че ще направя това, като прочета всички събития и след това изтрия всяко едно, но според Google мога да направя това с една команда:

$service->calendars->clear($cal_id);

Въпреки това, тъй като документацията на Google API обхваща само действителната команда и не показва нито един от кода, който трябва да предхожда това, така че използвах кода за оторизация, който работи в скрипта за вмъкване на събитие, но просто не мога да го накарам да работи за изчиствам данните и получавам грешка:

Забележка: Недефинирана променлива: услуга в index.php на ред 68

Целият ми код следва:

<?php
//
// example code taken from:
// https://developers.google.com/google-apps/calendar/v3/reference/calendars/clear
//
//
calendclear('[email protected]');

//---------------------------------------------------//
// funtion to delete all events from Google calendar //
//---------------------------------------------------//
function calendclear ($cal_id) {
    session_start();
    require_once '../google-api-php-client-master/autoload.php';
    //Google credentials
    $client_id = 'xxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com';
    $service_account_name = '[email protected]';
    $key_file_location = '../google-api-php-client-master/API Project-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()) {
        try {
          $client->getAuth()->refreshTokenWithAssertion($cred);
        } catch (Exception $e) {
          var_dump($e->getMessage());
        }
    }
    $_SESSION['service_token'] = $client->getAccessToken();

    $calendarService = new Google_Service_Calendar($client);
    $calendarList = $calendarService->calendarList;
    //delete all calendar data
    try {
      $service->calendars->clear($cal_id);
    } catch (Exception $e) {
      var_dump($e->getMessage());
    }
    echo 'Calendar Successfully Cleared';
}
?>

person Andy Hawes    schedule 29.01.2015    source източник
comment
Изпращате ли основния идентификатор на календара до clear($cal_id)?? тъй като методът calendar.clear изчиства само основния календар..   -  person SGC    schedule 29.01.2015
comment
Благодаря за това, това не поправи грешката, но не изпращах първичен, промених кода на: $service-›calendars-›clear('primary');   -  person Andy Hawes    schedule 29.01.2015
comment
Хей, @SGC, имаш ли някаква друга представа какво може да причинява моята грешка? Или някакъв примерен код, който мога да копирам?   -  person Andy Hawes    schedule 30.01.2015


Отговори (1)


След много опити и грешки намерих начин да изчистя Google Calendar с помощта на API v3.

Не можах да накарам командата clear да работи, така че вместо това трябваше да: 1. прочета всички събития в календара 2. да изтрия всяко едно

Първо се уверете, че вашият календар в Google е настроен правилно, за да може всяко от тези неща да работи - има 4 прости стъпки, описани подробно в отговора тук Вмъкване на записи в Google Календар със сервизен акаунт

След това ето кода, който използвах - имайте предвид, че последните 2 препратки към [email protected] са имейл адреса на собственика на календара - изтриването НЯМА да работи нито с „основен“, нито с $service_account_name.

Ако си играете с тези неща, надявам се това да ви помогне, тъй като последните 2 дни от живота ми, които прекарах в опити да реша това, не бяха напълно пропилени :)

<?php
session_start();
require_once '../google-api-php-client-master/autoload.php';
//Google credentials
$client_id = 'xxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com';
$service_account_name = '[email protected]';
$key_file_location = '../google-api-php-client-master/API Project-xxxxxxxxxxx.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()) {
    try {
      $client->getAuth()->refreshTokenWithAssertion($cred);
    } catch (Exception $e) {
      var_dump($e->getMessage());
    }
}
$_SESSION['service_token'] = $client->getAccessToken();

/* ------------------------- We are now properly authenticated ------------------- */

$cal = new Google_Service_Calendar($client);
$event_list = $cal->events->listEvents('[email protected]');

$events = $event_list->getItems();

// loop through all events read from calendar

foreach ($events as $event)
{
    $myEvent=$event->getId();
    $mySummary=$event->getSummary();
    $MyStart=$event->getStart()->getDateTime();
    $MyEnd=$event->getEnd()->getDateTime();
    echo 'about to delete event '.$mySummary.' ID: ('.$myEvent.')<br />';
    // now delete the event found
    try {
      $cal->events->delete('[email protected]', $myEvent);
      echo 'Success.<br />';
    } catch (Exception $e) {
      var_dump($e->getMessage());
      die('Event Delete Failed.');
    }
}
?>
person Andy Hawes    schedule 30.01.2015
comment
Ако искате да изтриете събития, горният код работи, но вие казахте, че искате да изчистите съдържанието на календара. За това трябва да използвате ясен метод.. - person SGC; 30.01.2015
comment
Да, @SGC, бих предпочел да изчистя, тъй като очаквам, че щеше да е по-ефективно, но за живота си не можах да го накарам да работи, така че това беше моето заобиколно решение. Ако имате примерен код за ясния метод или знаете къде мога да намеря някой, който е актуален и работи онлайн, ще го приветствам. Документацията на Google оставя много да се желае... - person Andy Hawes; 31.01.2015