Sommaire:
Nous avons vu dans une première partie comment accéder a l’API LinkedIn via le protocole d’authentification Oauth.
Dans cette seconde partie nous allons enrichir notre Classe PHP LinkedIn pour y rajouter des méthodes (fonctions) permettant:
Voici un Screencast suivi d’un tutorial vous expliquant comment acceder a votre Statut LinkedIn et le Mettre a jour:
http://blip.tv/file/get/Formatix-LinkedInAPIZendOAuthStatusManagementfr609.mp4
Le Tutorial Ecrit
Cette Etape fait l’objet du premier Screencast LinkedIn API avec PHP Zend OAuth . Il est donc recommandé d’y jeter un oeil avant d’entreprendre celui-ci.
Pour info cette etape se decompose en 5 phases:
public function getStatus()
{
// Fixer l'URI permettant la recuperation du Statut LinkedIn
// de l'utilisateur Logge
$this->client->setUri('http://api.linkedin.com/v1/people/~:(current-status)');
// Fixer la Methode HTTP (GET, POST, DELETE and PUT)
$this->client->setMethod(Zend_Http_Client::GET);
// Recuperation de la reponse a cette requete HTTP
$response = $this->client->request();
// Recuperation du corps de cette reponse
$content = $response->getBody();
// Utilisation de SimpleXML pour transformer la chaine XML en Objet PHP
$xml = simplexml_load_string($content);
$status = (string) $xml->{'current-status'};
return $status;
}
/*
* @abstract: Creation de la chaine XML contenant le Statut de l'Utilisateur
*/
private function createXmlStatus($status)
{
$xml = '<?xml version="1.0" encoding="UTF-8"?><current-status>'.$status.'</current-status>';
return $xml;
}
public function updateStatus($status)
{
// Fixer l'URI permettant la mise a jour du Statut LinkedIn
// de l'utilisateur Logge
$this->client->setUri('https://api.linkedin.com/v1/people/~/current-status');
// Fixer la Methode HTTP (GET, POST, DELETE and PUT)
$this->client->setMethod(Zend_Http_Client::PUT );
// Creation de la Chaine XML qui sera passe via le PUT
$xml = $this->createXmlStatus($status);
// On demande a passer cette chaine via le PUT
$this->client->setRawData($xml,'text/xml');
// On fixe l'entete HTTP
$this->client->setHeaders('Content-Type', 'text/xml');
// Executer la Requete
$response = $this->client->request();
}
public function clearStatus()
{
// Fixer l'URI permettant la mise a jour du Statut LinkedIn
// de l'utilisateur Logge
$this->client->setUri('https://api.linkedin.com/v1/people/~/current-status');
// Fixer la Methode HTTP (GET, POST, DELETE and PUT)
$this->client->setMethod(Zend_Http_Client::DELETE );
// Executer la Requete
$response = $this->client->request();
$content = $response->getBody();
echo $content;
}
A l’heure ou j’écris ces lignes le module Zend_OAuth contient encore un certain nombre de bugs qui seront très probablement résolus des que Zend_OAuth intègrera officiellement le Zend Framework c’est a dire dans la version 1.10 du Zend Framework.
Afin de pourvoir faire un “PUT” ou un “DELETE” il va vous falloir en attendant modifier 2 Méthodes.
Dans le fichier incubator/library/Zend/Oauth/Client.php commentez le if/else et appelez setRequestMethod quelque soit la valeur de $method.
public function setMethod($method = self::GET)
{
$this->setRequestMethod($method);
//if ($method == self::GET) {
// $this->setRequestMethod(self::GET);
//} elseif($method == self::POST) {
// $this->setRequestMethod(self::POST);
//}
return parent::setMethod($method);
}
Puis vous vou rendrez compte que la fonction setRequestMethod ne connait ni le PUT ni le DELETE
Dans le fichier /incubator/library/Zend/Oauth/Config.php vous devrez donc faire en sorte que le paramètre $method soit pris en compte si c’est un PUT ou un DELETE
Vous pouvez faire ceci rapidement en commentant le contrôle qui est fait sur $method:
public function setRequestMethod($method)
{
$method = strtoupper($method);
//if (!in_array($method, array(Zend_Oauth::GET, Zend_Oauth::POST))) {
// require_once 'Zend/Oauth/Exception.php';
// throw new Zend_Oauth_Exception('Invalid method: '.$method);
//}
$this->_requestMethod = $method;
}
Ou plus proprement en rajoutant PUT et DELETE au tableau de contrôle
public function setRequestMethod($method)
{
$method = strtoupper($method);
if (!in_array($method, array(Zend_Oauth::GET, Zend_Oauth::POST, Zend_Oauth::PUT, Zend_Oauth::DELETE))) {
require_once 'Zend/Oauth/Exception.php';
throw new Zend_Oauth_Exception('Invalid method: '.$method);
}
$this->_requestMethod = $method;
}
Le Test de la classe php LinkedIn se passe en 3 etapes
Dans Notre exemple ci-dessous
/*
*
* @abstract: Test de la Classe Php LinkedIn
* @author: Christophe Fiat
* @copyright: FormatiX.EU
*
*/
// Creation d'une Instance de notre classe PHP linkedIn
$linkedin = new linkedIn($params);
// connection a l'API LinkedIn Via OAuth
$linkedin->connect();
// Appel de la Methode whoAmI
// afin de reccuperer les infos du Profil LinkedIn de l'utilisateur Logge
$profilInfo =$linkedin->whoAmI();
// Affichage des infos du Profil LinkedIn de l'utilisateur Logge
echo'<h2>Prenom: '.$profilInfo['firstName']. '</h2>';
echo'<h2>Nom: '.$profilInfo['lastName']. '</h2>';
echo'<h2>Fonction: '.$profilInfo['headline']. '</h2>';
echo'<h2><a href="'.$profilInfo['profilUrl'].'">Profil LinkedIn </a></h2>';
// Obtention du Statut LinkedIn de l'utilisateur Logge
$userStatus = $linkedin->getStatus();
// Affichage du Statut
if(!empty($userStatus))
{
echo"<h2>Statut de ".$profilInfo['firstName'] . ' ' . $profilInfo['lastName'] .":
$userStatus </h2>";
}
else
{
echo'<h2>Pas de Statut</h2>';
}
// Modification du Statut LinkedIn de l'utilisateur Logge
$linkedin->updateStatus('Teste la Classe PHP linkedIn');
// Obtention du nouveau Statut LinkedIn de l'utilisateur Logge
$userStatus = $linkedin->getStatus();
// Affichage du nouveau statut LinkedIn
if(!empty($userStatus))
{
echo"<h2>Statut de ".$profilInfo['firstName'] . ' ' . $profilInfo['lastName'] .":
$userStatus </h2>";
}
else
{
echo'<h2>Pas de Statut</h2>';
}
// Effacement du Statut LinkedIn de l'utilisateur Logge
$linkedin->clearStatus();
// Obtention du nouveau Statut LinkedIn de l'utilisateur Logge
$userStatus = $linkedin->getStatus();
// Affichage du nouveau statut LinkedIn
if(!empty($userStatus))
{
echo"<h2>Statut de ".$profilInfo['firstName'] . ' ' . $profilInfo['lastName'] .":
$userStatus </h2>";
}
else
{
echo'<h2>Pas de Statut</h2>';
}
<?php
/*
*
* @abstract: Cette Classe sert a accéder a l'API de LinkedIn en utilisant l'Authentification Oauth Authentication Protocol
* @author: Christophe Fiat
* @version: 0.2 2009-12-06
* @copyright: FormatiX.EU
*
*/
class linkedIn
{
private $options;
private $consumer;
private $client;
private $token;
public function __construct($params)
{
// @todo Vous devez mettre a jour les chemins vers Zend et son incubateur
set_include_path( $params['zendPath'] . PATH_SEPARATOR . $params['zendIncubatorPath'] . PATH_SEPARATOR . get_include_path() );
// Inclusion de la class Oauth Consumer
require_once('Zend/Oauth/Consumer.php');
// Definir les options OAuth
$this->options = array(
'version' => '1.0',
'localUrl' => $params['localUrl'],
'callbackUrl' => $params['callbackUrl'],
'requestTokenUrl' => 'https://api.linkedin.com/uas/oauth/requestToken',
'userAuthorisationUrl' => 'https://api.linkedin.com/uas/oauth/authorize',
'accessTokenUrl' => 'https://api.linkedin.com/uas/oauth/accessToken',
'consumerKey' => $params['consumerKey'],
'consumerSecret' => $params['consumerSecret']
);
// Instancier la Classe Zend_Oauth_Consumer
$this->consumer = new Zend_Oauth_Consumer( $this->options );
}
public function connect()
{
// Démarrer la gestion des Sessions afin de Stocker le Request Token et l'Acess Token
session_start ();
if ( !isset ( $_SESSION ['ACCESS_TOKEN'] )) {
// On a pas d'Access Token
if (! empty ( $_GET )) {
// Mais il y a des paramètres passés via l'URL
// Obtenir l'Access Token
$this->token = $this->consumer->getAccessToken ( $_GET, unserialize ( $_SESSION ['REQUEST_TOKEN'] ) );
// Stocker l'Access Token
$_SESSION ['ACCESS_TOKEN'] = serialize ( $this->token );
} else {
// On a rien du tout
// Commençons par demander un Request Token
$this->token = $this->consumer->getRequestToken ();
// Stocker le Request Token
$_SESSION ['REQUEST_TOKEN'] = serialize ( $this->token );
// Rediriger l'Utilisateur Vers la page d'Authentification de LinkedIn
$this->consumer->redirect ();
}
} else {
// On a Deja un Access Token
// Récupération de l'Access Token
$this->token = unserialize ( $_SESSION ['ACCESS_TOKEN'] );
}
// Utilisation du Client HTTP gérant intrinsèquement l'OAuth
$this->client = $this->token->getHttpClient($this->options);
}
public function whoAmI()
{
// Fixer l'URI LinkedIn souhaitée
$this->client->setUri('https://api.linkedin.com/v1/people/~');
// Fixer la Methode d'Accès (GET, POST or PUT)
$this->client->setMethod(Zend_Http_Client::GET);
// Exécution de la requête et obtention du resultat
$response = $this->client->request();
// Obtention d'un contenu au format XML contenant le profil utilisateur
$content = $response->getBody();
// De-commentez les lignes qui suivent pour visualiser le code XML
// header('Content-Type: ' . $response->getHeader('Content-Type'));
// echo $content;
// exit;
// Utilisation de SimpleXML pour transformer la chaine XML en Objet PHP
$xml = simplexml_load_string($content);
// De-commentez les lignes qui suivent pour visualiser la structure de l'objet Simple XML
// echo '<pre>';
// print_r($xml);
// echo'</pre>';
// De-commentez les lignes qui suivent afficher du Profil Utilisateur
// echo 'First Name: ' . $xml->{'first-name'};
// echo '<br/>';
// echo 'Last Name: ' . $xml->{'last-name'};
// echo '<br/>';
// echo 'Headline: ' . $xml->{'headline'};
$info['firstName'] = (string) $xml->{'first-name'};
$info['lastName'] = (string) $xml->{'last-name'};
$info['headline'] = (string) $xml->{'headline'};
$info['profilUrl'] = (string) $xml->{'site-standard-profil-request'}->url;
return $info;
}
/*
* @abstract: Creation de la chaine XML contenant le Statut de l'Utilisateur
*/
private function createXmlStatus($status)
{
$xml = '<?xml version="1.0" encoding="UTF-8"?><current-status>'.$status.'</current-status>';
return $xml;
}
public function getStatus()
{
// Fixer l'URI permettant la recuperation du Statut LinkedIn
// de l'utilisateur Logge
$this->client->setUri('http://api.linkedin.com/v1/people/~:(current-status)');
// Fixer la Methode HTTP (GET, POST, DELETE and PUT)
$this->client->setMethod(Zend_Http_Client::GET);
// Recuperation de la reponse a cette requete HTTP
$response = $this->client->request();
// Recuperation du corps de cette reponse
$content = $response->getBody();
// Utilisation de SimpleXML pour transformer la chaine XML en Objet PHP
$xml = simplexml_load_string($content);
$status = (string) $xml->{'current-status'};
return $status;
}
public function updateStatus($status)
{
// Fixer l'URI permettant la mise a jour du Statut LinkedIn
// de l'utilisateur Logge
$this->client->setUri('https://api.linkedin.com/v1/people/~/current-status');
// Fixer la Methode HTTP (GET, POST, DELETE and PUT)
$this->client->setMethod(Zend_Http_Client::PUT );
// Creation de la Chaine XML qui sera passe via le PUT
$xml = $this->createXmlStatus($status);
// On demande a passer cette chaine via le PUT
$this->client->setRawData($xml,'text/xml');
// On fixe l'entete HTTP
$this->client->setHeaders('Content-Type', 'text/xml');
// Executer la Requete
$response = $this->client->request();
}
public function clearStatus()
{
// Fixer l'URI permettant la mise a jour du Statut LinkedIn
// de l'utilisateur Logge
$this->client->setUri('https://api.linkedin.com/v1/people/~/current-status');
// Fixer la Methode HTTP (GET, POST, DELETE and PUT)
$this->client->setMethod(Zend_Http_Client::DELETE );
// Executer la Requete
$response = $this->client->request();
$content = $response->getBody();
echo $content;
}
} // Class End
// Utilisation de Cette Classe
$params = Array( 'consumerKey' => 'YOUR_CONSUMER_KEY',
'consumerSecret' => 'YOUR_CONSUMER_SECRET_KEY',
'localUrl' => 'YOUR_Local_URL',
'callbackUrl' => 'YOUR_Callback_URL',
'zendPath' => 'YOUR_Zend_Path',
'zendIncubatorPath' => 'YOUR_Zend_Incubator_Path'
);
/*
*
* @abstract: Test de la Classe Php LinkedIn
* @author: Christophe Fiat
* @copyright: FormatiX.EU
*
*/
// Creation d'une Instance de notre classe PHP linkedIn
$linkedin = new linkedIn($params);
// connection a l'API LinkedIn Via OAuth
$linkedin->connect();
// Appel de la Methode whoAmI
// afin de reccuperer les infos du Profil LinkedIn de l'utilisateur Logge
$profilInfo =$linkedin->whoAmI();
// Affichage des infos du Profil LinkedIn de l'utilisateur Logge
echo'<h2>Prenom: '.$profilInfo['firstName']. '</h2>';
echo'<h2>Nom: '.$profilInfo['lastName']. '</h2>';
echo'<h2>Fonction: '.$profilInfo['headline']. '</h2>';
echo'<h2><a href="'.$profilInfo['profilUrl'].'">profil LinkedIn </a></h2>';
// Obtention du Statut LinkedIn de l'utilisateur Logge
$userStatus = $linkedin->getStatus();
// Affichage du Statut
if(!empty($userStatus))
{
echo"<h2>Statut de ".$profilInfo['firstName'] . ' ' . $profilInfo['lastName'] .":
$userStatus </h2>";
}
else
{
echo'<h2>Pas de Statut</h2>';
}
// Modification du Statut LinkedIn de l'utilisateur Logge
$linkedin->updateStatus('Teste la Classe PHP linkedIn');
// Obtention du nouveau Statut LinkedIn de l'utilisateur Logge
$userStatus = $linkedin->getStatus();
// Affichage du nouveau statut LinkedIn
if(!empty($userStatus))
{
echo"<h2>Statut de ".$profilInfo['firstName'] . ' ' . $profilInfo['lastName'] .":
$userStatus </h2>";
}
else
{
echo'<h2>Pas de Statut</h2>';
}
// Effacement du Statut LinkedIn de l'utilisateur Logge
$linkedin->clearStatus();
// Obtention du nouveau Statut LinkedIn de l'utilisateur Logge
$userStatus = $linkedin->getStatus();
// Affichage du nouveau statut LinkedIn
if(!empty($userStatus))
{
echo"<h2>Statut de ".$profilInfo['firstName'] . ' ' . $profilInfo['lastName'] .":
$userStatus </h2>";
}
else
{
echo'<h2>Pas de Statut</h2>';
}
// The END! ;)
?>
Vous pouvez Telechager La Classe LinkedIn
4 Responses
Greg
08|Dec|2009 1Ah super le tuto. Merci.
Ca me fait penser qu’il faut que je finisse 2 3 tutos sur le ZF ;)
Bonne continuation Greg
Julien
16|Feb|2010 2Merci pour le tuto!
J’essaie d’envoyer un message ou une invitation ( par id ou par mail) en me basant sur la méthode updateStatus et en changeant le xml à envoyer.
J’ai récupéré l’id du contact auquel je veux envoyer le message plus un identifiant comme précisé dans le tutorial API Invitation(http://developer.linkedin.com/docs/DOC-1012).
Voici la fonction que j’appelle.
public function sendMail ()
{
// Set LinkedIn’s Set Status URI
$this->client->setUri(‘http://api.linkedin.com/v1/people/~/mailbox’);
// Set HTTP Method (GET, POST, PUT, or DELETE) PUT OR POST?????
$this->client->setMethod(Zend_Http_Client::PUT );
// Create XML String to be passed with the PUT
$xml =’
Invitation to Connect
Please join my professional network on LinkedIn.
friend
TSAO
a2gO
‘;
// Attach the XML String to the HTTP request
$this->client->setRawData($xml,’text/xml’);
// Set the Content Type in the HTTP Header
$this->client->setHeaders(‘Content-Type’, ‘text/xml’);
// Execute Request
$this->client->request();
}
Il ne se passe absolument rien quand je pousse ce xml ( pas d’erreurs affichées).
C’est la même chose si j’envoie un email directement.
Avez-vous une suggestion à me faire?
Un grand merci.
Chris
17|Feb|2010 3Désolé pour la réponse tardive mais ton message etait dans la boite a Spam Akismet :(
J’ai réutilisé le code présenté ci-dessus avec le nouveau Zend Framework 1.10.1 et nous n’avons effectivement plus besoin de l’Incubator Zend.
Ensuite je l’ai adapte pour pouvoir envoyer un message en utilisant l’URI suivante:
http://api.linkedin.com/v1/people/~/mailbox
Tout d’abord si on regarde la documentation du “LinkedIn Developer Network” on voit qu’il faut faire un POST et non un PUT.
Ensuite voici a quoi ressemble ma chaine XML
En remplaçant
Axe de résolution de ton problème:
- POST au lieu de PUT
- Vérification de ta chaine XML
- Vérification de l’ID de l’utilisateur a qui tu ecris
- Vérification du lien direct (de niveau 1) entre l’émetteur du message et le destinataire
Julien
17|Feb|2010 4Merci Christophe!
Ca marche.
Leave a reply