2009-11-10 59 views
10

我是OAuth新手,想要創建一個頁面,使用OAuth系統從Google獲取用戶的聯繫人列表,以便他們不必登錄。如何使用Google OAuth獲取Google通訊錄信息?

我該怎麼做?我使用的是PHP,所以如果有這樣的代碼示例,我將非常感激。我似乎無法在Google上找到它。

請幫忙!

感謝

+0

此外,是否有辦法雅虎地址簿,等等這樣做......有幫助的呢? – chris 2009-11-10 08:42:21

回答

11

對於訪問Google的一般OAuth原則,您可能會發現Google's OAuth playground非常有用(聯繫人包含在那裏)。

這是一個非常基本的例子(使用PHP的OAuth PECL擴展和SimpleXML,它只是打印出25個聯繫人的姓名):

<?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.", "; 
    } 
} 
?> 

你可以看到上面的代碼in action here

安裝(配置)oauth pecl擴展可能會很棘手,您may have to check your php.ini and/or specify a requestengine

+0

嗯,沒有看到這實際上是一個老問題,最近的回覆:) – futtta 2010-08-24 09:38:22

+1

似乎有一個小錯誤 - 獲取訪問令牌後,代碼首先使用SESSION變量設置令牌,然後才分配它們。我認爲它應該是反向的--setToken應該在分配之後進行。 – StasM 2010-10-27 21:35:35

+0

絕對stasM;我錯誤地複製/粘貼了「$ oauth-> setToken($ _ SESSION ['token'],$ _ SESSION ['secret']);」在那裏2次,感謝您的發現! – futtta 2010-11-03 14:05:45

1

好的。首先,我有一些pecl和梨的問題。所以我決定堅持使用ZEND。我很感激你發佈雖然,你的代碼仍然幫助我: - )....

這是我迄今爲止,從上面張貼的ibm頁面的一些代碼,但改變它使用OAuth的才能進去。

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

還存在一些問題,對我來說唯一的支柱25分的結果,我似乎無法得到setmaxresults工作...似乎有與Zend問題爲...如果有人知道周圍的工作,請張貼。

b

1

註釋掉setRequestScheme方法調用,並使用最大結果,你應該能夠獲得超過25項。

//$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'); 
相關問題