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
объект, который я сгенерировал.
Мысли?
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)