Recevoir des messages des diffusions YouTube + autorisation google en PHP

L'autre jour, il y avait une tâche de recevoir des messages du flux youtube. Je n'ai pas trouvé d'articles sur ce sujet, mais il n'y a que des offs. documentation google Je l'ai compris (j'espère) et je suis prêt à partager mon expérience avec vous.

image

La première chose que j'ai trouvée était la méthode LiveChatMessages: list , il semblerait que tout soit simple, mais le paramètre requis est de passer liveChatId, que vous pouvez obtenir en faisant une demande à LiveBroadcasts: list , mais pour y faire une demande, vous devez autoriser l'utilisateur via google avec accès à compte de lecture. Dans les exemples, tout est expliqué en détail, mais si vous lisez cet article, il n'est peut-être pas aussi clair que nous le souhaiterions.

S'identifier


Console Google


En utilisant OAuth 2.0 pour les applications de serveur Web , je tiens à noter immédiatement que l'autorisation du serveur Web est requise, car la clé transmise lors de l'autorisation à js dure une heure et ne sera pas mise à jour (sans la participation de l'utilisateur). le jeton d'actualisation n'est pas transmis. De plus, je recommande d'utiliser l'une des bibliothèques prêtes à l'emploi, tout sera beaucoup plus facile avec elles.

Créez d'abord un compte. Accédez à console.developers.google.com , sélectionnez les projets dans le coin supérieur gauche et cliquez sur "Créer un projet".



Saisissez un nom et enregistrez. Sélectionnez maintenant votre projet et cliquez sur "Activer les API et les services" ou accédez à la page de la bibliothèque d'API .
Ici, dans la requĂŞte de recherche, recherchez et activez l'API YouTube Data v3.

Ensuite, dans l'onglet "Fenêtre de demande d'accès OAuth" dans le volet gauche de la console ( ou ici ), créez une fenêtre.
À la première étape, sélectionnez "Externe" pour le type d'utilisateur.



Ensuite, dans ce formulaire, vous devez remplir 2 champs - le nom de l'application et "Domaines autorisés", si vous avez un domaine, vous pouvez laisser le champ vide s'il n'y en a pas. Cliquez sur enregistrer. Le résultat devrait être quelque chose comme



Maintenant, allez dans l'onglet "Credentials" (https://console.developers.google.com/apis/credentials)

Ici vous trouverez une telle page:



Sélectionnez le bouton "Create Credentials" -> "Identifier Client OAuth »
Sélectionnez le type que vous souhaitez (pour nous, le Web), entrez le nom et "URI de redirection autorisés" - c'est l'URL à laquelle le code sera envoyé pour autoriser le client. Vous pouvez écrire ici une URL locale au moment du développement, dans mon cas ce sera
http: // localhost: 8080 / oauth2callback.php

RĂ©sultat




Après cela, une fenêtre avec l'ID client et la clé secrète devrait apparaître. Pendant que cela se ferme en toute sécurité. Voici une page avec les informations d'identification que vous venez de créer.



Cliquez sur le bouton Télécharger pour un identifiant:



Vous pouvez immédiatement le renommer secret_json.json.

Cela se fait avec la configuration de l'autorisation, passons maintenant au code.

Php


Créez un projet, ouvrez un terminal et exécutez la commande:

php composer.phar require google/apiclient:^2.0

Si vous ne savez pas ce qu'est Composer et comment l'installer, familiarisez-vous.
Après l'installation, créez 2 fichiers - index.php et oauth2callback.php. Au
fait, vous pouvez déjà démarrer votre serveur PHP:

php -S localhost:8080

Déplacez également le fichier secret_json.json (que vous avez téléchargé précédemment) dans le dossier du projet.

Directement sur Index.php, vous enverrez l'utilisateur pour autorisation. Contenu du fichier Index.php

<?php
require_once __DIR__ . '/vendor/autoload.php';

$client = new Google_Client();
//     
$client->setAuthConfig('client_secret.json');
//   
$client->setScopes([
    'https://www.googleapis.com/auth/youtube.readonly',
]);
//    refresh_token
$client->setAccessType("offline");

if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
    $client->setAccessToken($_SESSION['access_token']);
} else {
    $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php';
    header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
    exit();
}

$refreshToken = $_SESSION['access_token']['refresh_token'];
$accessToken = $_SESSION['access_token']['access_token'];
$tknType = $_SESSION['access_token']['token_type'];
$clientId = $client->getClientId();
$created = $_SESSION['access_token']['created'];
unset($_SESSION['access_token']);
unset($_SESSION['user']);
session_destroy();

$data = json_encode([
  'refreshToken' => $refreshToken,
    'accessToken' => $accessToken,
    'tknType' => $tknType,
    'clientId' => $clientId,
    'created' => $created
]);
echo $data;

En fait, ce code donnera à l'utilisateur toutes les données nécessaires, vous pouvez les écrire dans la base de données (ou bloc-notes).

Fichier oauth2callback.php:

<?php
require_once __DIR__.'/vendor/autoload.php';

session_start();

$client = new Google_Client();
$client->setAuthConfigFile('client_secret.json');
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');
$client->setScopes([
    'https://www.googleapis.com/auth/youtube.readonly',
]);
$client->setApprovalPrompt('force');
$client->setAccessType("offline");

if (!isset($_GET['code'])) {
    $auth_url = $client->createAuthUrl();
    header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
} else {
    $client->authenticate($_GET['code']);
    $_SESSION['access_token'] = $client->getAccessToken();
    $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/';
    header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}

Ce fichier redirige l'utilisateur vers la page d'autorisation Google et écrit les données de jeton dans la session. Ensuite, il ramènera l'utilisateur à l'endroit où index.php continuera à travailler avec lui.
Bien sûr, vous pouvez écrire toutes les données directement dans oauth2callback et ne pas rediriger l'utilisateur vers l'index, ou vous pouvez spécifier le point suivant avec n'importe quelle adresse qui vous convient. De plus, les erreurs d'autorisation n'ont pas été prises en compte dans ce code, gardez cela à l'esprit.

Cela se fait avec autorisation. Vous avez déjà access_token et refresh_token, passons à YouTube.

Youtube


PHP tout de suite


getStreams.php:

<?php
require_once __DIR__ . '/vendor/autoload.php';
//   
require_once __DIR__ . '/refreshToken.php';

$client = new Google_Client();
$client->setAuthConfig('client_secret.json');
$client->setScopes([
    'https://www.googleapis.com/auth/youtube.readonly',
]);
$client->setAccessType("offline");

//  $data      (   )
if (($data['created'] - time()) <= -3600) {
    $data = refreshToken($data['refreshToken'], $db);
}

$client->setAccessToken($data['accessToken']);
$service = new Google_Service_YouTube($client);
//  2          , 
//       .
$queryParams = [
    'broadcastStatus' => 'upcoming',
    'maxResults' => 50
];
$response = $service->liveBroadcasts->listLiveBroadcasts('id,snippet,status', $queryParams);
$items = $response['items'];
$streamsUpcoming = itemsGenerator($items);

$queryParams = [
    'broadcastStatus' => 'active',
    'maxResults' => 50
];
$response = $service->liveBroadcasts->listLiveBroadcasts('id,snippet,status', $queryParams);
$items = $response['items'];
$streamsActive = itemsGenerator($items);
$streams = array_merge($streamsUpcoming, $streamsActive);

//  
echo json_encode($streams);

//     ,   .
function itemsGenerator($items) {
    $streams = [];
    foreach ($items as $item) {
        //       (  )
        if (!isset($item['snippet']['actualEndTime'])) {
            $streams[] = [
                'id' => $item['id'],
                'title' => $item['snippet']['title'],
                'description' => $item['snippet']['description'],
                'image' => $item['snippet']['thumbnails']['medium']['url'],
                'liveChatId' => $item['snippet']['liveChatId'],
                'channelId' => $item['snippet']['channelId']
            ];
        }
    }
    return $streams;
}


Rappelez-vous ces lignes lors de l'autorisation?

$client->setScopes([
    'https://www.googleapis.com/auth/youtube.readonly',
]);

Ils sont donc responsables du type d'accès dont vous avez besoin. Par exemple, un tel enregistrement ne permet que la lecture d'informations, il y en a d' https://www.googleapis.com/auth/youtube.uploadautres.

refreshToken.php:

<?php
require_once __DIR__ . '/vendor/autoload.php';

/**
 * @param string $refreshToken
 * @param $db
 * @return array
 * @throws Google_Exception
 */
function refreshToken($refreshToken, $db)
{
    $client = new Google_Client();
    $client->setAuthConfig('client_secret.json');
    $client->setScopes([
        'https://www.googleapis.com/auth/youtube.readonly',
    ]);
    $client->setAccessType("offline");

    $client->refreshToken($refreshToken);
    $accessToken = $client->getAccessToken();

    $refreshToken = $accessToken['refresh_token'];
    $accessToken = $accessToken['access_token'];
    $clientId = $client->getClientId();
    $data = [
        'refreshToken' => $refreshToken,
        'accessToken' => $accessToken,
        'tknType' => 'Bearer',
        'clientId' => $clientId,
        'created' => time()
    ];

    //      , .

    return $data;
}

Le jeton émis par Google n'est valable que pendant une heure. Pendant la journée, vous ne pouvez effectuer que 25 demandes de mise à jour du jeton, cette fonction met simplement à jour notre jeton et renvoie de nouvelles valeurs avec lesquelles vous pouvez continuer à travailler. GetStreams montre son travail.

Et enfin
getStreamMessages.php:

<?php
require_once __DIR__ . '/vendor/autoload.php';
require_once __DIR__ . '/refreshToken.php';

$client = new Google_Client();
$client->setAuthConfig('client_secret.json');
$client->setScopes([
    'https://www.googleapis.com/auth/youtube.readonly',
]);
$client->setAccessType("offline");
// $data -      
if (($data['created'] - time()) <= -3600) {
    $data = refreshToken($data['refreshToken'], $db);
}
$client->setAccessToken($data['accessToken']);

$service = new Google_Service_YouTube($client);

$queryParams = [
    'maxResults' => 2000,
    'profileImageSize' => 120
];

$response = $service->liveChatMessages->listLiveChatMessages($liveChatId, 'id,snippet,authorDetails', $queryParams);

echo json_encode($response);

Ici, je n'ai pas commencé à apporter le format de message au format souhaité, vous pouvez le faire vous-même, le tableau $ response contient toutes les informations nécessaires et le lien vers l'article est ici .

Ce qui me dérange, c'est qu'il n'y a pas de méthode pour obtenir des crochets (s'il y en a un, laissez un lien, s'il vous plaît) et vous devez faire des demandes constantes.

Aussi, je recommande de lire la documentation de liveChatMessages, il y a quelques restrictions, comme vous devez faire une demande pour chaque page avec un nouveau code qui est venu dans la demande précédente.

Projet Github avec db (il ne reste plus qu'à télécharger le fichier client_secret.json)

All Articles