Google API 联系人 PHP SimpleXML

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

1
你看过XML文件了吗?包含名字的元素叫什么? - JJJ
是的,我有,并且它被命名为gd:name。我已经尝试过了,但我认为如果你使用//,你可以直接跳转到gd:givenName。如果我不正确,那么为什么gd:email会起作用呢? - Claude Grecea
3个回答

5

我从Google联系人API获取的XML是混合的,名称是普通XML节点“title”的节点值,但电子邮件是标签中的参数。考虑到可能有多个电子邮件地址,我使用以下方法提取单个姓名/电子邮件对的数组:

$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);
  }
}

2
上面的例子(来自谷歌客户端API示例)对于电子邮件无效。 我尝试了很多次,但是对我而言,响应包含其他信息而不是电子邮件。 我发现了一个谷歌小组讨论,他们在谈论这个问题,似乎是simplexml看不到一些gd:信息的错误。 我像克劳德一样使用simpleXMLElements和xpath,但对我而言,我只能获取电子邮件。

1
你有那个主题的链接吗? - bvanvelsen - ACA Group
是的,基本链接 @bvanvelsen - jacopo.galli

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>";
}

有人能给我一个示例,说明如何检索数据吗?因为谷歌没有联系人的示例。 - Claude Grecea
克劳德,我认为你遇到的问题不是检索,而是解析。你已经成功地检索到数据了,对吗?上面的示例展示了如何解析它。 - Cheeso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接