Jak korzystać z interfejsu API YouTube do przesyłania filmów na kanał YouTube
Wszyscy wiedzą o YouTube. YouTube to najlepsza platforma do udostępniania filmów na świecie. Możemy używać YouTube do hostowania naszych filmów. Oszczędza to nam dużo miejsca na serwerze i można łatwo umieścić film z YouTube na stronie internetowej. Każdy może przesłać film na YouTube. Wszystko, co musisz zrobić, to zalogować się na swoje konto YouTube i przesłać film. Prosty i nieskomplikowany proces. Ale co, jeśli ktoś musi przesyłać filmy za pośrednictwem interfejsu API YouTube na kanał YouTube? Czy to możliwe? Tak to mozliwe. W tym artykule dowiemy się, jak używać interfejsu API YouTube do przesyłania wideo za pomocą PHP.
Zarejestruj aplikację i utwórz poświadczenia
Aby rozpocząć korzystanie z interfejsu YouTube API, potrzebujesz konta Google. Po założeniu konta Google zarejestruj aplikację i uzyskaj klucze API.
Poniżej znajdują się kroki, aby zarejestrować aplikację i uzyskać klucze API.
- Przejdź do Konsoli programisty Google https://console.developers.google.com
- Utwórz nowy projekt. Możesz również wybrać istniejący projekt.
- Wpisz nazwę swojego projektu. Konsola Google utworzy unikalny identyfikator projektu.
- Po utworzeniu projektu pojawi się on na górze lewego paska bocznego.
- Kliknij Biblioteka. Zobaczysz listę interfejsów Google API.
- Włącz interfejs API danych YouTube.
- Kliknij poświadczenia. Wybierz identyfikator klienta Oauth w obszarze Utwórz poświadczenia. Wybierz przycisk radiowy dla aplikacji internetowej.
- Podaj imię. W obszarze Autoryzowane źródła JavaScript wpisz adres URL swojej domeny. W Autoryzowanych identyfikatorach URI przekierowania podaj link do adresu URL przekierowania. W moim przypadku przekazałem adres URL http://localhost/youtube/callback.php.
- Kliknij przycisk Utwórz. W wyskakującym okienku otrzymasz identyfikator klienta i klucz klienta. Skopiuj te dane. Za chwilę będzie nam potrzebny.
Skonfiguruj konfigurację podstawową
Przesyłanie wideo za pomocą interfejsu API YouTube wymaga utworzenia tokena dostępu. Token dostępu to nic innego jak identyfikator konta YouTube.
Ale token dostępu wygasa po pewnym czasie. Gdy token dostępu wygaśnie, pojawi się błąd „Nieautoryzowany dostęp". Rozwiązaniem jest ponowne uruchomienie procesu autoryzacji lub ponowne wygenerowanie tokena dostępu w tle i zakończenie procesu przesyłania. W tym artykule wybieram drugie rozwiązanie. Zregenerujemy token dostępu, jeśli wygasł w tle, bez przerywania procesu przesyłania. Dzięki temu nie musisz wielokrotnie wykonywać procesu autoryzacji.
Biorąc to pod uwagę, musisz najpierw autoryzować konto, aby wygenerować token dostępu. Wykorzystam bibliotekę Hybridauth do autoryzacji i wygenerowania tokena dostępu. Otwórz swój composer.json
plik i dodaj do niego poniższe wiersze.
{
"require": {
"google/apiclient": "2.0",
"hybridauth/hybridauth": "~3.0"
}
}
Zanotuj YouTube to produkt Google, a API YouTube to nic innego jak interfejs API Google. Dlatego używamy biblioteki „google/apiclient”. Następnie uruchom poniższe polecenie, aby zainstalować te biblioteki.
composer install
Konfiguracja bazy danych
Przy każdym wywołaniu API musimy wysłać token dostępu, więc przechowuj go w bazie danych. Utwórz tabelę „token” w swojej bazie danych, korzystając z poniższego zapytania.
CREATE TABLE `token` ( `id` int(11) NOT NULL AUTO_INCREMENT,
`access_token` text NOT NULL,
PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
W dalszej części tego artykułu musimy wchodzić w interakcję z tą tabelą „tokenów”, aby pobrać i zaktualizować szczegóły tokenów. Wymaga to napisania połączenia z bazą danych i kilku zapytań. Utwórz plik class-db.php
i dodaj do niego następujący kod.
klasa-db.php
<?php
class DB {
private $dbHost = "DB_HOST";
private $dbUsername = "DB_USERNAME";
private $dbPassword = "DB_PASSWORD";
private $dbName = "DB_NAME";
public function __construct(){
if(!isset($this->db)){
// Connect to the database
$conn = new mysqli($this->dbHost, $this->dbUsername, $this->dbPassword, $this->dbName);
if($conn->connect_error){
die("Failed to connect with MySQL: ". $conn->connect_error);
}else{
$this->db = $conn;
}
}
}
public function is_table_empty() {
$result = $this->db->query("SELECT id FROM token");
if($result->num_rows) {
return false;
}
return true;
}
public function get_access_token() {
$sql = $this->db->query("SELECT access_token FROM token");
$result = $sql->fetch_assoc();
return json_decode($result['access_token']);
}
public function get_refersh_token() {
$result = $this->get_access_token();
return $result->refresh_token;
}
public function update_access_token($token) {
if($this->is_table_empty()) {
$this->db->query("INSERT INTO token(access_token) VALUES('$token')");
} else {
$this->db->query("UPDATE token SET access_token = '$token' WHERE id = (SELECT id FROM token)");
}
}
}
Przekaż swoje poświadczenia bazy danych w powyższym pliku. Zakładam, że chcesz używać jednego konta YouTube. Jeśli zamierzasz korzystać z wielu kont, zmodyfikuj powyższe zapytania zgodnie ze swoimi wymaganiami.
Wygeneruj token dostępu
Zainstalowałeś biblioteki i utworzyłeś tabelę do przechowywania tokena. Teraz zróbmy proces autoryzacji, pobierz token dostępu i zapisz go w tabeli „token”.
Utwórz config.php
plik i napisz konfigurację zgodnie z wytycznymi biblioteki HybridAuth.
config.php
<?php
require_once 'vendor/autoload.php';
require_once 'class-db.php';
define('GOOGLE_CLIENT_ID', 'PASTE_CLIENT_ID_HERE');
define('GOOGLE_CLIENT_SECRET', 'PASTE_CLIENT_SECRET_HERE');
$config = [
'callback' => 'YOUR_DOMAIN_URL/callback.php',
'keys' => [
'id' => GOOGLE_CLIENT_ID,
'secret' => GOOGLE_CLIENT_SECRET
],
'scope' => 'https://www.googleapis.com/auth/youtube https://www.googleapis.com/auth/youtube.upload',
'authorize_url_parameters' => [
'approval_prompt' => 'force', // to pass only when you need to acquire a new refresh token.
'access_type' => 'offline'
]
];
$adapter = new HybridauthProviderGoogle( $config );
Zastąp symbole zastępcze rzeczywistymi wartościami swoich danych logowania Google. Dodaj ten sam adres URL wywołania zwrotnego, który podałeś podczas tworzenia aplikacji konsolowej. Oznacza to, że po zakończeniu procesu autoryzacji użytkownik przekieruje do callback.php
pliku.
W callback.php
pliku pobierzemy szczegóły tokena dostępu i zapiszemy go w bazie danych.
callback.php
<?php
require_once 'config.php';
try {
$adapter->authenticate();
$token = $adapter->getAccessToken();
$db = new DB();
if($db->is_table_empty()) {
$db->update_access_token(json_encode($token));
echo "Access token inserted successfully.";
}
}
catch( Exception $e ){
echo $e->getMessage() ;
}
Przejdź do przeglądarki i uruchom YOUR_DOMAIN_URL/callback.php, nastąpi przekierowanie do konta Google, zakończysz proces autoryzacji i powinieneś zobaczyć komunikat o powodzeniu. Sprawdź tabelę bazy danych „token”. Powinna zawierać dane Twojego tokena. A to oznacza, że możesz przesłać film na swój kanał YouTube.
Prześlij wideo na kanał YouTube za pomocą interfejsu API YouTube
Otrzymałeś token dostępu, który zostanie użyty do przesłania filmu na kanał YouTube za pośrednictwem Google API. Ale tak jak wspomniałem wcześniej, token dostępu wygaśnie po jakimś czasie i zregenerujemy go w tle bez ponownego proszenia o autoryzację.
Możemy to zrobić za pomocą ‘refersh_token’. Jeśli spojrzysz na kolumnę „access_token” w tabeli, zobaczysz, że zawiera ona również wpis „refresh_token”. Używając „refresh_token” wywołujemy punkt końcowy „/o/oauth2/token” i regenerujemy token dostępu w tle.
Następnie potrzebujesz formularza HTML, za pomocą którego możesz przeglądać wideo i wysyłać je na serwer w celu przesłania. Stwórzmy prosty formularz HTML w następujący sposób.
index.php
<form method="post" enctype="multipart/form-data">
<p><input type="text" name="title" placeholder="Enter Video Title" /></p>
<p><textarea name="summary" cols="30" rows="10" placeholder="Video description"></textarea></p>
<p><input type="file" name="file"/></p>
<input type="submit" name="submit" value="Submit" />
</form>
Formularz ma 3 pola – tytuł, opis i plik. Po przesłaniu tego formularza film wideo powinien zostać przesłany na Twój kanał YouTube wraz z podanym tytułem i opisem.
index.php
<?php
require_once 'config.php';
if (isset($_POST['submit'])) {
$arr_data = array(
'title' => $_POST['title'],
'summary' => $_POST['summary'],
'video_path' => $_FILES['file']['tmp_name'],
);
upload_video_on_youtube($arr_data);
}
function upload_video_on_youtube($arr_data) {
$client = new Google_Client();
$db = new DB();
$arr_token = (array) $db->get_access_token();
$accessToken = array(
'access_token' => $arr_token['access_token'],
'expires_in' => $arr_token['expires_in'],
);
$client->setAccessToken($accessToken);
$service = new Google_Service_YouTube($client);
$video = new Google_Service_YouTube_Video();
$videoSnippet = new Google_Service_YouTube_VideoSnippet();
$videoSnippet->setDescription($arr_data['summary']);
$videoSnippet->setTitle($arr_data['title']);
$video->setSnippet($videoSnippet);
$videoStatus = new Google_Service_YouTube_VideoStatus();
$videoStatus->setPrivacyStatus('public');
$video->setStatus($videoStatus);
try {
$response = $service->videos->insert(
'snippet,status',
$video,
array(
'data' => file_get_contents($arr_data['video_path']),
'mimeType' => 'video/*',
'uploadType' => 'multipart'
)
);
echo "Video uploaded successfully. Video id is ". $response->id;
} catch(Exception $e) {
if( 401 == $e->getCode()) {
$refresh_token = $db->get_refersh_token();
$client = new GuzzleHttpClient(['base_uri' => 'https://accounts.google.com']);
$response = $client->request('POST', '/o/oauth2/token', [
'form_params' => [
"grant_type" => "refresh_token",
"refresh_token" => $refresh_token,
"client_id" => GOOGLE_CLIENT_ID,
"client_secret" => GOOGLE_CLIENT_SECRET,
],
]);
$data = (array) json_decode($response->getBody());
$data['refresh_token'] = $refresh_token;
$db->update_access_token(json_encode($data));
upload_video_on_youtube($arr_data);
} else {
//echo $e->getMessage(); //print the error just in case your video is not uploaded.
}
}
}
?>
Powyższy kod pobiera plik wideo z formularza HTML i przesyła go za pośrednictwem interfejsu API na Twój kanał YouTube. Jeśli Twój token dostępu wygasł, ponownie generuje token w tle i kontynuuje proces bez jego łamania.
Prześlij niestandardową miniaturę do filmu na YouTube
Jeśli tworzysz niestandardową aplikację, która zarządza filmami z YouTube, prawdopodobnie chcesz przesłać miniaturę na film z YouTube. Aby przesłać niestandardową miniaturę, użytkownicy powinni zweryfikować swój numer telefonu na koncie YouTube. Odwiedź linkhttps://www.youtube.com/features i przeprowadź weryfikację numeru telefonu.
Po zweryfikowaniu numeru telefonu możesz użyć naszego poprzedniego formularza i kodu z niewielkimi modyfikacjami i ustawić niestandardową miniaturę dla przesłanego filmu. Najpierw dodaj pole formularza, które umożliwia wgrywanie zdjęć. Zalecany rozmiar miniatury YouTube to 1280x720
.
<p>
<label>Image</label>
<input type="file" name="image" accept="image/*" />
</p>
Na formularzu zgłoszeniowym zbudowaliśmy tablicę, $arr_data
która zawiera wszystkie dane formularza. Dodaj nową parę dla obrazu do tablicy $arr_data
w następujący sposób.
$arr_data = array(
'title' => $_POST['title'],
'summary' => $_POST['summary'],
'video_path' => $_FILES['file']['tmp_name'],
'image_path' => $_FILES['image']['tmp_name'], // here we are passing image
);
Następnie, gdy nasz kod prześle wideo na YouTube, musimy pobrać identyfikator wideo i przypisać do niego niestandardową miniaturę.
<?php
...
...
echo "Video uploaded successfully. Video id is ". $response->id;
//upload thumbnail
$videoId = $response->id;
$chunkSizeBytes = 1 * 1024 * 1024;
$client->setDefer(true);
$setRequest = $service->thumbnails->set($videoId);
$media = new Google_Http_MediaFileUpload(
$client,
$setRequest,
'image/png',
null,
true,
$chunkSizeBytes
);
$imagePath = $arr_data['image_path'];
$media->setFileSize(filesize($imagePath));
$status = false;
$handle = fopen($imagePath, "rb");
while (!$status && !feof($handle)) {
$chunk = fread($handle, $chunkSizeBytes);
$status = $media->nextChunk($chunk);
}
fclose($handle);
$client->setDefer(false);
echo "<br>Thumbanil: ". $status['items'][0]['default']['url'];
Usuń wideo z kanału YouTube za pomocą interfejsu API YouTube
Możesz również chcieć kod do usuwania filmów za pomocą interfejsu API YouTube. Aby usunąć wideo, potrzebujesz dodatkowego zakresu, https://www.googleapis.com/auth/youtube
który już umieściłem powyżej w pliku konfiguracyjnym. Oznacza to, że token dostępu wygenerowany zgodnie z powyższymi krokami może zostać użyty do usunięcia filmu.
Poniżej znajduje się kod, który usunie film z Twojego kanału YouTube.
<?php
require_once 'config.php';
delete_video('VIDEO_ID_HERE');
function delete_video($id) {
$client = new Google_Client();
$db = new DB();
$arr_token = (array) $db->get_access_token();
$accessToken = array(
'access_token' => $arr_token['access_token'],
'expires_in' => $arr_token['expires_in'],
);
try {
$client->setAccessToken($accessToken);
$service = new Google_Service_YouTube($client);
$service->videos->delete($id);
} catch(Exception $e) {
if( 401 == $e->getCode()) {
$refresh_token = $db->get_refersh_token();
$client = new GuzzleHttpClient(['base_uri' => 'https://accounts.google.com']);
$response = $client->request('POST', '/o/oauth2/token', [
'form_params' => [
"grant_type" => "refresh_token",
"refresh_token" => $refresh_token,
"client_id" => GOOGLE_CLIENT_ID,
"client_secret" => GOOGLE_CLIENT_SECRET,
],
]);
$data = (array) json_decode($response->getBody());
$data['refresh_token'] = $refresh_token;
$db->update_access_token(json_encode($data));
delete_video($id);
} else {
//echo $e->getMessage(); //print the error just in case your video is not uploaded.
}
}
}
Otóż to! Mam nadzieję, że wiesz, jak przesłać film na kanał YouTube za pomocą interfejsu API YouTube. Chciałbym usłyszeć Twoje przemyślenia lub sugestie w sekcji komentarzy poniżej.
Powiązane artykuły
- Jak przesłać wideo na YouTube w aplikacji Laravel
- Jak uzyskać tagi wideo YouTube za pomocą interfejsu API YouTube?
- YouTube API – jak uzyskać listę filmów z YouTube na swoim kanale
- Jak uzyskać listę filmów YouTube według słów kluczowych za pomocą interfejsu API wyszukiwania YouTube YouTube