Empfangen von Nachrichten von YouTube-Sendungen + Google-Autorisierung in PHP

Neulich gab es die Aufgabe, Nachrichten vom YouTube-Stream zu empfangen. Ich habe keine Artikel zu diesem Thema gefunden, aber es gibt nur Offs. Google-Dokumentation Ich habe es herausgefunden (hoffe ich) und bin bereit, meine Erfahrungen mit Ihnen zu teilen.

Bild

Das erste, was ich fand, war die LiveChatMessages: list- Methode . Es scheint, dass alles einfach ist, aber der erforderliche Parameter ist die Übergabe von liveChatId, die Sie erhalten können, indem Sie eine Anfrage an LiveBroadcasts: list stellen . Um dort eine Anfrage zu stellen, müssen Sie den Benutzer über Google mit Zugriff auf autorisieren Konto lesen. In den Beispielen wird alles detailliert beschrieben, aber wenn Sie diesen Artikel lesen, ist er wahrscheinlich nicht so klar, wie wir es gerne hätten.

Anmeldung


Google-Konsole


Bei Verwendung von OAuth 2.0 für Webserveranwendungen möchte ich sofort darauf hinweisen, dass eine Webserverautorisierung erforderlich ist, da der während der Autorisierung an js übertragene Schlüssel eine Stunde dauert und nicht aktualisiert wird (ohne die Teilnahme des Benutzers). Aktualisierungstoken wird nicht übertragen. Außerdem empfehle ich die Verwendung einer der vorgefertigten Bibliotheken, mit denen alles viel einfacher wird.

Erstellen Sie zunächst ein Konto. Gehen Sie zu console.developers.google.com , wählen Sie die Projekte in der oberen linken Ecke aus und klicken Sie auf "Projekt erstellen".



Geben Sie einen Namen ein und speichern Sie. Wählen Sie nun Ihr Projekt aus und klicken Sie auf "APIs und Dienste aktivieren " oder rufen Sie die Seite " API-Bibliothek " auf.
Suchen und aktivieren Sie hier in der Suchabfrage die YouTube Data API v3.

Erstellen Sie dann auf der Registerkarte "OAuth Access Request Window" im linken Bereich der Konsole ( oder hier ) ein Fenster.
Wählen Sie im ersten Schritt "Extern" als Benutzertyp aus.



Als Nächstes müssen Sie in diesem Formular zwei Felder ausfüllen - den Namen der Anwendung und "Autorisierte Domänen". Wenn Sie eine Domäne haben, können Sie das Feld leer lassen, wenn keine vorhanden sind. Klicken Sie auf Speichern. Das Ergebnis sollte ungefähr so ​​lauten:



Gehen Sie jetzt zur Registerkarte "Anmeldeinformationen" (https://console.developers.google.com/apis/credentials).

Hier finden Sie eine solche Seite:



Wählen Sie die Schaltfläche "Anmeldeinformationen erstellen" -> "Kennung" OAuth Client »
Wählen Sie den gewünschten Typ (für uns das Web), geben Sie den Namen und "Zulässige Umleitungs-URIs" ein - dies ist die URL, an die der Code gesendet wird, um den Client zu autorisieren. Sie können hier eine lokale URL zum Zeitpunkt der Entwicklung schreiben, in meinem Fall wird es sein
http: // localhost: 8080 / oauth2callback.php

Ergebnis




Danach sollte ein Fenster mit der Client-ID und dem geheimen Schlüssel angezeigt werden. Während dies sicher schließt. Hier ist eine Seite mit den gerade erstellten Anmeldeinformationen.



Klicken Sie auf die Schaltfläche Herunterladen, um eine Kennung zu erhalten:



Sie können sie sofort in secret_json.json umbenennen.

Dies geschieht mit dem Einrichten der Autorisierung. Kommen wir nun zum Code.

Php


Erstellen Sie ein Projekt, öffnen Sie ein Terminal und führen Sie den folgenden Befehl aus:

php composer.phar require google/apiclient:^2.0

Wenn Sie nicht wissen, was Composer ist und wie es installiert wird, machen Sie sich mit ihm vertraut.
Erstellen Sie nach der Installation zwei Dateien - index.php und oauth2callback.php. Übrigens
können Sie Ihren PHP-Server bereits starten:

php -S localhost:8080

Verschieben Sie auch die Datei secret_json.json (die Sie zuvor heruntergeladen haben) in den Projektordner.

Direkt auf Index.php senden Sie den Benutzer zur Autorisierung. Index.php Dateiinhalt

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

Tatsächlich gibt dieser Code dem Benutzer alle erforderlichen Daten. Sie können sie in die Datenbank (oder den Notizblock) schreiben.

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

Diese Datei leitet den Benutzer zur Google-Autorisierungsseite weiter und schreibt die Token-Daten in die Sitzung. Danach kehrt der Benutzer dorthin zurück, wo index.php weiterhin mit ihm arbeitet.
Natürlich können Sie alle Daten direkt in oauth2callback schreiben und den Benutzer nicht zurück zum Index umleiten, oder Sie können den nächsten Punkt mit einer für Sie geeigneten Adresse angeben. Auch Autorisierungsfehler wurden in diesem Code nicht berücksichtigt. Beachten Sie dies.

Dies erfolgt mit Genehmigung. Du hast bereits access_token und refresh_token, lass uns YouTube holen.

Youtube


PHP sofort


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


Erinnern Sie sich an diese Zeilen während der Autorisierung?

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

Sie sind also dafür verantwortlich, welche Art von Zugriff Sie benötigen. Zum Beispiel erlaubt ein solcher Datensatz nur das Lesen von Informationen, es gibt https://www.googleapis.com/auth/youtube.uploadandere.

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

Das von Google ausgestellte Token ist nur eine Stunde gültig. Tagsüber können Sie nur 25 Anfragen zum Aktualisieren des Tokens stellen. Diese Funktion aktualisiert lediglich unser Token und gibt neue Werte zurück, mit denen Sie weiterarbeiten können. GetStreams demonstriert seine Arbeit.

Und schließlich
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);

Hier habe ich nicht begonnen, das Nachrichtenformat auf das gewünschte Format zu bringen. Sie können dies selbst tun. Das $ response-Array enthält alle erforderlichen Informationen und der Link zum Artikel befindet sich hier .

Was mich verärgert hat ist, dass es keine Methode gibt, um Hooks zu bekommen (wenn es eine gibt, hinterlassen Sie bitte einen Link) und Sie ständige Anfragen stellen müssen.

Außerdem empfehle ich, die Dokumentation von liveChatMessages zu lesen. Es gibt einige Einschränkungen, z. B. müssen Sie für jede Seite eine Anfrage mit einem neuen Code stellen, der in der vorherigen Anfrage enthalten war.

Github-Projekt mit db (alles, was bleibt, ist das Hochladen der Datei client_secret.json)

All Articles