Импорт контактов Windows Live

Я начал с импорта контактов из живого. Теперь я не знаю, о чём думает MS, но они серьезно усложняют всё, на что они кладут руки.

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

Вот мой метод:

$import_id = time();
$client_id = "xxx";
$redirect_uri = 'redirecturi';
$client_secret = "xxx";
$code = $_GET['code'];
$grant_type = "authorization_code";

$post = "client_id=$client_id&redirect_uri=$redirect_uri&client_secret=$client_secret&code=$code&grant_type=$grant_type";
$curl = curl_init();
curl_setopt($curl,CURLOPT_URL,"https://login.live.com/oauth20_token.srf");
curl_setopt($curl,CURLOPT_POST,5);
curl_setopt($curl,CURLOPT_POSTFIELDS,$post);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
$result = curl_exec($curl);
curl_close($curl);
$token = json_decode($result);
$access_token = $token->access_token;
$user_id = $token->user_id;

$url = "https://apis.live.net/v5.0/me/contacts?access_token=$access_token";
$response =  curl_file_get_contents($url);
$response = json_decode($response);
foreach($response->data as $contact) {
$contact_details = curl_file_get_contents("https://apis.live.net/v5.0/" . $contact->id . "?access_token=$access_token");
debug($contact_details);
}
die();

Тем не менее, я получаю информацию только таким образом (у этого знакомого человека есть контактный номер, который я вижу, когда вижу его на people.live.com):

{
"id": "contact.id",
"first_name": "Danie",
"last_name": "Van den Heever",
"name": "Danie Van den Heever",
"is_friend": false,
"is_favorite": false,
"user_id": "userid",
"email_hashes": [
"emailhash"],
"updated_time": "2014-09-17T12:11:10+0000"}

URL-адрес моего запроса на разрешение (который определяет области действия) выглядит следующим образом:

https://login.live.com/oauth20_authorize.srf?client_id=clientidkey&scope=wl.basic%20wl.offline_access&response_type=code&redirect_uri=redirecturi

Должен ли я добавить больше областей, чтобы получить контактный номер? Если да, то какие сферы? Или это невозможно?

2

Решение

Решение заключается в использовании недокументированной области wl.contacts_phone_numbersСуществует риск того, что он станет устаревшим или просто заблокированным, и только клиенты, одобренные Microsoft, смогут использовать его, но пока он работает.

Также вам не нужно делать дополнительный запрос для каждого контакта, объект контакта, который вы получаете от me/contacts уже есть номера телефонов в phones объект.

Кстати, вот код, который я использовал при тестировании этого, я использовал Клиентская библиотека REST что позволяет избежать копирования / вставки длинных и повторяющихся параметров cURL каждый раз и превращает запросы в однострочные.

Код для запроса разрешения:

$params = ["client_id" => "...", "scope" => "wl.basic wl.contacts_phone_numbers", "response_type" => "code", "redirect_uri" => "http://sanctuary/contacts_callback.php"];

header("Location: https://login.live.com/oauth20_authorize.srf?".http_build_query($params));

Обратите внимание на дополнительные wl.contacts_phone_numbers область в запросе разрешения.

Код для получения токена доступа и получения контактов:

// Composer's autoloader, required to load libraries installed with it
// in this case it's the REST client
require "vendor/autoload.php";

// exchange the temporary token for a reusable access token
$resp = GuzzleHttp\post("https://login.live.com/oauth20_token.srf", ["body" => ["client_id" => "...", "client_secret" => "...", "code" => $_GET["code"], "redirect_uri" => "http://sanctuary/contacts_callback.php", "grant_type" => "authorization_code"]])->json();
$token = $resp["access_token"];

// REST client object that will send the access token by default
// avoids writing the absolute URL and the token each time
$client = new GuzzleHttp\Client(["base_url" => "https://apis.live.net/v5.0/", "defaults" => ["query" => ["access_token" => $token]]]);

// get all the user's contacts
$contacts = $client->get("me/contacts")->json()["data"];

// iterate over contacts
foreach ($contacts as $contact) {
// if that contact has a phone number object
if (array_key_exists("phones", $contact)) {
// iterate over each phone number
foreach ($contact["phones"] as $phone) {
// if number isn't blank
if (!empty($phone)) {
// do whatever you want with that number
}
}
}
}

Вот что me/contacts выглядит как с дополнительной областью (за исключением нескольких разрывов строк и личной информации):

Array (
[data] => Array (
[0] => Array (
[id] => contact...
[first_name] => ...
[last_name] => ...
[name] => ...
[is_friend] =>
[is_favorite] =>
[user_id] =>
[email_hashes] => ...
[updated_time] => ...
[phones] => Array ( // what you asked for
[personal] =>
[business] =>
[mobile] => +337...
)
)
)
)
4

Другие решения

От чтения документация, номера телефонов являются частью User объект.

Чтобы получить их номера телефонов, вы бы;

  • Получите список их контактов (что вы сделали)
  • Итерация по набору результатов
  • Получить идентификатор пользователя из ответа контакта. (Key id)
  • Сделать запрос на User Коллекция (с wl.phone_numbers объем)
  • Посмотрите, являются ли номера телефонов нулевыми или нет
    • Если они равны NULL, пропустите итерацию

Пример телефона объектов (в User ответ);

"phones": {
"personal": "(555) 555-1212",
"business": "(555) 111-1212",
"mobile": null
}

Так;

$arrUser = json_decode($strResponse, true);

if( is_null($arrUser['phones']['personal'])
AND is_null($arrUser['phones']['business']
AND is_null($arrUser['phones']['mobile']) ) {
//No phone numbers
//Assuming you're in a loop, fetching a user object for each contact - skip the iteration & move onto the next contact.
continue;
}
0

По вопросам рекламы [email protected]