PHP Curl с календарем Google - PullRequest
       25

PHP Curl с календарем Google

0 голосов
/ 19 января 2010
<?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 ]

0 голосов
/ 19 января 2010

Я думаю, что вы можете переопределить URL с помощью этой строки в заголовке:

GET /accounts/AuthSubSessionToken HTTP/1.1

Я думаю, что это будет указывать CURL на http://www.google.com/accounts/AuthSubSessionToken

Что происходит, когда вы его удаляете?

0 голосов
/ 19 января 2010

Я понял .... Я изменился вот так

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

<?
}
?>
0 голосов
/ 19 января 2010

Это потому, что вы получаете доступ к Календарю 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...