Tutoriel Utilisation de l'API Twitch en PHP

Paradise GTP

Premium
Inscription
30 Juin 2013
Messages
4 265
Réactions
4 409
Points
21 005
RGCoins
30
You must be registered for see images attach

Dans ce tutoriel, je vais vous expliquer comment exploiter l'API de Twitch depuis votre site web afin de réaliser différentes actions, comme récupérer les informations du compte, créer des prédictions, etc.
Cela peut, par exemple, servir à ajouter un bouton "Connexion avec Twitch" à votre site ou à laisser libre cours à votre imagination pour vos projets.


You must be registered for see images attach

L'accès aux données de Twitch est possible grâce au protocole OAuth2. Voici une explication des principes d'OAuth2 :
OAuth 2.0 est un protocole d'autorisation et NON un protocole d'authentification. En tant que tel, il est principalement conçu comme un moyen d'accorder l'accès à un ensemble de ressources, par exemple, des API distantes ou des données utilisateur.

OAuth 2.0 utilise des jetons d'accès. Un jeton d'accès est un élément de données qui représente l'autorisation d'accéder aux ressources au nom de l'utilisateur final. OAuth 2.0 ne définit pas de format spécifique pour les jetons d'accès. Toutefois, dans certains contextes, le format JSON Web Token (JWT) est souvent utilisé. Cela permet aux émetteurs de jetons d'inclure des données dans le jeton lui-même. En outre, pour des motifs de sécurité, les jetons d'accès peuvent avoir une date d'expiration.
Source :

You must be registered for see images attach

Nous reviendrons à cette image plus tard. Si jamais vous ne comprenez pas, ce n'est pas très grave pour l'instant.

En ce qui concerne les prérequis, il n'y en a presque pas, si ce n'est d'avoir un compte Twitch, de vous rendre sur la et de créer une application en remplissant simplement un formulaire demandant les informations suivantes :
  • Nom de l'application : Si vous créez plusieurs applications, cela permet de vous y retrouver, mais ce nom sera également affiché lors de la connexion de l'utilisateur.​
  • URL de redirection OAuth : C'est-à-dire la page qui recevra les résultats suite à l'authentification, soit le jeton d'accès, soit un message d'erreur. (Attention : L'URL doit être obligatoirement en HTTPS)​
  • Catégorie de l'application : Indiquez simplement si c'est pour une page web, un jeu, un bot ou autre. (Je ne sais pas si cela a des répercussions par la suite ; c'est sûrement pour leurs statistiques ou autre.)​
  • Type de client : Soit confidentiel, soit public. Pour notre cas, je recommande "confidentiel", car en mode public, vous ne pouvez pas utiliser toutes les fonctions, seulement celles qui ne demandent pas d'accès utilisateur.​

On va ensuite créer nos fichiers PHP, pour le tutoriel, je vais créer trois fichiers uniquement, après pour vos fichiers pour vous cela dépendra de vos projets, et passerait à côté de la sécurité (pas de vérification, clefs d'API directement dans le code etc ...)
  • TwitchOAuth.php
  • config.php
  • index.php

You must be registered for see images attach

Maintenant que tout cela est fait, nous allons pouvoir passer au codage de notre page web.
Nous allons commencer par le fichier "TwitchOAuth.php" dans lequel nous allons créer une classe. Vous êtes libre de l'appeler comme vous le souhaitez, pour ma part, je l'appellerai "OAuthTwitch".

Dans cette classe, nous allons commencer par ajouter des propriétés (private) qui nous serviront dans différentes fonctions par la suite.
Voici les informations dont nous aurons besoin :
  • Identifiant client : Cette propriété va stocker l'ID client de votre application Twitch.​
  • Identifiant secret : Cette propriété va stocker le secret client de votre application.
  • URL de redirection : Cette propriété va contenir l'URL de redirection utilisée dans le processus d'authentification OAuth. Cette URL est où Twitch redirigera l'utilisateur après l'authentification.
  • Scope : Cette propriété va stocker les scopes (permissions) demandés lors de l'authentification. Les scopes définissent ce que votre application peut faire avec les données de l'utilisateur.
  • Token : Cette propriété va contenir le jeton d'accès (token) reçu après l'authentification. Ce token est utilisé pour authentifier les requêtes API.
  • Headers : Cette propriété est initialisée comme un tableau vide. Elle va contenir les en-têtes (headers) HTTP nécessaires pour les requêtes API.
PHP:
<?php
class OAuthTwitch{
    private $_clientid;
    private $_clientsecret;
    private $_redirecturl;
    private $_scope;
    private $_token;
    private $_headers = [];
}

Ensuite, on va faire le constructeur pour initialiser une partie de ses propriétés.
PHP:
public function __construct($clientid, $clientsecret, $redirecturl, $scope) {
    $this->_clientid = $clientid;
    $this->_clientsecret = $clientsecret;
    $this->_redirecturl = $redirecturl;
    $this->_scope = $scope;
}

Nous allons laisser notre fichier TwitchOAuth.php de côté pendant quelque temps pour passer au fichier de configuration, dans lequel nous allons commencer par inclure notre fichier TwitchOAuth.php.
PHP:
require_once('TwitchOAuth.php');

Enfin, nous allons créer notre objet OAuthTwitch (qui correspond à notre classe).
PHP:
$OAuth = new OAuthTwitch($clientid, $clientsecret, $redirecturl, $scope);

Comme vous pouvez le voir, nous utilisons différentes variables que nous n'avons pas initialisées au préalable. Il va donc falloir récupérer les clés sur le site de Twitch.
Pour récupérer l'identifiant client et l'identifiant secret, cela se fait dans la gestion de votre application. Ensuite, pour l'URL de redirection, c'est celle que vous avez configurée précédemment.

Pour les définir, voici le code à mettre (avec les valeurs entre les guillemets) :
PHP:
$clientid = "";
$clientsecret = "";
$redirecturl = "";

Concernant les scopes (permissions données à votre application), cela dépend de votre projet. Vous pouvez retrouver la liste sur la de Twitch.
Vous pouvez bien sûr en utiliser plusieurs simplement en mettant un espace entre les différents scopes. Par exemple, pour lire et créer des prédictions, il faut utiliser : "channel:manage:predictions channel:read:predictions".

Maintenant que c'est fait, nous pouvons retourner sur notre fichier TwitchOAuth pour créer notre première fonction, qui sera la récupération du lien de connexion. Nous allons l'appeler "get_link_connect".

Voici le code de notre fonction (comme précisé, la sécurité ne sera pas au rendez-vous, je n'ai donc pas mis en place le paramètre "state", mais libre à vous, pour un vrai projet, de le mettre en place).
PHP:
    public function get_link_connect(){
        $link = "https://id.twitch.tv/oauth2/authorize?response_type=code&client_id=$this->_clientid&redirect_uri=$this->_redirecturl&scope=$this->_scope";
        return $link;
    }
Plus d'informations :

Ensuite, nous allons récupérer le lien sur notre page index.php avec un bouton "Connexion Par Twitch" et rediriger l'utilisateur vers cette page.

Donc, voici le code pour récupérer notre lien de connexion :
PHP:
require_once ("config.php");
$link_connect = $OAuth->get_link_connect();

Il ne vous reste plus qu'à rediriger vers $link_connect lorsque l'utilisateur clique sur votre bouton de connexion, et vous vous retrouverez donc sur une page comme celle-ci :
You must be registered for see images attach


Pour le moment, cliquer sur "Autoriser" ne sert à rien, car nous n'avons pas encore mis en place notre page de réponse. Nous allons le faire immédiatement. Il va donc falloir créer un nouveau fichier .php qui correspond à celui mentionné lors de la création de votre application sur la console Twitch.
Pour ma part, la page s'appellera "link_twitch.php", mais comme d'habitude, libre à vous de la nommer comme vous le souhaitez.
Ensuite, pour commencer, nous allons récupérer le code que Twitch nous retourne dans l'URL, puis nous ferons la demande du jeton OAuth.
PHP:
$code = $_GET['code'];

Maintenant qu'on peut utiliser le code, on va ajouter une nouvelle fonction dans notre classe.
PHP:
    public function get_token($code){
        $link = "https://id.twitch.tv/oauth2/token?client_id=".$this->_clientid."&client_secret=".$this->_clientsecret."&code=".$code."&grant_type=authorization_code&redirect_uri=".$this->_redirecturl;
        $ch = curl_init($link);

        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        $res = curl_exec($ch);
        curl_close($ch);

        $token = json_decode($res);
        $this->_token = $token;

        return array($token->access_token,$token->expires_in,$token->refresh_token);
    }

Donc, avec cette fonction, nous demandons à Twitch un access_token pour notre utilisateur. C'est avec cela que nous pourrons effectuer différentes actions.
Si tout se passe bien, nous récupérons un token, sa validité ainsi qu'un refresh_token qui permettra de mettre à jour l'access_token sans que l'utilisateur ait besoin de se reconnecter pour continuer à fonctionner (car le token a une durée de validité de quelques heures).
Plus d'informations :

Désormais, on va essayer ça, donc dans notre fichier de callback après avoir récupéré le code, on va faire la demande à Twitch et afficher les informations récupérées.
PHP:
$token = $OAuth->get_token($code);
var_dump($token);

Si tout fonctionne bien, vous devriez avoir une page comme celle-ci :

You must be registered for see images attach


On va maintenant isoler notre access_token pour pouvoir l'utiliser.
PHP:
$access_token = $token[0];

Pour finir, on retourne sur notre classe afin d'y ajouter une fonction qui servira à transmettre les en-têtes nécessaires.
PHP:
    public function set_headers($token, $type) {
        $this->_headers = [
            'Authorization: Bearer ' . $token,
            'Client-Id: ' . $this->_clientid
        ];
   
        if ($type == 2) {
            $this->_headers[] = 'Content-Type: application/json';
        }
    }

Sur certaines fonctions, les données transmises seront un JSON (comme les prédictions) donc on définit deux types d'en tête, un basique et un second type pour les en têtes JSON.

Maintenant que c'est fait, je vais vous donner une fonction pour récupérer les informations de la chaine Twitch sur laquelle l'utilisateur est connecté.
PHP:
    public function get_user_info(){
        $link = "https://api.twitch.tv/helix/users";
       
        $ch = curl_init($link);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $this->_headers);

        $res = curl_exec($ch);
        curl_close($ch);

        return json_decode($res);
    }
Plus d'informations :

En appelant cette fonction, vous récupérez toutes les informations de la chaîne Twitch. Le mode de fonctionnement est le même pour les autres méthodes ; il suffira juste de modifier l'URL ainsi que, éventuellement, les paramètres.

Voici la page regroupant toutes les actions que vous pouvez effectuer, avec les scopes à utiliser, les paramètres à transmettre ainsi qu'un exemple de réponse :
Maintenant, libre à vous de mettre en place votre projet selon vos besoins.

Donc, pour récupérer les informations, j'ai créé une nouvelle page "user" sur laquelle je suis redirigé après avoir récupéré mon token OAuth. Les paramètres dans l'URL sont les suivants (pour simplifier dans le tutoriel, mais je ne recommande pas de faire ainsi en production).
Voici le code de ma page qui va récupérer les informations de mon compte Twitch :
PHP:
require_once('config.php');

$token = $_GET['token'];

$OAuth->set_headers($token, 1);
$info_Users = $OAuth->get_user_info();

print_r($info_Users);

Maintenant voici le résultat :
You must be registered for see images attach


Comme vous pouvez voir, j'ai bien mes informations transmise par Twitch.

Les possibilités sont multiples, libre à vous d'explorer la documentation suivant les besoins de votre projet !

Je reste disponible si besoin. :tchuss:

Petit bonus, voici quelques fonctions que j'avais réalisées pour un projet :
PHP:
<?php
    define('API_LINK', 'https://api.twitch.tv/helix');
   
    class OAuthTwitch{
        private $_client_id;
        private $_client_secret;
        private $_redirect_uri;
        private $_scope;
        private $_token;
        private $_headers = [];

        public function __construct($client_id, $client_secret, $redirect_uri, $scope){
            $this->_client_id = $client_id;
            $this->_client_secret = $client_secret;
            $this->_redirect_uri = $redirect_uri;
            $this->_scope = $scope;
        }
       
       
       
        /*
        Fonction : Récupére le lien de connexion
        Retour : Lien de connexion à mettre dans le bouton (par exemple)
        Plus d'informations : https://dev.twitch.tv/docs/authentication/getting-tokens-oauth/#authorization-code-grant-flow
        */
        public function get_link_connect(){
            $link = "https://id.twitch.tv/oauth2/authorize?client_id=".$this->_client_id."&redirect_uri=".$this->_redirect_uri."&response_type=code&scope=".$this->_scope."&force_verify=true";
            return $link;
        }
       
       
       
        /*
        Fonction : Récupére le token
        Paramètres :
        $code (string) -> $_GET['code'] présent dans l'URL s'être connecté
        Plus d'informations : https://dev.twitch.tv/docs/authentication/getting-tokens-oauth#use-the-authorization-code-to-get-a-token
        */
        public function get_token($code){
            // Lien pour avoir le token
            $link = "https://id.twitch.tv/oauth2/token?client_id=".$this->_client_id."&client_secret=".$this->_client_secret."&code=".$code."&grant_type=authorization_code&redirect_uri=".$this->_redirect_uri;
            // Request cURL POST pour get le token
            $ch = curl_init($link);

            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

            $res = curl_exec($ch);
            curl_close($ch);

            // Decode
            $token = json_decode($res);
            // On place le token en attribut privée
            $this->_token = $token;

            // On return le token
            return array($token->access_token,$token->expires_in,$token->refresh_token);
        }

        /*
        Fonction : Récupére le token d'APP
        Paramètres :
        Plus d'informations : https://dev.twitch.tv/docs/authentication/getting-tokens-oauth/#client-credentials-grant-flow
        */
        public function get_token_app(){
            // Lien pour avoir le token
            $link = "https://id.twitch.tv/oauth2/token?client_id=".$this->_client_id."&client_secret=".$this->_client_secret."&grant_type=client_credentials";
            // Request cURL POST pour get le token
            $ch = curl_init($link);

            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

            $res = curl_exec($ch);
            curl_close($ch);

            // Decode
            $token = json_decode($res);
            // On place le token en attribut privée
            $this->_token = $token;

            // On return le token
            return $token->access_token;
        }

        /*
        Fonction : Refresh le token
        Paramètres :
        $code (string) -> $_GET['code'] présent dans l'URL s'être connecté
        Plus d'informations : https://dev.twitch.tv/docs/authentication/refresh-tokens
        */
       
        public function refresh_token($code){
            // Lien pour avoir le token
            $link = "https://id.twitch.tv/oauth2/token?client_id=".$this->_client_id."&client_secret=".$this->_client_secret."&grant_type=refresh_token&refresh_token=".$code;
            // Request cURL POST pour get le token
            $ch = curl_init($link);

            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

            $res = curl_exec($ch);
            curl_close($ch);

            // Decode
            $token = json_decode($res);
            // On place le token en attribut privée
            $this->_token = $token;

            // On return le token
            return array($token->access_token,$token->refresh_token);
        }
       
        /*
        Fonction : Transmet les headers
        Paramètres :
        $token (string) -> Token récupéré lors de l'identification
        $type (int) -> Type de headers à transmettre
        Plus d'informations : https://dev.twitch.tv/docs/api
        */
        public function set_headers($token, $type){
            if($type == 1){
                $this->_headers = [
                    'Authorization: Bearer '.$token,
                    'Client-Id: '.$this->_client_id
            ];
            }
            else if($type == 2)
            {
            $this->_headers = [
                'Authorization: Bearer '.$token,
                'Client-Id: '.$this->_client_id,
                'Content-Type: application/json'
            ];
            }
           
            else
            {
                $this->_headers = [
                    'Authorization: Bearer '.$token,
                    'Client-Id: '.$this->_client_id
            ];
            }
        }



        /*
        Fonction : Recherche une chaine avec le nom de la chaine
        Paramètres :
        $name (string) -> Nom de la chaine
        Retourne : JSON
        Plus d'informations : https://dev.twitch.tv/docs/api/reference#search-channels
        */
        public function search_channel($name){
            $link = API_LINK."/search/channels?query=".$name;
            // cURL
            $ch = curl_init($link);

            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $this->_headers);

            $res = curl_exec($ch);
            curl_close($ch);

            // on decode et on renvoie
            return json_decode($res);
        }



        /*
        Fonction : Recherche une chaine avec l'ID de la chaine
        Paramètres :
        $broadcaster_id (string) -> Identifiant de la chaine
        Retourne : JSON
        Plus d'informations : https://dev.twitch.tv/docs/api/reference#get-channel-information
        */
        public function get_channel_info($broadcaster_id){
            $link = API_LINK."/channels?broadcaster_id=".$broadcaster_id;
           
            $ch = curl_init($link);

            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $this->_headers);

            $res = curl_exec($ch);
            curl_close($ch);

            return json_decode($res);
        }

        /*
        Fonction : Recherche les informations de la chaine dont on dispose le token
        Paramètres :
        $jeton (string) -> Token
        Retourne : JSON
        Plus d'informations : https://dev.twitch.tv/docs/api/reference#get-users
        */
        public function get_user_info(){
            $link = API_LINK."/users";
           
            $ch = curl_init($link);

            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $this->_headers);

            $res = curl_exec($ch);
            curl_close($ch);

            return json_decode($res);
        }
       
       
       
        /*
        Fonction : Créer une prédiction
        Paramètres :
        $broadcaster_id (string) -> Identifiant de la chaine
        $titre (string) -> Titre de la prédiction
        $outcomes (array) -> Tableau avec les réponses de la prédiction
        $duree (int) -> Durée de la prédiction en secondes (min : 1, max : 1800)
        Retourne : JSON
        Plus d'informations : https://dev.twitch.tv/docs/api/reference#create-prediction
        */
        public function create_prediction($broadcaster_id, $titre, $outcomes, $duree){
            $link = API_LINK."/predictions";
           
            $ch = curl_init($link);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $this->_headers);
            /*
            $outcomes = array(
                        array("title" => "Oui"),
                        array("title" => "Non"),
                    );
                    */
                    $json = array(
                        "broadcaster_id" => $broadcaster_id,
                        "title" => $titre,
                        "outcomes" => $outcomes,
                        "prediction_window" => $duree,
                    );
                    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($json));
                    $res = curl_exec($ch);
                    curl_close($ch);
                    return json_decode($res);
        }
       
       
       
        /*
        Fonction : Terminier une prédiction
        Paramètres :
        $broadcaster_id (int) -> Identifiant de la chaine
        $id (string) -> Identifiant de la prédiction
        $status (string) -> Resultat de la prédiction      
        $winning_outcome_id (string) [optionnel] -> Identifiant de la réponse gagnante de la prédiction
        Retourne : JSON
        Plus d'informations : https://dev.twitch.tv/docs/api/reference#end-prediction
        */
        public function end_prediction($broadcaster_id, $id, $status, $winning_outcome_id){
            $link = API_LINK."/predictions";
           
            $ch = curl_init($link);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
            curl_setopt($ch, CURLOPT_HTTPHEADER, $this->_headers);
            if(strtoupper($status) == "RESOLVED"){
                        $json = array(
                            "broadcaster_id" => $broadcaster_id,
                            "id" => $id,
                            "status" => strtoupper($status),
                            "winning_outcome_id" => $winning_outcome_id,
                        );
            }
            else
            {
                        $json = array(
                            "broadcaster_id" => $broadcaster_id,
                            "id" => $id,
                            "status" => strtoupper($status),
                        );
            }
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($json));
                    $res = curl_exec($ch);
                    curl_close($ch);
                    return json_decode($res);
        }


        /*
        Fonction : Récupére les informations de la prédiction
        Paramètres :
        $broadcaster_id (int) -> Identifiant de la chaine
        Retourne : JSON
        Plus d'informations : https://dev.twitch.tv/docs/api/reference#get-predictions
        */
        public function get_prediction($broadcaster_id, $id){
            $link = API_LINK."/predictions?broadcaster_id=".$broadcaster_id."&id=".$id;
           
            // cURL
            $ch = curl_init($link);

            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $this->_headers);

            $res = curl_exec($ch);
            curl_close($ch);

            // on decode et on renvoie
            return json_decode($res);
        }
    }

Utilisation de GPT-4 pour reformuler les phrases et corriger les fautes.
 
Haut