PHP Curl с календарем Google
<?php
if(isset($_GET['token']))
{
$url="http://www.google.com/calendar/feeds/default/allcalendars/full";
$useragent="PHP 5.2";
$header=array( "GET /accounts/AuthSubSessionToken HTTP/1.1",
"Content-Type: application/x-www-form-urlencoded",
"Authorization: AuthSub token=".$_GET['token'],
"User-Agent: PHP/5.2",
"Host: https://www.google.com",
"Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2",
"Connection: keep-alive"
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_URL, $url);
$data = curl_exec($ch);
print_r($data);
}
?>
В результате страница не найдена. Однако я звоню по http://www.google.com/calendar/feeds/default/allcalendars/full из firefox, он возвращает XML-файл. Так что, я думаю, мой код может быть неправильным. Но я не могу найти ошибку.:(
3 ответа
Я понял.... я так изменился
<?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(isset($_GET['token']))
{
$sessiontoken=get_session_token($_GET['token']);
$accountxml = make_api_call("http://www.google.com/m8/feeds/contacts/yourmail@gmail.com/full", $sessiontoken);
print_r($accountxml);
}
else
{
$next=urlencode("http://www.mysteryzillion.org/gdata/index.php");
$scope=urlencode("http://www.google.com/m8/feeds/contacts/yourmail@gmail.com/full");
?>
<a href="https://www.google.com/accounts/AuthSubRequest?next=<?= $next ?>&scope=<?= $scope ?>&secure=0&session=1">Click here to authenticate through Google.</a>
<?
}
?>
Я думаю, что вы можете переопределить URL с этой строкой в заголовке:
GET /accounts/AuthSubSessionToken HTTP/1.1
Я думаю, что это будет указывать CURL на http://www.google.com/accounts/AuthSubSessionToken
Что происходит, когда вы удаляете это?
Это потому, что вы получаете доступ к Календарю Google через свой персональный порт. Всякий раз, когда вы получаете доступ к этому конкретному URL, Google проверяет, вошли ли вы в систему. Если нет, отправляет 404. Если вы это делаете, он выводит календарь на основе предоставленных вами настроек. В этом URL-адресе не указан конкретный календарь, который он должен извлекать с сайта, и он не может использовать файлы cookie, хранящиеся на компьютере пользователя, поскольку он выбирается с вашего сервера, на котором не будет файлов cookie для календаря. Когда я пытаюсь получить доступ к этой странице без входа в систему, я получаю ошибку 401 Authorization Required, которая, я уверен, это то, что получает PHP, а вы просто не понимаете этого.
Вам нужно зайти в настройки своего Календаря Google и найти параметры для встраивания, чтобы найти URL, относящийся к вашей учетной записи, чтобы он всегда получал фид XML для вашего календаря.
Подробнее о "Календарном адресе Google" читайте здесь: http://www.google.com/support/calendar/bin/answer.py?answer=34578
Просмотреть из других приложений: http://www.google.com/support/calendar/bin/answer.py?hl=en&answer=37648