0

Voici ce que je pensais à ce jour:Est-il possible d'obtenir le contenu d'une feuille de calcul Google Docs dans un gadget GMail?

Pour obtenir le contenu de la feuille de calcul "od6" avec l'ID "0Aj3x4n7SOPMRdFA2VmJuampIUDFzdlAwRUwtSEJacmc" vous devez acces cette URL: https://spreadsheets.google.com/feeds/cells/0Aj3x4n7SOPMRdFA2VmJuampIUDFzdlAwRUwtSEJacmc/od6/private/full

(voir API)

Cela fonctionne bien, si je mets l'URL dans mon navigateur (parce que je suis connecté à GDocs et les cookies sont définis).

Si j'aime accéder à l'URL ci-dessus à partir de mon gadget GMail, je suppose que j'ai 2 options.

  1. charge via Ajax
  2. charge directement dans le PHP qui génère le gadget

Avec la première approche que je tombe sur le problème, que les cookies ne sont pas connus dans l'appel Ajax (Je suppose que c'est à cause de différents domaines impliqués). Informations de base: Mon Gadget-PHP-Script fonctionne sur mon hôte (https://sslsites.de), ce gadget est chargé par GMail et fourni par un proxy (l'hôte de mon Gadget dans l'IFrame est http://kipb0cvv7sa9gunc3o5eii57sr1eoem5-a-gm-opensocial.googleusercontent.com/gadgets). Lorsque l'URL dans la barre d'adresse (le parent iFrame) est https://mail.google.com/mail

Il coud un appel Ajax de cette IFrame ne peut pas envoyer des cookies au domaine https://spreadsheets.google.com. Droite? La réponse est vide.

Puis j'ai essayé la deuxième approche. Si je veux accéder à la feuille de calcul de PHP, j'ai besoin d'OAuth. Ce qui fonctionne bien avec ce code:

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

Mais encore une fois, j'ai le problème avec les domaines ici. Ce code fonctionne bien sur https://sslsites.de. Mais à partir de GMail j'ai le problème, que je ne peux pas passer le $ _COOKIE ['jeton']. Si j'enregistre https://sslsites.de avec OAuth, mon navigateur ne transmettra pas le cookie via le proxy du gadget GMails. Si j'inscris le proxy (http://kipb0cvv7sa9gunc3o5eii57sr1eoem5-a-gm-opensocial.googleusercontent.com/gadgets) c'est auto pour OAuth le Cookie est là, mais mon script PHP ne le sait pas non plus.

Donc, est-il possible de passer le cookie par le proxy (ce qui me semble être une boîte noire, car je ne trouve aucune documentation dessus)?

Ou existe-t-il d'autres API pour accéder aux feuilles de calcul? Les feuilles de calcul dont je parle sont publiques pour tout le monde, donc je ne m'attendrais pas à ce que quelqu'un doive s'authentifier.

Cependant, la feuille de calcul est public: https://spreadsheets.google.com/ccc?key=0Aj3x4n7SOPMRdFA2VmJuampIUDFzdlAwRUwtSEJacmc&hl=en&authkey=CJ2ppJsP

Mais pas l'appel API de données au même: https://spreadsheets.google.com/feeds/cells/0Aj3x4n7SOPMRdFA2VmJuampIUDFzdlAwRUwtSEJacmc/od6/private/full

Répondre

0

Je pensais finalement comment utiliser OAuth dans les gadgets.

Vous devez définir dans le XML gadgets, comme ceci:

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

Ensuite, vous serez en mesure d'interroger la feuille de calcul des flux:

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 
    } 
    } 
} 
Questions connexes