API календаря Google: выбор/создание календарей?

Итак, я хочу, чтобы наш рабочий календарь автоматически синхронизировался с каждым сотрудником Календаря Google, когда диспетчер планирования отправляет/обновляет расписания. Сначала пользователи предпочли бы использовать токен AuthSub, но после этого он должен быть автоматическим. Чтобы избежать конфликтов с другими событиями, которые они запланировали, я хочу создать новый календарь под названием "Рабочее приложение" или что-то еще довольно уникальное. Затем для обновлений он просто удалит любые события из этого диапазона перед созданием новых событий. Поэтому у меня есть некоторые вопросы...

  • Как выбрать конкретный календарь, который я хочу использовать API? (это все в PHP, кстати, с использованием Zend Framework). Я вижу, где я могу запросить список календарей, но в документации не показано, как добавить к этому конкретному календарю.

  • Можно ли создавать календари? Нужно ли мне просто выбирать пользователей, которые выбирают такой календарь? Если это так, есть ли URL-адрес, который я мог бы создать для них, чтобы создать его, например, для добавления событий? (Что-нибудь, чтобы сделать вещи простыми и последовательными, не так ли?)

  • Я не хочу, чтобы пользователи хранили свои учетные данные, очевидно, но я также не хочу запрашивать доступ для каждого обновления. Нужен ли мне токен OAuth, чтобы иметь постоянный доступ? Я знаю, что токен URL-адреса используется один раз, но могу ли я хранить токен сеанса и повторно использовать его через неделю?

  • Есть ли способ, кроме запроса к каждому событию, чтобы избежать дублирования? Я тестировал эту последнюю ночь, и теперь у меня есть 7 случаев из тех же 50 событий. Я не хочу добавлять к серверу время с проверкой перед каждым добавлением.

  • Наконец, есть способ добавить несколько событий или даже просто вставить файл ics в календарь. Прямо сейчас у меня есть script сделать SQL-запрос и добавлять каждое событие, когда оно проходит через результаты. Кажется, что это займет гораздо больше времени, чем ожидалось, поэтому просто создать либо файл ics, либо добавить все события к одному объекту, и добавить их все сразу будет лучше. Спасибо!

Ответ 1

Ну, так как никто не ответил, я решил начать разбираться в документации, отличной от PHP, для API календаря Google, особенно в материалах .NET и немного в необработанном протоколе. И ты не знаешь этого...

Если вы перейдете в документацию .NET, в нем упоминаются классные новые функции, в частности, как создавать новые непервичные календари для аутентифицированных пользователей и как добавлять события в непервичные календари.

Конечно, эта документация нигде не отображается в области PHP, и, похоже, не существует взаимно однозначной корреляции. Для создания нового календаря я сначала попробовал некоторые очевидные вещи, затем, разобравшись, попробовал что-то не так очевидное, что сработало. Я думал, что поделился бы тем, что причина для радиомолчания заключалась в том, что никто не знал ответа, но обязательно хотел бы.

Чтобы создать новый календарь:

Есть два ключа к этому:

  • Вы должны использовать тот же метод для добавления событий календаря, который insertEvent()

  • Вы должны установить URL-адрес сообщения в методе, который в противном случае переходит к URL-адресу фида по умолчанию.

В этом примере проверяется, существует ли календарь приложений, а если нет, он создает его:

 //Standard creation of the HTTP client
 $gdataCal = new Zend_Gdata_Calendar($client);

 //Get list of existing calendars
 $calFeed = $gdataCal->getCalendarListFeed();

 //Set this to true by default, only gets set to false if calendar is found
 $noAppCal = true;

 //Loop through calendars and check name which is ->title->text
 foreach ($calFeed as $calendar) {
  if($calendar -> title -> text == "App Calendar") {
   $noAppCal = false;
  }
 }

 //If name not found, create the calendar
 if($noAppCal) {

  // I actually had to guess this method based on Google API "magic" factory
  $appCal = $gdataCal -> newListEntry();
  // I only set the title, other options like color are available.
  $appCal -> title = $gdataCal-> newTitle("App Calendar"); 

  //This is the right URL to post to for new calendars...
  //Notice that the user info is nowhere in there
  $own_cal = "http://www.google.com/calendar/feeds/default/owncalendars/full";

  //And here the payoff. 
  //Use the insertEvent method, set the second optional var to the right URL
  $gdataCal->insertEvent($appCal, $own_cal);
 }

И у вас это есть. Следующая цель - вставить события в этот календарь, а не в календарь по умолчанию.

Добавление событий в непервичный календарь

Легкая часть, которую вы, вероятно, можете догадаться, заключается в том, что вам нужно снова установить этот дополнительный URL, например: insertEvent($newEvent, $calURL), сложная часть получает URL-адрес календаря. В отличие от пути "принадлежащих календарям", определенные календари не только содержат информацию о пользователе, но также имеют идентификатор hash-lookin '.

Здесь код:

 //Set up  that loop again to find the new calendar:
 $calFeed = $gdataCal->getCalendarListFeed();
 foreach ($calFeed as $calendar) {
  if($calendar->title->text == "App Calendar")
   //This is the money, you need to use '->content-src'
   //Anything else and you have to manipulate it to get it right. 
   $appCalUrl = $calendar->content->src;
 }

 //.......... Some Assumed MySQL query and results .............

      while ($event = $result->fetch_assoc()) {
   $title = $event['description'];

   //Quick heads up
   //This is a handy way of getting the date/time in one expression.
   $eventStart = date('Y-m-d\TH:i:sP', strtotime($event['start']));
   $eventEnd = date('Y-m-d\TH:i:sP', strtotime($event['end']));

   $newEvent = $gdataCal->newEventEntry();
   $newEvent->title = $gdataCal->newTitle($title);
   $when = $gdataCal->newWhen();
   $when->startTime = $eventStart;
   $when->endTime = $eventEnd;

   $newEvent->when = array($when);

   //And at last, the insert is set to the calendar URL found above
   $createdEvent = $gdataCal->insertEvent($newEvent, $appCalUrl);
  }
  echo "<p>".$result->num_rows." added to your Google calendar.</p>";

Спасибо всем, кто прочитал мой вопрос и подумал об этом. Если кто-нибудь знает способ затянуть вышеприведенный код (может быть, мне не нужны две петли?) Мне бы хотелось получить обратную связь.

Ответ 2

Я считаю, что Энтони ссылается либо на документы v1, либо на документы v2 на сайте Google Calendar API. Я легко справился с этим в Perl, следуя v2 protocol guide.

Ключ должен изменить URL, на который вы отправляете POSTING. Вместо стандартного "/calendar/feeds/default/private/full" сначала выберите список доступных календарей, затем получите значение content/@src из нужного календаря и отправьте сообщение, например./calendar/feeds/1234567890abcdefeg%40group.calendar.google.com/private/full