Hur man använder YouTube API för att ladda upp video på YouTube-kanal
Alla vet om YouTube. YouTube är den främsta plattformen för videodelning i världen. Vi kan använda YouTube för att vara värd för våra videor. Detta sparar oss mycket serverutrymme och man kan enkelt bädda in YouTube-videon på webbplatsen. Vem som helst kan ladda upp videon på YouTube. Allt du behöver göra är att bara logga in på ditt YouTube-konto och ladda upp videon. Enkel och okomplicerad process. Men tänk om någon behöver ladda upp videor via YouTube API på en YouTube-kanal? Är det möjligt? Ja det är möjligt. I den här artikeln studerar vi hur du använder YouTube API för att ladda upp en video med PHP.
Registrera en ansökan och skapa referenser
För att komma igång med YouTube API behöver du ett Google-konto. När du har ett Google-konto registrerar du din ansökan och hämtar API-nycklarna.
Nedan följer stegen för att registrera en applikation och hämta dina API-nycklar.
- Gå till Googles utvecklarkonsol https://console.developers.google.com
- Skapa ett nytt projekt. Du kan också välja befintligt projekt.
- Skriv ett namn på ditt projekt. Google Console skapar unikt projekt-ID.
- När du har skapat ett projekt visas det överst i vänster sidofält.
- Klicka på Bibliotek. Du kommer att se en lista över Google API: er.
- Aktivera YouTube Data API.
- Klicka på referenser. Välj Oauth-klient-id under Skapa referenser. Välj alternativknappen för webbapplikation.
- Ge namnet. Under Auktoriserat JavaScript-ursprung anger du din domän-URL. I de auktoriserade omdirigerings-URI: erna anger du länken till omdirigerings-URL: n. I mitt fall skickade jag webbadressen http: //localhost/youtube/callback.php.
- Klicka på knappen Skapa. Du får klient-ID och klienthemlighet i popup-fönstret. Kopiera dessa detaljer. Vi behöver det om ett ögonblick.
Ställ in en grundläggande konfiguration
Att ladda upp video med YouTube API kräver att du skapar en åtkomsttoken. En åtkomsttoken är inget annat än en identifierare för ett YouTube-konto.
Men åtkomsttoken upphör efter en tid. När åtkomsttoken upphör får du felmeddelandet ‘Obehörig åtkomst’. Lösningen för detta är att köra auktoriseringsprocessen igen eller regenerera åtkomsttoken i bakgrunden och slutföra uppladdningsprocessen. I den här artikeln går jag efter en andra lösning. Vi återskapar åtkomsttoken om den har upphört att gälla i bakgrunden utan att överföra uppladdningsprocessen. Om du gör det behöver du inte göra auktoriseringsprocessen om och om igen.
Med detta sagt måste du först auktorisera kontot att generera en åtkomsttoken. Jag ska använda Hybridauth- biblioteket för auktorisering och generera åtkomsttoken. Öppna din composer.json
fil och lägg till nedanstående rader i den.
{
"require": {
"google/apiclient": "2.0",
"hybridauth/hybridauth": "~3.0"
}
}
Observera YouTube är Googles produkt och YouTube API är inget annat än ett Google API. Därför använder vi biblioteket “google / apiclient". Kör sedan kommandot nedan för installation av dessa bibliotek.
composer install
Databaskonfiguration
På varje API-samtal måste vi skicka en åtkomsttoken så lagra den i databasen. Skapa en tabell ‘token’ i din databas med hjälp av frågan nedan.
CREATE TABLE `token` ( `id` int(11) NOT NULL AUTO_INCREMENT,
`access_token` text NOT NULL,
PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
Senare del av den här artikeln måste vi interagera med denna "token" -tabell för att hämta och uppdatera tokeninformation. Det kräver att du skriver en databasanslutning och några frågor. Skapa en fil class-db.php
och lägg till följande kod i den.
klass-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)");
}
}
}
Skicka dina databasuppgifter i ovanstående fil. Här antar jag att du vill använda ett enda YouTube-konto. Om du tänker använda flera konton kan du ändra frågorna ovan enligt dina krav.
Skapa åtkomsttoken
Du har installerat biblioteken och skapat en tabell för att lagra token. Låt oss nu göra auktoriseringsprocessen, ta tag i åtkomsttoken och lagra den i tabellen ‘token’.
Skapa en config.php
fil och skriv en konfiguration enligt riktlinjerna för HybridAuth-biblioteket.
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 );
Ersätt platshållarna med de faktiska värdena för dina Google-referenser. Lägg till samma URL för återuppringning som du skickade när du skapade konsolprogrammet. Det betyder att när användaren slutför auktoriseringsprocessen kommer de att omdirigera till callback.php
filen.
I callback.php
filen hämtar vi åtkomsttoken detaljer och lagrar den i databasen.
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() ;
}
Gå över till din webbläsare och kör YOUR_DOMAIN_URL / callback.php, du omdirigerar till Google-kontot, slutför auktoriseringsprocessen och du bör se framgångsmeddelandet. Kontrollera databastabellen ‘token’. Det bör ha dina tokenuppgifter lagrade. Och det betyder att du är bra att fortsätta ladda upp en video på din YouTube-kanal.
Ladda upp video på YouTube Channel med YouTube API
Du har åtkomsttoken som kommer att användas för att ladda upp videon på YouTube-kanalen via Google API. Men som jag nämnde tidigare skulle åtkomsttoken upphöra efter en tid och vi kommer att återskapa den i bakgrunden utan att be om auktoriseringsprocess igen.
Vi kan göra det med ‘referh_token’. Om du tittar på kolumnen "access_token" i tabellen ser du att den också innehåller posten "refresh_token". Med hjälp av ‘refresh_token’ kallar vi slutpunkten ‘/ o / oauth2 / token’ och återskapar åtkomsttoken i bakgrunden.
Därefter behöver du HTML-formuläret genom vilket du kan bläddra i videon och skicka den till servern för uppladdning. Låt oss skapa ett enkelt HTML-formulär enligt följande.
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>
Formuläret har tre fält – titel, beskrivning och fil. När du skickar detta formulär ska videon laddas upp på din YouTube-kanal tillsammans med den angivna titeln och beskrivningen.
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.
}
}
}
?>
Ovanstående kod tar en videofil från HTML-formuläret och laddar upp den via API på din YouTube-kanal. Om din åtkomsttoken har löpt ut regenererar den token i bakgrunden och fortsätter processen utan att bryta den.
Ladda upp en anpassad miniatyrbild på YouTube-video
Om du bygger en anpassad applikation som hanterar YouTube-videor vill du förmodligen ladda upp miniatyrbild på YouTube-video. Att ladda upp en anpassad miniatyr kräver att användare ska verifiera sitt telefonnummer med sitt YouTube-konto. Besök länkenhttps://www.youtube.com/features och gör telefonnummerverifiering.
När du har verifierat telefonnumret kan du använda vårt tidigare formulär och kod med små ändringar och ställa in den anpassade miniatyrbilden för den uppladdade videon. Lägg först till formulärfältet som gör det möjligt att ladda upp bilder. Den rekommenderade YouTube-miniatyrstorleken är 1280x720
.
<p>
<label>Image</label>
<input type="file" name="image" accept="image/*" />
</p>
På formuläret skicka har vi byggt en matris $arr_data
som innehåller all formdata. Lägg till det nya paret för bild i arrayen $arr_data
enligt följande.
$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
);
Därefter, efter att vår kod laddat upp videon på YouTube, måste vi ta video-id och tilldela en anpassad miniatyr till videon.
<?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'];
Ta bort video från YouTube Channel med YouTube API
Du kanske också vill ha en kod för att radera videor med YouTube API. För att ta bort en video behöver du ett extra omfång https://www.googleapis.com/auth/youtube
som jag redan har inkluderat ovan i en konfigurationsfil. Det betyder att åtkomsttoken som genereras genom att följa stegen ovan kan användas för att radera en video.
Nedan är koden som tar bort en video från din YouTube-kanal.
<?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.
}
}
}
Det är allt! Jag hoppas att du fick veta hur du laddar upp en video på YouTube-kanalen med YouTube API. Jag skulle vilja höra dina tankar eller förslag i kommentarsektionen nedan.
relaterade artiklar
- Hur laddar jag upp video på YouTube i Laravel-applikationen
- Hur du får YouTube-videotaggar med hjälp av YouTube API
- YouTube API – Hur får jag en lista över YouTube-videor från din kanal
- Hur får jag YouTube-videolista efter nyckelord med hjälp av YouTube Search API