これが私がこれまでに考え出したものです:
ID「0Aj3x4n7SOPMRdFA2VmJuampIUDFzdlAwRUwtSEJacmc」のスプレッドシート「od6」のコンテンツを取得するには、次のURLにアクセスする必要があります: https ://spreadsheets.google.com/feeds/cells/0Aj3x4n7SOPMRdFA2VmJuampIUDFzdlAwwt
(APIを参照)
URLをブラウザに入力すると、これは正常に機能します(GDocsにログインしていて、Cookieが設定されているため)。
Gmailガジェット内から上記のURLにアクセスしたい場合は、2つのオプションがあると思います。
- Ajax経由でロードします
- ガジェットを生成するPHPに直接ロードします
最初のアプローチでは、Ajax呼び出しでCookieが認識されないという問題が発生しました(これは、関係するドメインが異なるためだと思います)。
背景情報:私のガジェット-PHP-Scriptは私のホスト(https://sslsites.de)で実行されます。このガジェットはGMailによって読み込まれ、ある種のプロキシを介して提供されます(したがって、IFrame内の私のガジェットのホストはhttp:/です。 /kipb0cvv7sa9gunc3o5eii57sr1eoem5-a-gm-opensocial.googleusercontent.com/gadgets)。ロケーションバー(IFramesの親)のURLはhttps://mail.google.com/mailです。
したがって、このIFrameからのAjax呼び出しは、ドメインhttps://spreadsheets.google.comにCookieを送信できません。右?応答は空です。
次に、2番目のアプローチを試しました。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に登録すると、ブラウザはGMailガジェットプロキシを介してCookieを渡しません。プロキシ(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