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:

  • De mettre a jour le Statut LinkedIn de l’utilisateur Loggé
  • D’effacer le Statut LinkedIn de l’utilisateur Loggé
  • De lire le Statut LinkedIn de l’utilisateur Loggé

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

Etape 0. Mise En Place de l’Authetification OAuth

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:

  • Récupération des Clefs Abonné LinkedIn
  • Récupération de la librairie Zend et de la Librairie de l’incubateur Zend
  • Inclusion du Moduke Zend_Oauth
  • Correction du Module Zend_Oauth (eh oui il y a encore qq bugs dans ce module)
  • Implémentation du Handshake Oauth

Etape 1. Ajout de la méthode GetStatus

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;

}

Etape 2. Ajout de la méthode updateStatus


/*
* @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();

}

Etape 3. Ajout de la méthode clearStatus

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;

}

Etape 4. Modification de Zend_OAuth

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;
    }

Etape 5. Test des nouvelles Méthodes

Le Test de la classe php LinkedIn se passe en 3 etapes

  • Instantiation de la Classe linkedIn
  • Connection et Authentification de l’Utilisateur
  • Appel des différentes méthodes a tester

Dans Notre exemple ci-dessous

  • Nous Récupèrerons le Profil de l’utilisateur Loggé
    Nous l’afficherons
  • Nous Récupèrerons le Statut de l’utilisateur Loggé
    Nous l’afficherons
  • Nous mettrons a jour le Statut de l’utilisateur avec le message suivant << Teste la Classe PHP linkedIn >>
  • Nous Récupèrerons ce Statut
    Nous l’afficherons (Afin de vérifier que l’étape de mise a jour a bien fonctionné)
  • Nous Effacerons le Status de l’utilisateur Loggé
  • Nous Récupèrerons ce Statut
    Nous l’afficherons (Afin de vérifier que l’étape d’effacement a bien fonctionné)
/*
*
* @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>';
}

Etape 6. La Classe PHP LinkedIn dans son ensemble

<?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