<?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. Итак, я думаю, мой код может ошибаться. Но я не могу найти ошибку. 🙁
Это связано с тем, что вы получаете доступ к Календарю Google через свой личный порт. Всякий раз, когда вы обращаетесь к этому конкретному URL-адресу, Google проверяет, не вошли ли вы в систему. Если нет, он отправляет 404. Если вы, он выдает календарь на основе настроек, которые вы указали. В этом URL-адресе не указан конкретный календарь, который он должен вытащить с сайта, и он не может использовать файлы cookie, хранящиеся на компьютере пользователя, потому что он извлекается с вашего сервера, у которого не будет файлов cookie для календаря. Когда я пытаюсь получить доступ к этой странице без входа в систему, я получаю ошибку, требуемую авторизацией 401, на которую я ставлю то, что получает 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=ru&answer=37648.
Я думаю, что вы можете переопределить URL этой строки в заголовке:
GET /accounts/AuthSubSessionToken HTTP/1.1
Я думаю, что он укажет CURL на http://www.google.com/accounts/AuthSubSessionToken
Что происходит, когда вы удаляете его?
Я понял … Я изменился так
<?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> <? } ?>
.<?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> <? } ?>