Можно ли получить содержимое электронной таблицы Google Docs из Gmail Gadget?
-
25-09-2019 - |
Вопрос
Вот что я полагал до сих пор:
Чтобы получить содержание электронной таблицы «OD6» с идентификатором «0AJ3X4N7SOPMRDFA2VMJUAMPIUDFZDLAWRUWTSEJACMC», вы должны предпринять этот URL:https://spreadshies.google.com/feeds/cells/0aj3x4n7sopmrdfa2vmjuampiudfzdlawruwtsejacmc/od6/private/full.
(видеть API.)
Это работает нормально, если я положу URL в мой браузер (потому что я вошел в GDOCS, и набор файлов cookie).
Если я хочу получить доступ к URL выше из моего гаджета Gmail, я думаю, у меня есть 2 варианта.
- Загрузить его через ajax
- Загрузите его прямо в PHP, который генерирует гаджет
С первым подходом я столкнулся с проблемой, что печенье не известно в Call ajax (я думаю, это из-за разных доменов).
Фон Информация: мой гаджет-PHP-скрипт работает на моем хосте (https://sslsites.de.), этот гаджет загружен Gmail и предоставил через какое-либо прокси (поэтому множество моего гаджета в IFrame http://kipb0cvv7sa9gunck3o5eii57sr1eoem5-a-gm-opensocial.googleusercontent.com/gadgets.). Где URL в панели местоположения (родитель IFRAMES) https://mail.google.com/mail.
Так что он швырует вызов AJAX от этого iFrame не могу отправить куки для домена https://spreadsheadshies.google.com. Отказ Верно? Ответ пуст.
Затем я попробовал второй подход. Если мне нравится получить доступ к электронной таблице из PHP, мне понадобится ОАУТ. Что отлично работает с этим кодом:
<?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 [«токен»]. Если я зарегистрируюсь https://sslsites.de. С помощью Oauth My Browser не пройдет печенье через Proxy Gamails Gamails. Если я зарегистрирую прокси (http://kipb0cvv7sa9gunck3o5eii57sr1eoem5-a-gm-opensocial.googleusercontent.com/gadgets.) Это самолет для ОАУТ, куки там, но мой сценарий PHP тоже не знает об этом.
Итак, есть ли способ, которым я могу пройти печенье через прокси (какие швы, как черный ящик для меня, потому что я не могу найти ни одной документации)?
Или есть другие API для доступа к электронным таблицам? Электронные таблицы, о которых я говорю, являются общедоступными для всех, поэтому я не ожидаю, что нужно будет подтвердить подлинность.
Однако электронная таблица является публичной:https://spreadshietsshies.google.com/ccckkey=0aj3x4n7sopmrdfa2vmjuampiudfzdlawtsejacmcmc&hl=en&authkey=cj2ppjsp.
Но не вызов API данных на то же самое:https://spreadshies.google.com/feeds/cells/0aj3x4n7sopmrdfa2vmjuampiudfzdlawruwtsejacmc/od6/private/full.
Решение
Я финирировал, как использовать OAUTH в гаджетах.
Вы должны определить его в гаджетах XML, как это:
<OAuth>
<Service name="google">
<Access url="https://www.google.com/accounts/OAuthGetAccessToken" method="GET" />
<Request url="https://www.google.com/accounts/OAuthGetRequestToken?scope=https://spreadsheets.google.com/feeds/" method="GET" />
<Authorization url="https://www.google.com/accounts/OAuthAuthorizeToken?oauth_callback=http://oauth.gmodules.com/gadgets/oauthcallback" />
</Service>
</OAuth>
Тогда вы сможете запросить каналы электронной таблицы:
function initSSData() {
var params = {};
params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.JSON;
params[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.OAUTH;
params[gadgets.io.RequestParameters.OAUTH_SERVICE_NAME] = "google";
params[gadgets.io.RequestParameters.OAUTH_USE_TOKEN] = "always";
params[gadgets.io.RequestParameters.METHOD] = gadgets.io.MethodType.GET;
gadgets.io.makeRequest("https://spreadsheets.google.com/feeds/spreadsheets/private/full?title=GIdea&alt=json", function(response) {
// Show sign in
if (response.oauthApprovalUrl) {
var popup = shindig.oauth.popup({
destination: response.oauthApprovalUrl,
windowOptions: null,
onOpen: function() { document.getElementById('approval').style.display = "none"; document.getElementById('waiting').style.display = "block"; },
onClose: function() { initSSData(); }
});
var personalize = document.getElementById('personalize');
personalize.onclick = popup.createOpenerOnClick();
var approvaldone = document.getElementById('approvaldone');
approvaldone.onclick = popup.createApprovedOnClick();
document.getElementById('approval').style.display = "block";
// Show result
} else if (response.data) {
// Access the spreadsheet with response.data
}
}
}