Microsoft a lui aussi son API pour permettre aux développeurs que nous sommes la récupération des contacts de nos utilisateurs de manière sécurisée.
Elle est nommé : Windows Live Contacts API et décrite sur le MSDN.

Voyons maintenant comment l’utiliser avec PHP 5. Le principe est très similaire à Google et son Google Contact Data API : l’utilisateur est redirigé sur le site de Microsoft pour s’identifier et donner son autorisation, puis est redirigé sur le site source avec un token permettant de récupérer les données.

Une petite particularité de cette API est qu’elle va poster le token depuis une page sécurisée. Le résultat : si votre page de retour n’est pas en HTTPS, vos utilisateurs auront un message d’avertissement de leur navigateur comme quoi des informations sont transmises sur un page non sécurisé. Il vous faudra donc investir dans un certificat SSL.

Enregistrement de votre clé d’API : Avant de commencer, vous devez vous enregistrer auprès de Microsoft pour pouvoir utiliser l’API. Il suffit de se rendre sur la page : Windows Live API Application Center et créer une clé d’API.

Création de l’URL : celle ci sera de la forme :
https://consent.live.com/Delegation.aspx
?RU=https%3A%2F%2Fmonsite.com%2Fimport.php
&ps=Contacts.View
&pl=http%3A%2F%2Fmonsite.com%2Fpolicy.html

  • RU : correspond à l’URL de retour après la validation de la demande
  • ps : correspond au service auquel vous souhaitez accéder
  • et pl : à un lien vers la politique de confidentialité de votre site.

Récupération des contacts : Pour cela, vous devez créer une page import.php par exemple et inclure le code suivant :

function isEmail($email) {
	return filter_var($email, FILTER_VALIDATE_EMAIL);
}

function unfucked_base_convert ($numstring, $frombase, $tobase)	{
	$chars = "0123456789abcdefghijklmnopqrstuvwxyz";
	$tostring = substr($chars, 0, $tobase);

	$length = strlen($numstring);
	$result = '';
	for ($i = 0; $i < $length; $i++) {
		$number[$i] = strpos($chars, $numstring{$i});
	}
	do {
		$divide = 0;
		$newlen = 0;
		for ($i = 0; $i < $length; $i++) {
			$divide = $divide * $frombase + $number[$i];
			if ($divide >= $tobase) {
				$number[$newlen++] = (int)($divide / $tobase);
				$divide = $divide % $tobase;
			} elseif ($newlen > 0) {
				$number[$newlen++] = 0;
			}
		}
		$length = $newlen;
		$result = $tostring{$divide} . $result;
	}
	while ($newlen != 0);
	return $result;
}

function hexaTo64SignedDecimal($hexa) {
	$bin = unfucked_base_convert($hexa, 16, 2);
	if(64 === strlen($bin) and 1 == $bin[0]) {
		$inv_bin = strtr($bin, ‘01′, ‘10′);
		$i = 63;
		while (0 !== $i) {
			if(0 == $inv_bin[$i]) {
				$inv_bin[$i] = 1;
				$i = 0;
			}
			else {
				$inv_bin[$i] = 0;
				$i–;
			}
		}
		return ‘-’.unfucked_base_convert($inv_bin, 2, 10);
	}
	else {
		return unfucked_base_convert($hexa, 16, 10);
	}
}

function email2nickname($email) {
	$output = str_replace(array(’.', ‘-’, ‘_’, ‘,’, ‘:’), ‘ ‘, substr($email, 0, strpos($email, ‘@’)));
	$output = str_replace(array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), ”, $output);
	$output = ucwords($output);
	return $output;
}

function grabLiveContacts($token) {
	if(!empty($token)) {
		parse_str(urldecode($token), $result);
		$intlid = hexaTo64SignedDecimal($result[’lid’]);

		$url = ‘https://livecontacts.services.live.com/users/@C@’.
				$intlid.’/rest/livecontacts’;

		$headers = array(
			‘Authorization: DelegatedToken dt=”‘.$result[’delt’].’”‘
		);

		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_TIMEOUT, 60);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
		curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
		$data = curl_exec($ch);
		$xml = new SimpleXMLElement($data);

		$grab = array();
		$grab[’user’] = array(
			‘name’=>trim(strval($xml->Owner->Profiles->Personal->DisplayName)),
			‘email’=>trim(strval($xml->Owner->WindowsLiveID)), ‘token’=>$token
		);
		$grab[’contacts’] = array();

		foreach ($xml->Contacts->Contact as $entry) {
			$name = trim(strval($entry->Profiles->Personal->DisplayName));
			$email = trim(strval($entry->Emails->Email->Address));
			if(!empty($email)) {
				if(empty($name)) {
					$name = trim(strval($entry->Profiles->Personal->FirstName));
					$name .= ‘ ‘.trim(strval($entry->Profiles->Personal->LastName));
					$name = trim($name);
				}
				if(empty($name)) {
					$name = trim(strval($entry->Profiles->Personal->NickName));
				}
				if(empty($name) or isEmail($name)) {
					$name = email2nickname($email);
				}
				$grab[’contacts’][] = array(’name’=>$name, ‘email’=>$email);
			}
		}

		return $grab;
	}
	else return false;
}

if(isset($_POST[’ConsentToken’])) {
	$grab = grabLiveContacts($_POST[’ConsentToken’]);
	print_r($grab);
}

Voilà vous avez tout ce qu’il vous faut pour adapter ce code pour votre application. Vous devez aussi ajouter le traitement d’erreurs qui n’est pas présent ici et dépend de votre application.