Вот что я изобразил до сих пор:
Чтобы получить содержимое электронной таблицы "od6" с идентификатором "0Aj3x4n7SOPMRdFA2VmJuampIUDFzdlAwRUwtSEJacmc", вам необходимо получить доступ к этому URL: https://spreadsheets.google.com/feeds/cells/0Aj3x4n7SOPMRdFA2VmJuampIUDFzdlAwRUwtSEJacmc/od6/private/full
(см. API )
Это прекрасно работает, если я помещаю URL в свой браузер (потому что я вошел в GDocs и файлы cookie установлены).
Если яхотел бы получить доступ к указанному выше URL-адресу из моего гаджета GMail, я думаю, у меня есть 2 варианта.
- Загрузить его через Ajax
- Загрузить его непосредственно в PHP, который генерирует гаджет
При первом подходе я столкнулся с проблемой, что куки не известны в вызове Ajax (я полагаю, это из-за разных доменов).
Справочная информация: Мой гаджет-PHP-Script запускается на моем хосте (https://sslsites.de), этот гаджет загружается GMail и предоставляется через какой-то прокси-сервер (поэтому хост моего гаджета в IFrame - http://kipb0cvv7sa9gunc3o5eii57sr1eoem5 -a-gm-opensocial.googleusercontent.com/gadgets.) где URL в локацииПанель действий (родительский элемент IFrames) имеет значение https://mail.google.com/mail
. Таким образом, при вызове Ajax из этого IFrame не может отправлять файлы cookie в домен https://spreadsheets.google.com.Правильно?Ответ пуст.
Тогда я попробовал второй подход.Если я хочу получить доступ к электронной таблице из PHP, мне понадобится OAuth.Который отлично работает с этим кодом:
<?php
function make_api_call($url, $token) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$curlheader[0] = sprintf("Authorization: AuthSub token=\"%s\"/n", $token);
curl_setopt($ch, CURLOPT_HTTPHEADER, $curlheader);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
function get_session_token($onetimetoken) {
$output = make_api_call("https://www.google.com/accounts/AuthSubSessionToken", $onetimetoken);
if (preg_match("/Token=(.*)/", $output, $matches)) $sessiontoken = $matches[1];
else {
echo "Error authenticating with Google.";
exit;
}
return $sessiontoken;
}
if ($_GET['token'] and !$_COOKIE['token']) {
$_COOKIE['token'] = get_session_token($_GET['token']);
setcookie("token", $_COOKIE['token']);
}
if ($_COOKIE['token']) {
$accountxml = make_api_call("https://spreadsheets.google.com/feeds/cells/tP6VbnjjHP1svP0EL-HBZrg/od6/private/full", $_COOKIE['token']);
print_r($accountxml);
}
?>
<a href="https://www.google.com/accounts/AuthSubRequest?scope=https%3A%2F%2Fspreadsheets.google.com%2Ffeeds%2F&session=1&secure=0&next=https%3A%2F%2Fsslsites.de%2Fknox.orgapage.de%2Fdocget.php" target="_blank">Sign in</a>
Но опять же, у меня есть проблема с доменами здесь.Этот код хорошо работает на https://sslsites.de.Но из GMail у меня проблема в том, что я не могу передать $ _COOKIE ['token'].Если я зарегистрирую https://sslsites.de в OAuth, мой браузер не пропустит cookie через прокси-сервер гаджета GMails.Если я зарегистрирую прокси-сервер (http://kipb0cvv7sa9gunc3o5eii57sr1eoem5 -a-gm-opensocial.googleusercontent.com / gadgets ), он сам по себе для OAuth, где cookie, но мой PHP-скрипт не знает об этом.
Итак, есть ли способ передать Cookie через прокси-сервер (который кажется мне черным ящиком, потому что я не могу найти какую-либо документацию по нему)?
Или есть другиеAPI для доступа к электронным таблицам?Электронные таблицы, о которых я говорю, общедоступны для всех, поэтому я не ожидаю, что одна из них будет нуждаться в аутентификации.
Однако электронная таблица общедоступна: https://spreadsheets.google.com/ccc?key=0Aj3x4n7SOPMRdFA2VmJuampIUDFzdlAwRUwtSEJacmc&hl=en&authkey=CJ2ppJsP
Но не вызов API данныхк тому же: https://spreadsheets.google.com/feeds/cells/0Aj3x4n7SOPMRdFA2VmJuampIUDFzdlAwRUwtSEJacmc/od6/private/full