4

我希望从谷歌联系人中获取联系人的名字,但没有任何运气。但是,我能够提取电子邮件地址没有问题。有人可以告诉我我做错了什么吗?

$xmlresponse=file_get_contents('https://www.google.com/m8/feeds/contacts/default/full?oauth_token='.$accesstoken);
//reading xml using SimpleXML
$xml=  new SimpleXMLElement($xmlresponse);
$xml->registerXPathNamespace('gd', 'http://schemas.google.com/g/2005');

$nameFirst = $xml->xpath('//gd:givenName'); // I have also tried //gd:name
$result = $xml->xpath('//gd:email');

foreach($nameFirst as $nameF){
echo $nameF->getName();
}
foreach ($result as $title) {
echo $title->attributes()->address . "<br>";
}
?>
4

3 回答 3

5

我从 Google Contacts API 获得的 XML 是混合的,名称是普通 XML 节点“标题”的节点值,但电子邮件是gdatatag中的参数gd:email。考虑到多个电子邮件地址的可能性,我使用以下方法来提取单个名称/电子邮件对的数组:

$req = new Google_HttpRequest("https://www.google.com/m8/feeds/contacts/default/property-email/");
$val = $this->client->getIo()->authenticatedRequest($req);
$xml = simplexml_load_string($val->getResponseBody());
$xml->registerXPathNamespace('gd', 'http://schemas.google.com/g/2005');

$output_array = array();
foreach ($xml->entry as $entry) {
  foreach ($entry->xpath('gd:email') as $email) {
    $output_array[] = array((string)$entry->title, (string)$email->attributes()->address);
  }
}
于 2013-04-19T23:52:47.377 回答
2

上面的示例(来自 google 客户端 api 示例)不适用于电子邮件。我尝试了很多,对我来说,回复包含其他信息,但不包含电子邮件。我发现了一个谷歌 小组的讨论,他们在讨论这个问题,这似乎是一个 bug,simplexml 没有看到一些 gd: 信息。

我像 Claude 一样使用 simpleXMLElements 和 xpath,但对我来说,我也只能收到电子邮件。

于 2012-10-22T13:51:45.407 回答
0

Google提供了一个 PHP 客户端库,用于与它提供的各种服务进行交互。联系人就是其中之一。

联系人服务的示例代码使用了 json 编码和解码结果的技巧:

require_once '../../src/apiClient.php';
session_start();

$client = new apiClient();
$client->setApplicationName('Google Contacts PHP Sample');
$client->setScopes("http://www.google.com/m8/feeds/");
// Documentation: http://code.google.com/apis/gdata/docs/2.0/basics.html
// Visit https://code.google.com/apis/console?api=contacts to generate your
// oauth2_client_id, oauth2_client_secret, and register your oauth2_redirect_uri.
// $client->setClientId('insert_your_oauth2_client_id');
// $client->setClientSecret('insert_your_oauth2_client_secret');
// $client->setRedirectUri('insert_your_redirect_uri');
// $client->setDeveloperKey('insert_your_developer_key');

if (isset($_GET['code'])) {
  $client->authenticate();
  $_SESSION['token'] = $client->getAccessToken();
  $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
  header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));
}

if (isset($_SESSION['token'])) {
 $client->setAccessToken($_SESSION['token']);
}

if (isset($_REQUEST['logout'])) {
  unset($_SESSION['token']);
  $client->revokeToken();
}

if ($client->getAccessToken()) {
  $req = new apiHttpRequest("https://www.google.com/m8/feeds/contacts/default/full");
  $val = $client->getIo()->authenticatedRequest($req);

  // The contacts api only returns XML responses.
  $response = json_encode(simplexml_load_string($val->getResponseBody()));
  print "<pre>" . print_r(json_decode($response, true), true) . "</pre>";

  // The access token may have been updated lazily.
  $_SESSION['token'] = $client->getAccessToken();
} else {
  $auth = $client->createAuthUrl();
}

if (isset($auth)) {
    print "<a class=login href='$auth'>Connect Me!</a>";
  } else {
    print "<a class=logout href='?logout'>Logout</a>";
}
于 2012-07-12T06:46:59.967 回答