2009-11-10 3 views
10

私はOAuthを初めて使用しており、ログインする必要がないようにOAuthシステムを使用してGoogleからユーザーの連絡先リストを取得するページを作成したいと考えています。Google OAuthを使用してGoogleコンタクトの情報を取得するにはどうすればよいですか?

どうすればよいですか?私はPHPを使用しているので、これを行うサンプルコードがあれば本当に感謝します。私はGoogle上で見つけることができない。

助けてください!

おかげ

+0

(PHP(グーグルのOAuth)でのGoogleの連絡先リストリーダー)すべてに私のポストは役に立ちホープまた、Yahooのアドレス帳などのためにこれを行う方法は...あるのですか? – chris

答えて

11

Googleにアクセスする一般的なOAuthの原則については、Google's OAuth playgroundが非常に便利です(連絡先はそこに含まれています)。あなたは上記のコードin action hereを見ることができます

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

これは非常に基本的な例(PHPののOAuth PECL拡張モジュールとのSimpleXMLを使って、それだけで25人の最初の連絡先の名前をプリントアウト)です。

oauth pecl拡張機能のインストール(設定)が難しい場合があります。may have to check your php.ini and/or specify a requestengine

+0

ええと、これは実際には最近の返信で古い質問だったとは思わなかった: – futtta

+1

小さなバグがあるようだ - アクセストークンを取得した後、コードは最初にSESSION varsを使用してトークンを設定し、私は逆にするべきだと思う - setTokenは割り当ての後に行くべきです。 – StasM

+0

絶対にstasM;私は誤ってコピーして貼り付けて、 "$ oSession ['token]、$ _ SESSION [' secret ']);"そこに2回、スポッティングのおかげで! – futtta

1

OK。まず第一にfuttta私はペールと梨のものにいくつかの問題がありました。だから私はZENDにこだわることに決めました。

上記のibmページからコードの一部を取り出して使用していますが、使用するように変更しています。いくつかの問題が残っています。

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

に取得するためのOAuthは、私のためにそれが唯一の25件の結果をポストし、私ははsetMaxResultsが動作するように見えることはできません...そのためのZENDに問題があるようです...場合誰かが周りの仕事を知っている、投稿してください。

B

1

コメントアウトsetRequestSchemeメソッド呼び出しをとmax-結果を使用して、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'); 
関連する問題