Google 캘린더 API : 캘린더 선택/생성?
-
20-09-2019 - |
문제
따라서 스케줄링 관리자가 일정을 게시/업데이트 할 때 작업 캘린더가 각 직원의 Google 캘린더와 자동으로 동기화되기를 원합니다. 사용자는 처음에 Authsub 토큰을 사용하여 선택하지만 그 후에 자동이어야합니다. 예정된 다른 이벤트와의 충돌을 피하기 위해 "작업 앱"이라는 새 캘린더 또는 다른 독특한 것을 만들고 싶습니다. 그런 다음 업데이트의 경우 새 이벤트를 작성하기 전에 해당 범위에서 모든 이벤트를 삭제합니다. 그래서 몇 가지 질문이 있습니다 ...
API를 사용하려는 특정 캘린더를 어떻게 선택합니까? (Zend 프레임 워크를 사용하여 PHP의 모든 것이). 캘린더 목록에 대해 쿼리 할 수있는 곳이 있지만 문서는 해당 캘린더에 추가하는 방법을 보여주지 않습니다.
캘린더를 만들 수 있습니까? 그러한 캘린더를 만들기 위해 선택한 사용자 만 있으면 되나요? 그렇다면 이벤트를 추가하는 것처럼 생성 할 수있는 URL이 있습니까? (간단하고 일관성을 만들기 위해 무엇이든?)
사용자가 자격 증명을 저장하기를 원하지 않지만 분명히 각 업데이트에 대한 액세스를 요청하고 싶지 않습니다. 지속적으로 액세스하기 위해서는 Oauth 토큰이 필요합니까? URL 토큰이 한 번 사용된다는 것을 알고 있지만 세션 토큰을 저장하고 일주일 후에 재사용 할 수 있습니까?
복제를 피하기 위해 각 이벤트를 쿼리하는 것 외에 다른 방법이 있습니까? 나는 지난 밤에 테스트하고 있었고 이제 같은 50 개의 이벤트의 7 가지 인스턴스가 있습니다. 각 추가 전에 확인하여 서버 시간에 추가하고 싶지 않습니다.
마지막으로 여러 이벤트를 추가하거나 ICS 파일을 캘린더로 단순히 푸시하는 방법이 있습니까? 지금은 스크립트에 SQL 쿼리를 수행하고 결과를 통해 루프 할 때 각 이벤트를 추가합니다. 예상보다 훨씬 오래 걸리는 것처럼 보이므로 ICS 파일을 구축하거나 한 객체에 모든 이벤트를 추가하고 한 번에 추가하는 것이 좋습니다. 감사!
해결책
아무도 대답하지 않았기 때문에, 나는 Google Calendar API의 비 -PHP 문서, 특히 .NET 물건과 RAW 프로토콜에서 약간의 포크를 시작하기로 결정했습니다. 그리고 당신은 그것을 몰라 ...
.NET 문서로 이동하면 Cool이 언급됩니다. 새로운 특징, 특히 인증 된 사용자를위한 새로운 비발적 캘린더를 만드는 방법 및 비야 캘린더에 이벤트를 추가하는 방법.
물론,이 문서는 PHP 영역에서 어디에도 나타나지 않으며 일대일 상관 관계가없는 것 같습니다. 새로운 캘린더를 만들기 위해, 나는 먼저 분명한 것들을 시도한 다음, 부러지기 위해 노력하고, 그다지 불쾌하지 않은 것을 시도했습니다. 라디오 침묵의 이유는 아무도 그 대답을 알지 못했지만 확실히 원하는 이유가 있기 때문에 공유 할 것이라고 생각했습니다.
새 캘린더를 만들려면 :
여기에는 두 가지 열쇠가 있습니다.
달력 이벤트를 추가하기 위해 동일한 방법을 사용해야합니다.
insertEvent()
메소드에서 Post 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's "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's info is nowhere in there
$own_cal = "http://www.google.com/calendar/feeds/default/owncalendars/full";
//And here's 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을 얻는 것입니다. "소유 캘린더"경로와는 달리 특정 캘린더에는 사용자 사례 정보가있을뿐만 아니라 어떤 종류의 해시 모양의 ID도 있습니다.
코드는 다음과 같습니다.
//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>";
내 질문을 읽고 그것에 대해 생각한 사람에게 감사합니다. 위의 코드를 조이는 방법을 알고 있다면 (두 개의 루프가 필요하지 않습니까?) 피드백을 받고 싶습니다.
다른 팁
Anthony는 Google Calendar API 사이트의 V1 문서 또는 V2 문서를 언급하고 있다고 생각합니다. 나는 Perl에서 이것을 쉽게 관리했다. V2 프로토콜 안내서.
열쇠는 게시하는 URL을 변경하는 것입니다. 기본 "/calendar/feeds/default/private/full"대신 먼저 사용 가능한 캘린더 목록을 가져온 다음 원하는 캘린더에서 내용/@SRC 값을 가져오고, 예로/calendar/feeds/에 게시합니다. 1234567890ABCDEFEG%40GROUP.CALENDAR.google.com/private/full