2009-11-10 19 views
10

Jestem nowicjuszem OAuth i chcę utworzyć stronę, która pobiera listę kontaktów użytkownika z Google przy użyciu systemu OAuth, aby nie musieli się logować.Jak uzyskać informacje o Kontaktach Google za pomocą Google OAuth?

Jak to zrobić? Używam php, więc naprawdę doceniłbym, jeśli istnieje przykład kodu, który to robi. Nie mogę znaleźć tego w Google.

Proszę pomóc!

Dzięki

+0

Ponadto, istnieją sposoby, aby to zrobić dla Yahoo książek adresowych, itp ...? – chris

Odpowiedz

11

Dla ogólnych zasad OAuth dotyczących dostępu do Google bardzo przydatne może być skorzystanie z Google's OAuth playground (kontakty są tam zawarte).

Jest to bardzo prosty przykład (przy użyciu php OAuth rozszerzenie PECL i SimpleXML, po prostu wypisuje nazwy 25 pierwszych kontaktów):

<?php 
$cons_key="your consumer key"; 
$cons_sec="your consumer secret"; 

$callback="http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']; 

$req_token_url="https://www.google.com/accounts/OAuthGetRequestToken"; 
$auth_token_url="https://www.google.com/accounts/OAuthAuthorizeToken"; 
$acc_token_url="https://www.google.com/accounts/OAuthGetAccessToken"; 

$scope="https://www.google.com/m8/feeds/"; 
$scopes=urlencode($scope); 
$req_scope_token_url=$req_token_url."?scope=".$scopes; 
$endpoint="https://www.google.com/m8/feeds/contacts/default/full/"; 

session_start(); 

if(!isset($_GET['oauth_token']) && $_SESSION['state']==1) $_SESSION['state'] = 0; 

try { 
    $oauth = new OAuth($cons_key,$cons_sec); 
    if(!isset($_GET['oauth_token']) && !$_SESSION['state']) { 
     $oauth = new OAuth($cons_key,$cons_sec); 
     $oauth->setRequestEngine(OAUTH_REQENGINE_CURL); 
     $request_token_info = $oauth->getRequestToken($req_scope_token_url,$callback); 
     if(!empty($request_token_info)) { 
      $_SESSION['token']=$request_token_info['oauth_token']; 
      $_SESSION['secret']=$request_token_info['oauth_token_secret']; 
      $_SESSION['state']=1; 
      header('Location: '.$auth_token_url.'?oauth_token='.$_SESSION['token']); 
      exit; 
     } 
    } else if($_SESSION['state']==1) { 
     $oauth->setToken($_GET['oauth_token'],$_SESSION['secret']); 
     $access_token_info = $oauth->getAccessToken($acc_token_url); 
     $_SESSION['state'] = 2; 
     $_SESSION['token'] = $access_token_info['oauth_token']; 
     $_SESSION['secret'] = $access_token_info['oauth_token_secret']; 
    } 

    $oauth->fetch($endpoint); 
    parseAtom($oauth->getLastResponse()); 

} catch(OAuthException $E) { 
    print_r($E); 
} 

function parseAtom($atomstring) { 
    global $oauth; 
    $atom=simplexml_load_string($atomstring); 
    foreach ($atom->entry as $entry) { 
     print $entry->title.", "; 
    } 
} 
?> 

Można zobaczyć powyższy kod in action here.

Instalowanie (konfigurowanie) rozszerzenia OECH PECL może być trudne, Ty may have to check your php.ini and/or specify a requestengine.

+0

hmm, nie widziałem, że to było stare pytanie z ostatnią odpowiedzią :) – futtta

+1

wydaje się, że jest mały błąd - po uzyskaniu tokena dostępu, kod najpierw używa vars SESSION, aby ustawić token i tylko wtedy je przypisuje. Myślę, że powinno być odwrotnie - setToken powinien pójść po przypisaniach. – StasM

+0

absolutnie stasM; Mylnie skopiowałem/wkleiłem i miałem "$ oauth-> setToken ($ _ SESSION ['token'], $ _ SESSION ['secret']);" tam 2 razy, dzięki za spekulacje! – futtta

1

OK. przede wszystkim futtta miałem pewne problemy z pecl i gruszkami. więc zdecydowałem się trzymać ZEND. Doceniam to, że publikujesz, Twój kod nadal mi pomógł: -) ....

Oto, co mam do tej pory, biorąc część kodu ze strony ibm zamieszczonej powyżej, ale zmieniając ją do użycia OAuth zajechać.

<?php 

session_start(); 

require_once 'common.php'; 
require_once 'Zend/Oauth/Consumer.php'; 
require_once 'Zend/Crypt/Rsa/Key/Private.php'; 

require_once 'Zend/Gdata.php'; 
require_once 'Zend/Gdata/Query.php'; 




$oauthOptions = array(
    'requestScheme'  => Zend_Oauth::REQUEST_SCHEME_HEADER, 
    'version'    => '1.0', 
    'consumerKey'   => 'PUT KEY HERE', 
    'consumerSecret'  => 'PUT KEY HERE', 
    'signatureMethod'  => 'HMAC-SHA1', 
    'requestTokenUrl'  => 'https://www.google.com/accounts/OAuthGetRequestToken', 
    'userAuthorizationUrl' => 'https://www.google.com/accounts/OAuthAuthorizeToken', 
    'accessTokenUrl'  => 'https://www.google.com/accounts/OAuthGetAccessToken' 
); 


?> 


<!DOCTYPE html 
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
    <head> 
    <title>Listing contacts</title> 
    <style> 
    body { 
     font-family: Verdana;  
    } 
    div.name { 
     color: red; 
     text-decoration: none; 
     font-weight: bolder; 
    } 
    div.entry { 
     display: inline; 
     float: left; 
     width: 400px; 
     height: 150px; 
     border: 2px solid; 
     margin: 10px; 
     padding: 5px; 
    } 
    td { 
     vertical-align: top; 
    } 
    </style>  
    </head> 
    <body> 

    <? 



$consumer = new Zend_Oauth_Consumer($oauthOptions); 

if (!isset($_SESSION['ACCESS_TOKEN_GOOGLE'])) { 
    if (!empty($_GET)) { 
     $token = $consumer->getAccessToken($_GET, unserialize($_SESSION['REQUEST_TOKEN_GOOGLE'])); 
     $_SESSION['ACCESS_TOKEN_GOOGLE'] = serialize($token); 
    } else { 
     $token = $consumer->getRequestToken(array('scope'=>'http://www.google.com/m8/feeds')); 
     $_SESSION['REQUEST_TOKEN_GOOGLE'] = serialize($token); 
     $consumer->redirect(); 
     exit; 
    } 
} else { 
    $token = unserialize($_SESSION['ACCESS_TOKEN_GOOGLE']); 
    //$_SESSION['ACCESS_TOKEN_GOOGLE'] = null; 
} 



$http = $token->getHttpClient($oauthOptions); 
$gdata = new Zend_Gdata($http); 
$gdata->setMajorProtocolVersion(3); 

$gdata->getHttpClient()->setRequestScheme(Zend_Oauth::REQUEST_SCHEME_QUERYSTRING); 


$query = new Zend_Gdata_Query('http://www.google.com/m8/feeds/contacts/default/full?); 
//$query->setMaxResults(10); 
$feed = $gdata->getFeed($query); 

?> 



     <h2><?php echo $feed->title; ?></h2> 
     <div> 
     <?php echo $feed->totalResults; ?> contact(s) found. 
     </div> 

     <?php 
     // parse feed and extract contact information 
     // into simpler objects 
     $results = array(); 
     foreach($feed as $entry){ 
     $xml = simplexml_load_string($entry->getXML()); 
     $obj = new stdClass; 
     $obj->name = (string) $entry->title; 
     $obj->orgName = (string) $xml->organization->orgName; 
     $obj->orgTitle = (string) $xml->organization->orgTitle; 

     foreach ($xml->email as $e) { 
      $obj->emailAddress[] = (string) $e['address']; 
     } 

     foreach ($xml->phoneNumber as $p) { 
      $obj->phoneNumber[] = (string) $p; 
     } 
     foreach ($xml->website as $w) { 
      $obj->website[] = (string) $w['href']; 
     } 

     $results[] = $obj; 
     } 


    ?> 

    <?php 
    // display results 
    foreach ($results as $r) { 
    ?> 
    <div class="entry"> 
     <div class="name"><?php echo (!empty($r->name)) ? 
     $r->name : 'Name not available'; ?></div> 
     <div class="data"> 
     <table> 
      <tr> 
      <td>Organization</td> 
      <td><?php echo $r->orgName; ?></td> 
      </tr> 
      <tr> 
      <td>Email</td> 
      <td><?php echo @join(', ', $r->emailAddress); ?></td> 
      </tr> 
      <tr> 
      <td>Phone</td> 
      <td><?php echo @join(', ', $r->phoneNumber); ?></td> 
      </tr> 
      <tr> 
      <td>Web</td> 
      <td><?php echo @join(', ', $r->website); ?></td> 
      </tr> 
     </table> 
     </div> 
    </div> 
    <?php 
    } 
    ?> 

    </body> 
</html> 

Istnieje jeszcze kilka problemów, dla mnie to tylko księguje 25 wyników i nie wydaje się uzyskać setmaxresults do pracy ... nie wydaje się być problemy z Zend za to ... jeśli ktoś zna pracę, proszę opublikuj.

b

1

zakomentuj setRequestScheme wywołanie metody i używać max-wyniki i powinieneś być w stanie uzyskać więcej niż 25 wpisów.

//$gdata->getHttpClient()->setRequestScheme(Zend_Oauth::REQUEST_SCHEME_QUERYSTRING); 

$query = new Zend_Gdata_Query('http://www.google.com/m8/feeds/contacts/default/full/?max-results=999999'); 
Powiązane problemy