Première approche avec Twitter

BIENVENUE

Déjà, coucou et bienvenue sur ce tout premier article sur mon blog !

Je vais juste raconter un peu ce que je fais en PHP (mais pas que), comment je l’ai fait et quelques petites astuces (si l’on peut dire) que j’ai découvert seul.

Je n’ai pas vocation d’être un grand programmeur, je n’ai pas un niveau d’expert, juste des connaissances dans certains pans de PHP et quelques API qui existent dans le grand monde de l’Internet moderne.

Je précise d’avance que tout le code partagé sera du PHP 7.1+, avec donc du type hint dans les déclarations de fonctions et des constantes privées dans les classes notamment. Bien entendu, vous pourrez utiliser tout le code fourni avec presque n’importe quelle version de PHP, avec un peu de formatage à-votre-sauce.

Commençons

Le but de cet article n’est pas de vous faire part de l’entièreté de l’API Twitter et son exploitation dans les moindres détails sous PHP, mais juste d’avoir une base fonctionnelle pour faire ce que vous avez envie avec.

Des bibliothèques où tout est intégré (comme TwitterOAuth) existent déjà et sont assez faciles d’accès, mais une grande partie des traitements y est caché. Le but ici est d’apprendre à se servir d’une API et donc de coder nous même notre client, nous allons donc ne pas nous en servir ici.

Commençons par le commencement :

Twitter utilise une technologie nommée OAuth (version 1) pour dialoguer et sécuriser son API.

Le principe d’OAuth est que toute requête est entièrement sécurisée et sans possibilité de corrompre les données durant le transfert. Nous reviendrons sur son fonctionnement complet, et les détails de connexion dans un autre article.

 

Création d’une application

Avant toute chose, passage obligé pour utiliser l’API Twitter, il faut disposer d’un compte Twitter (avec téléphone validé) et d’une application (liée à son compte).

Depuis août 2018, il est OBLIGATOIRE de dire à Twitter (en anglais) ce que vous comptez faire de son API, et de quelle manière vous allez interagir avec les autres utilisateurs avec. La réponse est longue (facilement 2 semaines) et c’est très lourd. Si vous n’avez aucune appli sous la main, faites le, puis revenez plus tard. Tout se passe > ici.

 

Configuration de PHP

Pour éviter de nous embêter à coder nous même notre implémentation OAuth, nous allons en prendre une qui existe déjà :

  • L’extension OAuth disponible via pecl
  • Ma propre implémentation d’OAuth (que je ne recommande pas)

Je vous conseille FORTEMENT d’installer l’extension OAuth qui a été testée, développée par des pros et suivie par la communauté plutôt que mon implémentation. Le seul avantage de la mienne est qu’elle ne requiert pas l’accès root au serveur PHP…

Pour installer OAuth, loggez vous en SSH sur votre serveur, puis lancez un sudo pecl install oauth

Pour CERTAINS, un sudo apt install php-oauth est possible, préférez le, c’est plus simple, aucun config n’est à réaliser ensuite.

Si vous avez installé via pecl, vous devrez modifier le(s) php.ini (/etc/php/7.x/{cli/apache2}/php.ini) et rajouter la ligne extension=oauth.so pour activer OAuth.

Pour Windows, hum, débrouillez-vous et bonne chance (PHP sur Windows, sérieusement ?).

 

Enfin, ma propre implémentation d’OAuth est disponible ici (clic droit > enregistrer sous). Les deux méthodes utilisées dans cet article (et les suivants) ont le même nom que sur le OAuth disponible en extension pour PHP.

 

Première connexion

Enfin prêts à coder !

Avant d’écrire notre première ligne de code, nous allons avoir besoin de 4 clés (oui, 4!) différentes pour nous connecter à Twitter.

Ces clés sont disponibles dans apps.twitter.com, dans l’onglet « Keys and tokens » de votre application.

Regardons ces clés dans l’ordre d’apparition.

Les deux premières, les CONSUMER, sont des clés uniques à votre application. Quand vous aurez potentiellement plusieurs utilisateurs à votre application, ces clés ne bougeront pas.

Si votre application était un immeuble et les appartements les utilisateurs de votre appli, les consumer keys seraient un peu le digicode à l’entrée, sur le portail.

 

Ensuite, les deux clés dites ACCESS TOKENS, sont les clés spécifiques à un utilisateur dans le cadre de votre application. C’est à dire que les préciser revient à se faire passer pour un utilisateur précis, mais uniquement dans le cadre de votre application !

Ces clés ne seront pas valides dans d’autres applis. Si M. Lambert du 5ème a un appart dans votre immeuble et un autre appart posé sur les Champs Elysées, il va avoir deux clés différentes pour entrer à deux endroits différents ! C’est un peu le même principe.

Les access tokens que vous avez ici sont liés au compte Twitter qui a créé l’application.

 

ENFIN. On va pouvoir toucher PHP ! Vous aviez hâte ! (non)

Pour faire bien propre, on va créer un fichier main.php où en tête on va déclarer nos constantes contenant nos clés.

<?php

const CONSUMER_KEY = 'xxx';
const CONSUMER_SECRET_KEY = 'xxx';
const ACCESS_TOKEN = 'xxx';
const ACCESS_TOKEN_SECRET = 'xxx';

 main.php

N’oubliez pas d’ajouter un require pour inclure mon fichier de classe OAuth si vous utilisez ma version.

Maintenant, commençons notre « handler » Twitter. Pour cela, deuxième fichier, « Twitter.php », qui contiendra la classe « Twitter ».

La première chose à intégrer sera le composant OAuth. On crée donc une variable privée le contenant.

Dans tous les cas, les clés Consumer sont obligatoires. On va donc directement obliger l’utilisateur de la classe à entrer les consumer keys à l’instanciation.

<?php

class Twitter {
    protected $oauth;

    public function __construct(string $oauth_consumer, string $oauth_consumer_secret) {

    }
}

 Twitter.php

Ensuite, on aura besoin d’instancier l’objet OAuth pour communiquer.

On instancie soit « OAuth » (classe de l’extension) soit « TwiOAuth » (mon implémentation) dans la variable $oauth.

L’objet OAuth prend également directement en paramètre les consumer keys de l’application dans son constructeur.

Pour définir les access tokens à notre guise, on crée la méthode publique setToken (qui porte le même nom dans l’objet OAuth) qui prend en paramètre l’access token publique puis le privé.

 

class Twitter {
    protected $oauth;

    public function __construct(string $oauth_consumer, string $oauth_consumer_secret) {
        $this->oauth = new OAuth($oauth_consumer, $oauth_consumer_secret, OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_URI);
    }

    public function setToken(string $access_token, string $access_token_secret) : void {
        $this->oauth->setToken($access_token, $access_token_secret);
    }
}

Super ! Notre objet est ok pour dialoguer avec OAuth.

Pour aujourd’hui, on va se contenter d’envoyer un tweet et on finira ici.

Ce tweet sera envoyé sur le compte auquel est associé l’application, puisque c’est sur celui-ci dont nous disposons les clés.

Envoyer un tweet

Une API fonctionne par endpoint, des « points de terminaison » capable de recevoir et d’envoyer certaines données précises, en fonction de leur type.

La documentation complète est ici, mais ce qui nous intéresse est juste celui-là.

Le principe est que l’on appelle la page web https://api.twitter.com/1.1/statuses/update.json, identifié par OAuth (d’où tout le smilblick pour l’installer et le configurer), accompagné de certains paramètres précis, et le tour est joué, il fait ce qu’on lui demande.

L’endpoint statuses/update prend beaucoup de paramètres, mais deux choses nous intéresse ici : il demande la méthode POST, et le corps du tweet est situé dans le paramètre « status ».

Sachez que pour effectuer une requête OAuth, on utilise la méthode « fetch » qui prend en paramètre l’URL, un tableau contenant les arguments et la méthode (GET ou POST, en chaîne de caractères majuscule; note que si vous utilisez l’extension OAuth, vous pouvez utiliser les constantes OAUTH_HTTP_METHOD_GET et OAUTH_HTTP_METHOD_POST).

On va donc suivre à la lettre la documentation Twitter et envoyer le tweet en créant une méthode faite pour cela.

 

public function sendTweet(string $status) : ?array {
        try {
            $this->oauth->fetch('https://api.twitter.com/1.1/statuses/update.json',     
                                ['status' => $status, 'tweet_mode' => 'extended'], 
                                OAUTH_HTTP_METHOD_POST);
        } catch (OAuthException $e) {
            echo "Impossible d'uploader un tweet : {$e->lastResponse}";
            return null;
        }

        $tweet = json_decode($this->oauth->getLastResponse(), true);

        if($tweet) {
            return $tweet;
        }
        else {
            return null;
        }
    }

Quelques explications s’imposent :

Le « tweet_mode » => « extended » dans les arguments permet de recevoir un tweet sous le « nouveau » format (280 caractères), voir la récupération légèrement plus bas.

Si la requête échoue (code HTTP 4xx ou 5xx), la classe OAuth lance une exception (la mienne renvoie null, mais n’utilisez pas la mienne) qu’il convient d’attraper.  Les détails de l’erreur sont dans l’attribut « lastResponse » de l’exception attrapée.

Si tout s’est bien passé, on peut décoder la réponse (au format JSON, comme quasiment sur chaque API) récupérable dans objet OAuth -> getLastResponse().

Si le tweet a été envoyé, alors la réponse de Twitter sera le tweet nouvellement posté (d’où le tweet_mode : extended précisé, pour recevoir un tweet bien formé). Libre à vous de regarder comment celui-ci est composé.

Pour instancier et envoyer le tweet, le code sera donc…. (*roulements de tambour*)

 

require 'Twitter.php';

$twitter = new Twitter(CONSUMER_KEY, CONSUMER_SECRET_KEY);
$twitter->setToken(ACCESS_TOKEN, ACCESS_TOKEN_SECRET);

$twitter->sendTweet('Coucou, je suis un tweet posté via PHP !');

main.php

 

On a fini pour aujourd’hui ! J’espère que c’était au minimum clair, n’hésitez pas à renvoyer vos commentaires (de préférence sur le compte Twitter @Alkihis) si des choses sont pas claires !