Come utilizzare l’API di YouTube per caricare video sul canale YouTube
Tutti conoscono YouTube. YouTube è la piattaforma di condivisione video numero uno al mondo. Possiamo utilizzare YouTube per ospitare i nostri video. Questo ci fa risparmiare molto spazio sul server e si può facilmente incorporare il video di YouTube sul sito web. Chiunque può caricare il video su YouTube. Tutto quello che devi fare è accedere al tuo account YouTube e caricare il video. Processo semplice e diretto. Ma cosa succede se qualcuno ha bisogno di caricare video tramite l’API di YouTube su un canale YouTube? È possibile? Sì, è possibile. In questo articolo, studiamo come utilizzare l’API di YouTube per caricare un video utilizzando PHP.
Registra un’applicazione e crea credenziali
Per iniziare con l’API di YouTube, è necessario un account Google. Una volta che hai un account Google, registra la tua applicazione e ottieni le chiavi API.
Di seguito sono riportati i passaggi per registrare un’applicazione e ottenere le chiavi API.
- Vai alla Console per gli sviluppatori di Google https://console.developers.google.com
- Crea un nuovo progetto. Puoi anche selezionare un progetto esistente.
- Digita un nome per il tuo progetto. Google Console creerà un ID progetto univoco.
- Dopo aver creato un progetto, apparirà nella parte superiore della barra laterale sinistra.
- Fare clic su Libreria. Vedrai l’elenco delle API di Google.
- Abilita l’API dati di YouTube.
- Fare clic su Credenziali. Seleziona ID client Oauth in Crea credenziali. Seleziona il pulsante di opzione per Applicazione Web.
- Dai il nome. In Origini JavaScript autorizzate inserisci l’URL del tuo dominio. Negli URI di reindirizzamento autorizzati fornire il collegamento dell’URL di reindirizzamento. Nel mio caso ho passato l’URL http://localhost/youtube/callback.php.
- Fare clic sul pulsante Crea. Otterrai l’ID cliente e il segreto del cliente nel pop-up. Copia questi dettagli. Ne avremo bisogno in un momento.
Imposta una configurazione di base
Il caricamento di video utilizzando l’API di YouTube richiede la creazione di un token di accesso. Un token di accesso non è altro che un identificatore di un account YouTube.
Tuttavia, il token di accesso scade dopo un po’ di tempo. Una volta scaduto il token di accesso, riceverai l’errore di "Accesso non autorizzato". La soluzione è eseguire nuovamente il processo di autorizzazione o rigenerare il token di accesso in background e completare il processo di caricamento. In questo articolo, vado per una seconda soluzione. Rigenereremo il token di accesso se è scaduto in background senza interrompere il processo di caricamento. In questo modo, non è necessario ripetere il processo di autorizzazione.
Detto questo, devi prima autorizzare l’account a generare un token di accesso. Ho intenzione di utilizzare Hybridauth libreria per l’autorizzazione e per generare token di accesso. Apri il tuo composer.json
file e aggiungi le righe sottostanti.
{
"require": {
"google/apiclient": "2.0",
"hybridauth/hybridauth": "~3.0"
}
}
Tieni presente che YouTube è il prodotto di Google e l’API di YouTube non è altro che un’API di Google. Ecco perché stiamo utilizzando la libreria "google/apiclient". Quindi, esegui il comando seguente per l’installazione di queste librerie.
composer install
Configurazione del database
Ad ogni chiamata API dobbiamo inviare un token di accesso quindi memorizzarlo nel database. Crea una tabella "token" nel tuo database utilizzando la query seguente.
CREATE TABLE `token` ( `id` int(11) NOT NULL AUTO_INCREMENT,
`access_token` text NOT NULL,
PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
Nella parte successiva di questo articolo, è necessario interagire con questa tabella "token" per recuperare e aggiornare i dettagli del token. Ciò richiede la scrittura di una connessione al database e alcune query. Crea un file class-db.php
e aggiungi il codice seguente.
class-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)");
}
}
}
Passa le credenziali del tuo database nel file sopra. Qui presumo che tu voglia utilizzare un singolo account YouTube. Se intendi utilizzare più account, modifica le query sopra in base alle tue esigenze.
Genera token di accesso
Hai installato le librerie e creato una tabella per memorizzare il token. Ora eseguiamo il processo di autorizzazione, prendiamo il token di accesso e lo memorizziamo nella tabella "token".
Crea un config.php
file e scrivi una configurazione secondo le linee guida della libreria 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 );
Sostituisci i segnaposto con i valori effettivi delle tue credenziali Google. Aggiungi lo stesso URL di richiamata passato durante la creazione dell’applicazione console. Significa che quando l’utente completa il processo di autorizzazione verrà reindirizzato al callback.php
file.
Nel callback.php
file, recupereremo i dettagli del token di accesso e li memorizzeremo nel database.
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() ;
}
Vai al tuo browser ed esegui YOUR_DOMAIN_URL/callback.php, verrai reindirizzato all’account Google, completerai il processo di autorizzazione e dovresti vedere il messaggio di successo. Controlla la tabella del database ‘token’. Dovrebbe avere i dettagli del tuo token memorizzati. E questo significa che sei a posto per caricare un video sul tuo canale YouTube.
Carica video sul canale YouTube utilizzando l’API di YouTube
Hai ottenuto il token di accesso che verrà utilizzato per caricare il video sul canale YouTube tramite l’API di Google. Ma come ho detto prima, il token di accesso scadrà dopo un po’ di tempo e lo rigenereremo in background senza richiedere nuovamente il processo di autorizzazione.
Possiamo farlo usando ‘refersh_token’. Se guardi la colonna ‘access_token’ nella tabella vedrai che contiene anche la voce ‘refresh_token’. Usando ‘refresh_token’ chiamiamo l’endpoint ‘/o/oauth2/token’ e rigeneriamo il token di accesso in background.
Successivamente, è necessario il modulo HTML attraverso il quale è possibile sfogliare il video e inviarlo al server per il caricamento. Creiamo un semplice modulo HTML come segue.
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>
Il modulo ha 3 campi: titolo, descrizione e file. Al momento dell’invio di questo modulo, il video dovrebbe essere caricato sul tuo canale YouTube insieme al titolo e alla descrizione forniti.
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.
}
}
}
?>
Il codice precedente prende un file video dal modulo HTML e lo carica tramite API sul tuo canale YouTube. Se il tuo token di accesso è scaduto, rigenera il token in background e continua il processo senza romperlo.
Carica una miniatura personalizzata sul video di YouTube
Se stai creando un’applicazione personalizzata che gestisce i video di YouTube, probabilmente stai cercando di caricare una miniatura sul video di YouTube. Il caricamento di una miniatura personalizzata richiede che gli utenti verifichino il proprio numero di telefono con il proprio account YouTube. Visita il linkhttps://www.youtube.com/features ed esegui la verifica del numero di telefono.
Una volta verificato il numero di telefono, puoi utilizzare il modulo e il codice precedenti con piccole modifiche e impostare la miniatura personalizzata per il video caricato. Innanzitutto, aggiungi il campo del modulo che consente di caricare le immagini. La dimensione consigliata per la miniatura di YouTube è 1280x720
.
<p>
<label>Image</label>
<input type="file" name="image" accept="image/*" />
</p>
Nel modulo di invio, abbiamo creato un array $arr_data
che contiene tutti i dati del modulo. Aggiungi la nuova coppia per l’immagine all’array $arr_data
come segue.
$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
);
Successivamente, dopo che il nostro codice ha caricato il video su YouTube, dobbiamo prendere l’id del video e assegnare una miniatura personalizzata al video.
<?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'];
Elimina video dal canale YouTube utilizzando l’API YouTube
Potresti anche volere un codice per eliminare i video utilizzando l’API di YouTube. Per eliminare un video, è necessario un ambito aggiuntivo https://www.googleapis.com/auth/youtube
che ho già incluso sopra in un file di configurazione. Significa che il token di accesso generato seguendo i passaggi precedenti può essere utilizzato per eliminare un video.
Di seguito è riportato il codice che eliminerà un video dal tuo canale 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.
}
}
}
Questo è tutto! Spero che tu sappia come caricare un video sul canale YouTube utilizzando l’API di YouTube. Mi piacerebbe sentire i tuoi pensieri o suggerimenti nella sezione commenti qui sotto.
articoli Correlati
- Come caricare video su YouTube nell’applicazione Laravel
- Come ottenere i tag video di YouTube utilizzando l’API di YouTube
- API di YouTube – Come ottenere l’elenco dei video di YouTube del tuo canale
- Come ottenere l’elenco dei video di YouTube per parole chiave utilizzando l’API di ricerca di YouTube