用PHP接收来自youtube广播和Google授权的消息

前几天,有一项任务是从YouTube流中接收消息。我没有找到关于这个主题的文章,但是只有很多。谷歌文档 我想出了(希望),并准备与您分享我的经验。

图片

我发现的第一件事是LiveChatMessages:list方法,似乎一切都很简单,但是必需的参数是传递liveChatId,您可以通过向LiveBroadcasts:list发出请求来获取,但是要在此发出请求,您需要通过google授权用户访问阅读帐户。在示例中,详细说明了所有内容,但是如果您阅读本文,也许它不是我们想要的那么清晰。

登录


Google控制台


使用OAuth 2.0 for Web Server Applications,我要立即指出,需要Web Server授权,因为在授权给js期间传输的密钥持续一个小时,并且不会被更新(在用户的参与下)。不发送刷新令牌。另外,我建议使用一种现成的库,使用它们将使一切变得容易得多。

首先,创建一个帐户。转到console.developers.google.com,选择左上角的项目,然后单击“创建项目”。



输入名称并保存。现在选择您的项目,然后单击“启用API和服务”或转到API库页面。
在此处,在搜索查询中,找到并启用YouTube Data API v3。

然后,在控制台左窗格(或此处中的“ OAuth访问请求窗口”选项卡中,创建一个窗口。
第一步,选择“外部”作为“用户类型



”,然后,在此表单中,您需要填写2个字段-应用程序名称和“授权域”,如果您有域,则如果没有,则可以将其保留为空。点击保存。结果应该类似于以下内容:



现在转到 “凭据” 选项卡(https://console.developers.google.com/apis/credentials)。

在这里您将找到这样的页面:



选择“创建凭据”按钮->“标识符” OAuth客户端»
选择您想要的类型(对于我们来说是Web),输入名称和“ Allowed redirect URIs”(允许重定向URI)-这是将向其发送代码以授权客户端的URL。您可以在开发时在此处编写本地网址,以我为例
http://本地主机:8080 / oauth2callback.php

结果




之后,将出现一个包含客户端ID和密钥的窗口。在安全关闭的同时。这是一个带有刚刚创建的凭据的页面,



单击“下载”按钮以获取一个标识符:



您可以立即将其重命名为secret_json.json。

这是通过设置授权来完成的,现在让我们开始编写代码。

p


创建一个项目,打开一个终端并运行命令:

php composer.phar require google/apiclient:^2.0

如果您不知道什么是作曲家以及如何安装它,请结识。
安装后,创建2个文件-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其他信息。

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

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

在这里,我并没有开始将消息格式设置为所需的格式,您可以自己完成操作,$ response数组包含所有必要的信息,并且本文的链接位于此处

让我不高兴的是,没有获取钩子的方法(如果有钩子,请留下链接),而您必须不断提出请求。

另外,我建议阅读liveChatMessages的文档,其中有一些限制,例如您需要使用上一个请求中的新代码对每个页面进行请求。带有db的

Github项目(剩下的就是上传client_secret.json文件)

All Articles