Menerima pesan dari siaran youtube + otorisasi google dalam PHP

Suatu hari ada tugas menerima pesan dari aliran youtube. Saya tidak menemukan artikel tentang hal ini, tetapi hanya ada off. dokumentasi google Saya menemukan jawabannya (saya harap) dan siap untuk berbagi pengalaman saya dengan Anda.

gambar

Hal pertama yang saya temukan adalah metode daftar LiveChatMessages: akan terlihat bahwa semuanya sederhana, tetapi parameter yang diperlukan adalah untuk lulus liveChatId, yang bisa Anda dapatkan dengan membuat permintaan ke LiveBroadcasts: daftar , tetapi untuk membuat permintaan di sana, Anda perlu mengotorisasi pengguna melalui google dengan akses ke membaca akun. Dalam contoh, semuanya dijabarkan secara terperinci, tetapi jika Anda membaca artikel ini, mungkin itu tidak begitu jelas seperti yang kita inginkan.

Gabung


Konsol Google


Menggunakan OAuth 2.0 untuk Aplikasi Server Web , saya ingin segera mencatat bahwa otorisasi Server Web diperlukan, karena kunci yang dikirimkan selama otorisasi ke js berlangsung satu jam, dan itu tidak akan diperbarui (tanpa partisipasi pengguna). token penyegaran tidak ditransmisikan. Juga, saya sarankan menggunakan salah satu perpustakaan yang sudah jadi, semuanya akan lebih mudah dengan mereka.

Pertama, buat akun. Buka console.developers.google.com , pilih proyek di sudut kiri atas dan klik "Buat Proyek".



Masukkan nama dan simpan. Sekarang pilih proyek Anda dan klik "Aktifkan API dan Layanan" atau buka halaman perpustakaan API .
Di sini, dalam permintaan pencarian, temukan dan aktifkan YouTube Data API v3.

Lalu, di tab "Jendela Permintaan Akses OAuth" di panel kiri konsol ( atau di sini ), buat jendela.
Pada langkah pertama, pilih "Eksternal" untuk Jenis Pengguna.



Selanjutnya, dalam formulir ini Anda perlu mengisi 2 bidang - nama aplikasi dan "Domain resmi", jika Anda memiliki domain, Anda dapat membiarkan bidang itu kosong jika tidak ada. Klik simpan. Hasilnya harus seperti



Sekarang, buka tab "Kredensial" (https://console.developers.google.com/apis/credentials)

Di sini Anda akan menemukan halaman seperti itu:



Pilih tombol "Buat Kredensial" -> "Identifier Klien OAuth ยป
Pilih jenis yang Anda inginkan (bagi kami, web), masukkan nama dan "URI pengalihan yang diizinkan" - ini adalah url yang akan dikirim kode untuk mengotorisasi klien. Anda dapat menulis di sini url lokal pada saat pengembangan, dalam kasus saya nanti
http: // localhost: 8080 / oauth2callback.php

Hasil




Setelah itu, sebuah jendela dengan ID klien dan kunci Rahasia akan muncul. Meskipun ini ditutup dengan aman. Ini adalah halaman dengan kredensial yang baru saja dibuat.



Klik tombol Unduh untuk pengenal:



Anda dapat segera mengganti namanya menjadi secret_json.json.

Ini dilakukan dengan mengatur otorisasi, sekarang mari kita mulai ke kode.

Php


Buat proyek, buka terminal dan jalankan perintah:

php composer.phar require google/apiclient:^2.0

Jika Anda tidak tahu apa itu komposer dan bagaimana cara menginstalnya, berkenalanlah.
Setelah instalasi, buat 2 file - index.php dan oauth2callback.php. Omong-
omong, Anda sudah dapat memulai server PHP Anda:

php -S localhost:8080

Juga pindahkan file secret_json.json (yang sudah Anda unduh sebelumnya) ke folder proyek.

Langsung di Index.php Anda akan mengirim pengguna untuk otorisasi. Isi File 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;

Bahkan, kode ini akan memberikan pengguna semua data yang diperlukan, Anda dapat menuliskannya ke basis data (atau notepad).

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

File ini akan mengarahkan pengguna ke halaman otorisasi Google dan menulis data token ke sesi. Setelah itu, pengguna akan kembali ke tempat index.php akan terus bekerja dengan mereka.
Tentu saja, Anda dapat menulis semua data secara langsung ke oauth2callback dan tidak mengarahkan pengguna kembali ke indeks, atau Anda dapat menentukan titik berikutnya dengan alamat yang nyaman bagi Anda. Juga, kesalahan otorisasi tidak diperhitungkan dalam kode ini, ingatlah ini.

Ini dilakukan dengan otorisasi. Anda sudah memiliki access_token dan refresh_token, mari dapatkan YouTube.

Youtube


PHP segera


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


Ingat baris ini selama otorisasi?

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

Jadi, mereka bertanggung jawab atas akses apa yang Anda butuhkan. Misalnya, catatan seperti itu hanya memungkinkan membaca informasi, ada yang https://www.googleapis.com/auth/youtube.uploadlain.

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

Token yang dikeluarkan oleh Google hanya berlaku selama satu jam. Pada siang hari Anda hanya dapat membuat 25 permintaan untuk memperbarui token, fungsi ini hanya memperbarui token kami dan mengembalikan nilai-nilai baru yang dengannya Anda dapat terus bekerja. GetStreams menunjukkan kerjanya.

Dan akhirnya
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);

Di sini saya tidak mulai membawa format pesan ke format yang diinginkan, Anda dapat melakukannya sendiri, array $ response berisi semua informasi yang diperlukan, dan tautan ke artikel ada di sini .

Yang membuat saya kesal adalah tidak ada metode untuk mendapatkan pengait (jika ada, tinggalkan tautan) dan Anda harus membuat permintaan konstan.

Juga, saya sarankan membaca dokumentasi liveChatMessages, ada beberapa batasan di dalamnya, seperti Anda perlu membuat permintaan untuk setiap halaman dengan kode baru yang datang dalam permintaan sebelumnya.

Proyek Github dengan db (yang tersisa hanyalah mengunggah file client_secret.json)

All Articles