Google Контакты API получить номер телефона (PHP)


Я использую API контактов Google и могу извлекать имена и адреса электронной почты, но я хотел бы также получить фотографии профиля и номера телефонов.

Я использую PHP, и вот мой код при аутентификации:

//if authenticated successfully...

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

$doc = new DOMDocument;
$doc->recover = true;
$doc->loadXML($val->getResponseBody());

$xpath = new DOMXPath($doc);
$xpath->registerNamespace('gd', 'http://schemas.google.com/g/2005');

$emails = $xpath->query('//gd:email');

foreach ( $emails as $email ){

  echo $email->getAttribute('address'); //successfully gets person's email address

  echo $email->parentNode->getElementsByTagName('title')->item(0)->textContent; //successfully gets person's name

}

НОМЕР ТЕЛЕФОНА

Эта часть получения номера телефона не работает.

$phone = $xpath->query('//gd:phoneNumber');

foreach ( $phone as $row ){

  print_r($row); // THIS PART DOESNT WORK

}

ФОТОГРАФИЯ ПРОФИЛЯ

Судя по ссылке API выше, похоже, что я также могу захватить фотографию профиля с URL: https://www.google.com/m8/feeds/contacts/default/full но я не уверен, как найти его в DOMXPath $xpath объект, который я сгенерировал.

Мысли?

Author: tim peterson, 2015-07-14

1 answers

API контактов Google использует канал Atom. Контакты представлены в виде элементов entry. Так что имеет больше смысла повторять их. Для этого вам также необходимо зарегистрировать префикс для пространства имен atom.

$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
$xpath->registerNamespace('atom', 'http://www.w3.org/2005/Atom');
$xpath->registerNamespace('gd', 'http://schemas.google.com/g/2005');

Если вы используете DOMXPath::evaluate(), вы можете использовать выражения, возвращающие скаляры. Второй аргумент является контекстным узлом для выражения.

foreach ($xpath->evaluate('/atom:feed/atom:entry') as $entry) {
  $contact = [
    'name' => $xpath->evaluate('string(atom:title)', $entry),
    'image' => $xpath->evaluate('string(atom:link[@rel="http://schemas.google.com/contacts/2008/rel#photo"]/@href)', $entry),
    'emails' => [],
    'numbers' => []
  ];
  foreach ($xpath->evaluate('gd:email', $entry) as $email) {
    $contact['emails'][] = $email->getAttribute('address');
  }
  foreach ($xpath->evaluate('gd:phoneNumber', $entry) as $number) {
    $contact['numbers'][] = trim($number->textContent);
  }
  var_dump($contact);
}

С первым примером ответа из Документации Google Contacts API это возвращает:

array(3) {
  ["name"]=>
  string(17) "Fitzwilliam Darcy"
  ["image"]=>
  string(64) "https://www.google.com/m8/feeds/photos/media/userEmail/contactId"
  ["email"]=>
  string(0) ""
  ["numbers"]=>
  array(1) {
    [0]=>
    string(3) "456"
  }
}

Пример не содержит элемента email, поэтому он пуст. У контакта может быть несколько адресов электронной почты и/или номеров телефонов или их вообще не может быть. Атрибут rel предназначен для классификации их как дома, на работе,...

Получение изображения:

Изображение предоставляется в виде элемента Atom link с определенным атрибутом rel.

atom:link[@rel="http://schemas.google.com/contacts/2008/rel#photo"]

Это вернет узел link, но можно получить атрибут href напрямую:

atom:link[@rel="http://schemas.google.com/contacts/2008/rel#photo"]/@href

Приведите список узлов атрибутов в строку:

string(atom:link[@rel="http://schemas.google.com/contacts/2008/rel#photo"]/@href)

 2
Author: ThW, 2015-07-14 13:26:59