2012-05-14 2 views
3

Я думал, что это будет легкий ветерок. Следовательно, я застрял в самом начале :-(Google API: автоматическое чтение календаря. Как войти?

Я создал Календарь Google, в котором пользователи могут добавлять события, используя выделенный для общего доступа логин. Затем мне нужно написать PHP-скрипт на моем сервере для чтения событий в определенный период времени.

Я думал, что API key описано здесь будет достаточно. Но это не так.

curl https://www.googleapis.com/calendar/v3/users/me/calendarList?key=mykey 

говорит Login required.

Так что я прочитал о OAuth2.0 и ч ow Мне нужен пользователь для аутентификации. Проблема заключается в том, что мой скрипт не является интерактивным (хотя жесткая кодировка входа в скрипт для меня не проблема: информация не критическая для жизни). Поэтому я читал об учетных записях службы, но похоже, что это для информации, отличной от пользователя.

Вопрос: Как мне закодировать мой сценарий, чтобы принудительно ввести логин без привлечения человека?

Примечание: This SO question кажется многообещающим, но ответ на версию API 2.0, которая кажется устаревшей.

ответ

7

Первое, что вам нужно сделать, это получить токен доступа. Это потребует человека. Предполагая, что вы используете Google APIs PHP Client, это может быть сделано с помощью этого сценария (выполняется из командной строки).

ПРИМЕЧАНИЕ. Отрывок ниже работает с идентификатором клиента для установленных приложений. Убедитесь, что вы создали идентификатор клиента этого типа в консоли Google API Access.

require_once '../../src/apiClient.php'; 
defined('STDIN') or define('STDIN', fopen('php://stdin', 'r')); 

$client = new apiClient(); 
// Visit https://code.google.com/apis/console to create your client id and cient secret 
$client->setClientId('INSERT_CLIENT_ID'); 
$client->setClientSecret('INSERT_CLIENT_SECRET'); 
$client->setRedirectUri('urn:ietf:wg:oauth:2.0:oob'); 
$client->setScopes(array(
    'https://www.googleapis.com/auth/calendar', 
    'https://www.googleapis.com/auth/calendar.readonly', 
)); 

$authUrl = $client->createAuthUrl(); 

print "Please visit:\n$authUrl\n\n"; 
print "Please enter the auth code:\n"; 
$authCode = trim(fgets(STDIN)); 

$_GET['code'] = $authCode; 
$token = $client->authenticate(); 
var_dump($token); 

Это даст вам кодированную json строку, содержащую ваш accessToken и refreshToken. Срок доступа accessToken истекает через 1 час, но не беспокойтесь. RefreshToken не будет истекать (если вы не удалите приложение), и его можно использовать для получения нового refreshToken. Клиентская библиотека позаботится об этой части.

Далее сохраните полный токен json-строки (а не только свойство access_token в безопасном месте и убедитесь, что он не может быть прочитан другими. Затем ваше приложение может вызвать $client->setAccessToken($token), где $ token был просмотрен из безопасного места (Опять же, $token является полной JSON строки в кодировке, не ограничивается его имуществом access_token).

Теперь вы можете сделать запрос аутентификации на Calendar APIs!

require_once '../../src/apiClient.php'; 
require_once '../../src/contrib/apiCalendarService.php'; 
session_start(); 

$client = new apiClient(); 
$client->setApplicationName("Google Calendar PHP Sample Application"); 
$cal = new apiCalendarService($client); 

$client->setAccessToken($tokenFromSafePlace); 

$calList = $cal->calendarList->listCalendarList(); 
print "<h1>Calendar List</h1><pre>" . print_r($calList, true) . "</pre>"; 
+0

Спасибо большое! Получил это, чтобы работать в конечном счете. Я отредактировал ваш ответ, чтобы добавить несколько недостающих точек. –

1

Используя последнюю версию клиентской библиотеки (для v3 api?), чтобы получить нужный токен:

require_once 'Google/Client.php'; 
defined('STDIN') or define('STDIN', fopen('php://stdin', 'r')); 

$client = new Google_Client(); 
// Visit https://console.developers.google.com/ to create your application and client id for a native app. 
$client->setClientId('YOUR_CLIENT_ID'); 
$client->setClientSecret('YOUR_CLIENT_SECRET'); 
$client->setRedirectUri('urn:ietf:wg:oauth:2.0:oob'); 
$client->setScopes(array(
    'https://www.googleapis.com/auth/calendar', 
    'https://www.googleapis.com/auth/calendar.readonly', 
)); 

$authUrl = $client->createAuthUrl(); 

print "Please visit:\n$authUrl\n\n"; 
print "Please enter the auth code:\n"; 
$authCode = trim(fgets(STDIN)); 

$_GET['code'] = $authCode; 
$token = $client->authenticate($authCode); 
var_dump($token); 

Чтобы получить список календарей вы тогда понадобится следующий код:

require_once 'Google/Client.php'; 
require_once 'Google/Service/Calendar.php'; 

$client = new Google_Client(); 
$client->setApplicationName("My Calendar example"); 
// token you got from the previous code 
$client->setAccessToken($token); 

$calendarService = new Google_Service_Calendar($client); 
$calendarList = $calendarService->calendarList; 

$calList = $calendarList->listCalendarList(); 
print "<h1>Calendar List</h1><pre>" . print_r($calList, true) . "</pre>";