استقبال رسائل من البث يوتيوب + إذن جوجل في PHP

في اليوم الآخر كانت هناك مهمة تلقي رسائل من دفق youtube. لم أجد مقالات حول هذا الموضوع ، ولكن هناك فقط متسلسلات. وثائق جوجل لقد اكتشفت ذلك (آمل) وأنا على استعداد لمشاركة تجربتي معك.

صورة

أول شيء وجدته هو LiveChatMessages: طريقة القائمة ، يبدو أن كل شيء بسيط ، ولكن المعلمة المطلوبة هي تمرير liveChatId ، والتي يمكنك الحصول عليها عن طريق تقديم طلب إلى LiveBroadcasts: list ، ولكن لتقديم طلب هناك ، تحتاج إلى تفويض المستخدم من خلال google مع الوصول إلى قراءة الحساب. في الأمثلة ، يتم توضيح كل شيء بالتفصيل ، ولكن إذا كنت تقرأ هذه المقالة ، فقد لا يكون واضحًا كما نود.

تسجيل الدخول


وحدة تحكم Google


باستخدام OAuth 2.0 لتطبيقات خادم الويب ، أود أن أشير على الفور إلى أن تفويض خادم الويب مطلوب ، لأن المفتاح الذي تم إرساله أثناء التفويض إلى js يستمر لمدة ساعة ، ولن يتم تحديثه (بدون مشاركة المستخدم). لم يتم إرسال رمز التحديث. أيضا ، أوصي باستخدام إحدى المكتبات الجاهزة ، سيكون كل شيء أسهل بكثير معهم.

أولاً ، قم بإنشاء حساب. انتقل إلى console.developers.google.com ، وحدد المشاريع في الزاوية اليسرى العليا وانقر على "إنشاء مشروع".



أدخل اسمًا واحفظه. حدد مشروعك وانقر على "تمكين واجهات برمجة التطبيقات والخدمات" أو انتقل إلى صفحة مكتبة واجهة برمجة التطبيقات .
هنا ، في طلب البحث ، ابحث عن الإصدار 3 من YouTube Data API وقم بتمكينه.

ثم ، في علامة التبويب "نافذة طلب وصول OAuth" في الجزء الأيمن من وحدة التحكم ( أو هنا ) ، قم بإنشاء نافذة.
في الخطوة الأولى ، حدد "خارجي" لنوع المستخدم.



بعد ذلك ، في هذا النموذج ، تحتاج إلى ملء حقلين - اسم التطبيق و "المجالات المعتمدة" ، إذا كان لديك مجال ، يمكنك ترك الحقل فارغًا إذا لم يكن هناك. انقر فوق حفظ. يجب أن تكون النتيجة شيئًا مثل



الآن انتقل إلى علامة التبويب "بيانات الاعتماد" (https://console.developers.google.com/apis/credentials)

هنا ستجد مثل هذه الصفحة:



حدد زر "إنشاء بيانات الاعتماد" -> "معرف عميل OAuth »
حدد النوع الذي تريده (بالنسبة لنا ، الويب) ، أدخل الاسم و "عناوين URI المعاد توجيهها المسموح بها" - هذا هو عنوان url الذي سيتم إرسال الرمز إليه لتفويض العميل. يمكنك كتابة عنوان url محلي هنا في وقت التطوير ، في حالتي سيكون
http: // localhost: 8080 / oauth2callback.php

نتيجة




بعد ذلك ، يجب أن تظهر نافذة بمعرف العميل والمفتاح السري. بينما يتم إغلاق هذا بأمان. هذه صفحة تحتوي على بيانات الاعتماد التي تم إنشاؤها للتو.



انقر فوق الزر تنزيل لمعرف:



يمكنك إعادة تسميته على الفور إلى secret_json.json.

يتم ذلك من خلال إعداد التفويض ، فلننتقل الآن إلى الرمز.

بي أتش بي


أنشئ مشروعًا وافتح نافذة طرفية وشغّل الأمر:

php composer.phar require google/apiclient:^2.0

إذا كنت لا تعرف ما هو الملحن وكيفية تثبيته ، تعرف عليه.
بعد التثبيت ، أنشئ ملفين - index.php و oauth2callback.php.
وبالمناسبة ، يمكنك بالفعل بدء تشغيل خادم PHP:

php -S localhost:8080

قم أيضًا بنقل الملف secret_json.json (الذي قمت بتنزيله سابقًا) إلى مجلد المشروع.

مباشرة على Index.php سترسل المستخدم للحصول على إذن. محتويات ملف 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;

في الواقع ، هذا الكود سيعطي المستخدم كل البيانات الضرورية ، يمكنك كتابتها إلى قاعدة البيانات (أو المفكرة).

ملف 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));
}

سيعيد هذا الملف توجيه المستخدم إلى صفحة تفويض Google ويكتب بيانات الرمز المميز إلى الجلسة. بعد ذلك ، سيعيد المستخدم إلى حيث سيستمر index.php في العمل معه.
بالطبع ، يمكنك كتابة جميع البيانات مباشرة إلى oauth2callback وعدم إعادة توجيه المستخدم إلى الفهرس ، أو يمكنك تحديد النقطة التالية بأي عنوان مناسب لك. أيضًا ، لم يتم أخذ أخطاء التفويض في الاعتبار في هذا الرمز ، ضع ذلك في الاعتبار.

يتم ذلك بإذن. لديك بالفعل access_token و Refresh_token ، فلنحصل على YouTube.

موقع يوتيوب


PHP على الفور


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


تذكر هذه السطور أثناء التفويض؟

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

لذا ، فهم مسؤولون عن نوع الوصول الذي تطلبه. على سبيل المثال ، مثل هذا السجل يسمح فقط بقراءة المعلومات ، وهناك https://www.googleapis.com/auth/youtube.uploadغيرها.

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

الرمز المميز الصادر من Google صالح لمدة ساعة فقط. خلال اليوم ، يمكنك إجراء 25 طلبًا فقط لتحديث الرمز المميز ، هذه الوظيفة تقوم فقط بتحديث الرمز المميز الخاص بنا وإرجاع القيم الجديدة التي يمكنك الاستمرار في العمل بها. يوضح GetStreams عمله.

وأخيرًا
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);

لم أبدأ هنا بإحضار تنسيق الرسالة إلى التنسيق المطلوب ، يمكنك القيام بذلك بنفسك ، حيث يحتوي مصفوفة الاستجابة $ على جميع المعلومات الضرورية ، ورابط المقالة هنا .

ما يزعجني هو أنه لا توجد طريقة للحصول على الخطافات (إذا كان هناك واحد ، اترك الرابط ، من فضلك) وعليك تقديم طلبات مستمرة.

أيضًا ، أوصي بقراءة وثائق liveChatMessages ، هناك بعض القيود فيها ، مثل أنك تحتاج إلى تقديم طلب لكل صفحة برمز جديد جاء في الطلب السابق.

مشروع Github باستخدام db (كل ما تبقى هو تحميل ملف client_secret.json)

All Articles