Pergunta

Aqui está o que imaginei até agora:

Para obter o conteúdo da planilha "OD6" com o ID "0aj3x4n7sopmrdfa2vmjuampiudfzdlawruwtsejacmc" Você precisa acessar este URL:https://spreadsheets.google.com/feeds/cells/0aj3x4n7sopmrdfa2vmjuampiudfzdlawruwtsejacmc/od6/private/full

(Vejo API)

Isso funciona bem, se eu colocar o URL no meu navegador (porque estou conectado aos GDOCs e os cookies estão definidos).

Se eu gosto de acessar o URL acima de dentro do meu gadget do Gmail, acho que tenho 2 opções.

  1. Carregue -o via Ajax
  2. Carregue -o diretamente no PHP que gera o gadget

Com a primeira abordagem, encontro o problema, que os cookies não são conhecidos na chamada do Ajax (acho que isso se deve a diferentes domínios envolvidos).

Informações de fundo: meu gadget-php-script é executado no meu host (https://sslsites.de), esse gadget é carregado pelo Gmail e forneceu algum tipo de proxy (então o anfitrião do meu gadget dentro do iframe é http://kipb0cvv7sa9guc3o5eii57sr1eoem5-a-gm-onsocial.googleusercontent.com/gadgets). Onde o URL na barra de localização (o pai do iframe) está https://mail.google.com/mail

Portanto, ele costuma uma chamada de Ajax deste iframe não pode enviar cookies para o domínio https://spreadsheets.google.com . Certo? A resposta está vazia.

Então eu tentei a segunda abordagem. Se eu gosto de acessar a planilha do PHP, vou precisar de OAuth. Que funciona bem com este código:

<?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>

Mas, novamente, tenho o problema com os domínios aqui. Este código é bom em https://sslsites.de . Mas, do Gmail, tenho o problema, que não posso passar no $ _cookie ['token']. Se eu me registrar https://sslsites.de Com o OAuth, meu navegador não passará o biscoito pelo Proxy do Gmails Gadget. Se eu registrar o proxy (http://kipb0cvv7sa9guc3o5eii57sr1eoem5-a-gm-onsocial.googleusercontent.com/gadgets) é para oauth que o cookie está lá, mas meu script PHP também não conhece dele.

Então, existe alguma maneira de passar no cookie que o proxy (que costuras como uma caixa preta para mim, porque não consigo encontrar nenhuma documentação)?

Ou existem outras APIs para acessar planilhas? As planilhas de que estou falando são públicas para todos, por isso não esperaria que seja necessário autenticar.

No entanto, a planilha é pública:https://spreadsheets.google.com/ccc?key=0aj3x4n7sopmrdfa2vmjuampiudfzdlawruwtsejacmc&hl=en&authkey=cj2ppjsp

Mas não a API de dados chama para o mesmo:https://spreadsheets.google.com/feeds/cells/0aj3x4n7sopmrdfa2vmjuampiudfzdlawruwtsejacmc/od6/private/full

Foi útil?

Solução

Finaly descobri como usar o OAuth dentro dos gadgets.

Você tem que defini -lo dentro dos gadgets XML, assim:

<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>

Então você poderá consultar os feeds de planilha:

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
    }
  }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top