No outro dia, houve uma tarefa de receber mensagens do stream do youtube. Não encontrei artigos sobre esse assunto, mas existem apenas desvantagens. documentação do google Eu descobri (espero) e estou pronto para compartilhar minha experiência com você.
A primeira coisa que encontrei foi o método LiveChatMessages: list , parece que tudo é simples, mas o parâmetro necessário é passar o liveChatId, que você pode obter fazendo uma solicitação ao LiveBroadcasts: list , mas para fazer uma solicitação lá, é necessário autorizar o usuário pelo google com acesso a conta de leitura. Nos exemplos, tudo está detalhado em detalhes, mas se você estiver lendo este artigo, pode não ser tão claro quanto gostaríamos.Conecte-se
Consola do Google
Usando o OAuth 2.0 para aplicativos de servidor da Web , quero observar imediatamente que a autorização do servidor da Web é necessária, porque a chave transmitida durante a autorização para js dura uma hora e não será atualizada (sem a participação do usuário). o token de atualização não é transmitido. Além disso, eu recomendo usar uma das bibliotecas prontas, tudo será muito mais fácil com elas.Primeiro, crie uma conta. Acesse console.developers.google.com , selecione os projetos no canto superior esquerdo e clique em "Criar projeto".
Digite um nome e salve. Agora selecione seu projeto e clique em "Ativar APIs e serviços" ou acesse a página da biblioteca de APIs .Aqui, na consulta de pesquisa, encontre e ative a API de dados do YouTube v3.Em seguida, na guia "Janela de solicitação de acesso OAuth" no painel esquerdo do console ( ou aqui ), crie uma janela.Na primeira etapa, selecione "Externo" para o Tipo de usuário.
Em seguida, neste formulário, é necessário preencher 2 campos - o nome do aplicativo e "Domínios autorizados", se você tiver um domínio, deixe o campo vazio, se não houver nenhum. Clique em salvar. O resultado deve ser algo como
Agora vá para a guia "Credenciais" (https://console.developers.google.com/apis/credentials).Aqui você encontrará uma página:
Selecione o botão "Criar credenciais" -> "Identificador Cliente OAuth »Selecione o tipo que você deseja (para nós, a web), digite o nome e "URIs de redirecionamento permitido" - esse é o URL para o qual o código será enviado para autorizar o cliente. Você pode escrever aqui um URL local no momento do desenvolvimento, no meu caso, seráhttp: // localhost: 8080 / oauth2callback.php
Resultado
Depois disso, uma janela com o ID do cliente e a chave secreta deve aparecer. Enquanto isso estiver fechando com segurança. Aqui está uma página com as credenciais recém -criadas.Clique
no botão Download para obter um identificador:
Você pode renomeá-la imediatamente para secret_json.json.Isso é feito com a configuração da autorização, agora vamos ao código.Php
Crie um projeto, abra um terminal e execute o comando:php composer.phar require google/apiclient:^2.0
Se você não sabe o que é o compositor e como instalá-lo, familiarize-se.Após a instalação, crie 2 arquivos - index.php e oauth2callback.php. Apropósito, você já pode iniciar o servidor PHP:php -S localhost:8080
Mova também o arquivo secret_json.json (que você baixou anteriormente) para a pasta do projeto.Diretamente no Index.php, você enviará o usuário para autorização. Conteúdo do arquivo 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',
]);
$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;
De fato, esse código fornecerá ao usuário todos os dados necessários, você poderá gravá-los no banco de dados (ou no bloco de notas).Arquivo 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));
}
Esse arquivo redirecionará o usuário para a página de autorização do Google e gravará os dados do token na sessão. Depois, ele retornará ao usuário para onde index.php continuará trabalhando com eles.Obviamente, você pode gravar todos os dados diretamente no oauth2callback e não redirecionar o usuário de volta ao índice, ou pode especificar no próximo ponto qualquer endereço conveniente para você. Além disso, os erros de autorização não foram levados em consideração neste código, lembre-se disso.Isso é feito com autorização. Você já tem access_token e refresh_token, vamos ao YouTube.Youtube
PHP imediatamente
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");
if (($data['created'] - time()) <= -3600) {
$data = refreshToken($data['refreshToken'], $db);
}
$client->setAccessToken($data['accessToken']);
$service = new Google_Service_YouTube($client);
$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;
}
Lembra dessas linhas durante a autorização?$client->setScopes([
'https://www.googleapis.com/auth/youtube.readonly',
]);
Portanto, eles são responsáveis por que tipo de acesso você precisa. Por exemplo, esse registro permite apenas a leitura de informações, existem https://www.googleapis.com/auth/youtube.upload
outras.refreshToken.php:<?php
require_once __DIR__ . '/vendor/autoload.php';
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;
}
O token emitido pelo Google é válido apenas por uma hora. Durante o dia, você pode fazer apenas 25 solicitações para atualizar o token, essa função apenas atualiza nosso token e retorna novos valores com os quais você pode continuar trabalhando. GetStreams demonstra seu trabalho.E, finalmente,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");
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);
Aqui, não comecei a colocar o formato da mensagem no formato desejado, você pode fazer isso sozinho, a matriz $ response contém todas as informações necessárias e o link para o artigo está aqui .O que me chateou é que não existe um método para obter ganchos (se houver um, deixe um link, por favor) e você precisa fazer solicitações constantes.Além disso, eu recomendo a leitura da documentação do liveChatMessages, existem algumas restrições, como você precisa fazer uma solicitação para cada página com um novo código que veio na solicitação anterior.Projeto Github com db (tudo o que resta é fazer upload do arquivo client_secret.json)