Requête php api youtube

Warren37 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention   -  
Warren37 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention   -

Bonjour, j'essaye de récupérer la dernière vidéo d'une page youtube sur ma page web, en local déjà. Je veux que quand une nouvelle vidéo est postée sur cette page youtube, elle s'affiche sur mon site quand je le recharge.
Je n'ai actuellement plus de messages d'erreurs mais rien ne s'affiche dans ma page web. J'ai fait la procédure pour avoir une clé api de l'api youtube sur google dev. Avant j'affichais moi même une vidéo du moment mais je souhaite l'automatiser.
Avez vous des suggestions?
Merci d'avance

Ma page php:

<?php
$username = 'username';
$apiKey = 'token';
 
$activitiesUrl = "https://www.googleapis.com/youtube/v3/activities?part=snippet%2CcontentDetails&channelId=%24username&maxResults=1&key=%24apiKey";
 
$curl = curl_init($activitiesUrl);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curl);
curl_close($curl);
 
$activitiesData = json_decode($response);
 
if (isset($activitiesData->items) && count($activitiesData->items) > 0) {
  $videoId = $activitiesData->items[0]->contentDetails->upload->videoId;
  $videoTitle = $activitiesData->items[0]->snippet->title;
  $videoDescription = $activitiesData->items[0]->snippet->description;
  $videoThumbnail = $activitiesData->items[0]->snippet->thumbnails->default->url;
 
  // Générer le code HTML pour afficher la vidéo
  $html = '<div class="video-responsive>';
  $html .= '<iframe width="560" height="315" src="https://www.youtube.com/embed/' . $videoId . '" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>';
  $html .= '</div>';
 
  // Afficher le code HTML
  echo $html;
}
?>

En html:

<div class="containerbis">
              <?php include("youtube.php"); ?>
            </div>


Windows / Firefox 114.0

A voir également:

10 réponses

jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 

Bonjour

Si tu fais un var_dump de la variable $response ...

Qu'est-ce que ça t'affiche ?

Et puis, pourrais-tu ajouter avant de faire le close, une gestion d'erreur au niveau du curl

if(curl_exec($curl) === false)
{
    echo 'Erreur Curl : ' . curl_error($curl);
}

0
Warren37 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention   3
 

J'obtiens alors:

"Erreur Curl :"  (sans erreur Curl)

<?php
$username = 'username';
$apiKey = 'apikey';

$activitiesUrl = "https://www.googleapis.com/youtube/v3/activities?part=snippet%2CcontentDetails&channelId=%24username&maxResults=1&key=%24apiKey";

$curl = curl_init($activitiesUrl);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($curl);

if ($response === false) {
    echo 'Erreur Curl : ' . curl_error($curl);
} else {
    var_dump($response);

    curl_close($curl);

    $activitiesData = json_decode($response);

    if (isset($activitiesData->items) && count($activitiesData->items) > 0) {
        $videoId = $activitiesData->items[0]->contentDetails->upload->videoId;
        $videoTitle = $activitiesData->items[0]->snippet->title;
        $videoDescription = $activitiesData->items[0]->snippet->description;
        $videoThumbnail = $activitiesData->items[0]->snippet->thumbnails->default->url;

        // Générer le code HTML pour afficher la vidéo
        $html = '<div class="video-responsive>';
        $html .= '<iframe width="560" height="315" src="https://www.youtube.com/embed/' . $videoId . '" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>';
        $html .= '</div>';

        // Afficher le code HTML
        echo $html;
    }
}
?>
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 

Ton url me semble étrange

Tu sembles avoir remplacé les $ par %24

$activitiesUrl = "https://www.googleapis.com/youtube/v3/activities?part=snippet%2CcontentDetails&channelId=".$username."&maxResults=1&key=".$apiKey;

Ensuite, vu que tu testes en "local", essaye de désactiver la verif ssl et du host

curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
0
Warren37 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention   3
 

j'obtiens Erreur Curl : 3 -

cURL n'a pas pu résoudre l'adresse de l'URL spécifiée dans la requête.

(Le $ est bien présent, quand je le copie dans des balises code php ici il se transforme en %24)
 

<?php

$username = 'username';

$apiKey = 'apikey';


$activitiesUrl = "https://www.googleapis.com/youtube/v3/activities?part=snippet%2CcontentDetails&channelId=%24username&maxResults=1&key=%24apiKey";


$curl = curl_init($activitiesUrl);

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);


$response = curl_exec($curl);


if ($response === false) {

    echo 'Erreur Curl : ' . curl_errno($curl) . ' - ' . curl_error($curl);

} else {

    var_dump($response);


    curl_close($curl);


    $activitiesData = json_decode($response);


    if (isset($activitiesData->items) && count($activitiesData->items) > 0) {

        $videoId = $activitiesData->items[0]->contentDetails->upload->videoId;

        $videoTitle = $activitiesData->items[0]->snippet->title;

        $videoDescription = $activitiesData->items[0]->snippet->description;

        $videoThumbnail = $activitiesData->items[0]->snippet->thumbnails->default->url;


        // Générer le code HTML pour afficher la vidéo

        $html = '<div class="video-responsive>';

        $html .= '<iframe width="560" height="315" src="https://www.youtube.com/embed/' . $videoId . '" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>';

        $html .= '</div>';


        // Afficher le code HTML

        echo $html;

    }

}

?>
0
Warren37 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention   3
 

En mettant

$activitiesUrl = "https://www.googleapis.com/youtube/v3/activities?part=snippet%2CcontentDetails&channelId=" . urlencode($username) . "&maxResults=1&key=" . urlencode($apiKey);

J'obtiens l'erreur:

string(264) "{ "error": { "code": 403, "message": "The request is not properly authorized.", "errors": [ { "message": "The request is not properly authorized.", "domain": "youtube.activity", "reason": "forbidden" } ] } } "

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Warren37 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention   3
 
<?php
$username = 'username';
$apiKey = 'apikey';
$activitiesUrl = "https://www.googleapis.com/youtube/v3/activities?part=snippet%2CcontentDetails%2Cid&username=%24username&maxResults=1&key=%24apiKey&format=json";
$curl = curl_init($activitiesUrl);
 
/*Seulement sur localhost :
Désactiver la vérification du host et le certificat
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
*/
 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response=curl_exec($curl);
if($response === false)
{
    echo 'Erreur Curl : ' . curl_errno($curl) . ' - ' . curl_error($curl);
}
else
{
    echo 'Operation completed without any errors'."\n\r";
    $activitiesData =json_decode($response);
var_dump($activitiesData->items);
    
    $html="";
    if (isset($activitiesData->items) && count($activitiesData->items) > 0) {
	foreach($activitiesData->items as $index=>$item){
		$videoId = $item->contentDetails->upload->videoId;
		$videoTitle = $item->snippet->title;
		$videoDescription = $item->snippet->description;
		$videoThumbnail = $item->snippet->thumbnails->default->url;
 
		// Générer le code HTML pour afficher la vidéo
		$html .= '<div class="video-responsive paddingtab blue-stylized-border" data-aos="fade-in" data-aos-offset="-5">';
		$html .= '<iframe width="560" height="315" src="https://www.youtube.com/embed/' . $videoId . '" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>';
		$html .= '</div>';
	}
	// Afficher le code HTML
	echo $html;
    }
}
curl_close($curl);
?>
0
Warren37 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention   3
 

Avec ceci j'obtiens en message:

Avec vos modifications après la ligne 22, j'obtiens le message:
Operation completed without any errors
Warning: Undefined property: stdClass::$items in ... on line 24
NULL

Mais il y a bien des vidéos postées régulièrement sur la page youtube concernée

https://www.youtube.com/@ClashRoyale

0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 

Change ton var_dump en :

var_dump($activitiesData);
0
Warren37 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention   3
 

J'obtiens le message:

Operation completed without any errors object(stdClass)#4 (1) { ["error"]=> object(stdClass)#2 (3) { ["code"]=> int(400) ["message"]=> string(58) "No filter selected. Expected one of: home, channelId, mine" ["errors"]=> array(1) { [0]=> object(stdClass)#3 (5) { ["message"]=> string(58) "No filter selected. Expected one of: home, channelId, mine" ["domain"]=> string(17) "youtube.parameter" ["reason"]=> string(24) "missingRequiredParameter" ["location"]=> string(11) "parameters." ["locationType"]=> string(5) "other" } } } }

Il semble que je ne peux pas utiliser l'username comme ça.

Il me faudrait le channelId de la page youtube mais je ne vois pas comment l'obtenir.

0
Warren37 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention   3
 

Si je fais

<?php
$apiKey = 'apikey';
$searchQuery = '@ClashRoyale'; // Remplacez par le nom d'utilisateur ou le nom de la chaîne recherchée
 
$searchUrl = "https://www.googleapis.com/youtube/v3/channels?part=id&forUsername=%24searchQuery&key=%24apiKey";
$curl = curl_init($searchUrl);
 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curl);
 
if ($response === false) {
    echo 'Erreur Curl : ' . curl_errno($curl) . ' - ' . curl_error($curl);
} else {
    $searchData = json_decode($response);
 
    if (isset($searchData->items) && count($searchData->items) > 0) {
        $channelId = $searchData->items[0]->id;
        echo "Channel ID: $channelId";
    } else {
        echo "Aucune chaîne trouvée pour la requête : $searchQuery";
    }
}
 
curl_close($curl);
?>

j'obtiens le message: Aucune chaîne trouvée pour la requête : @ClashRoyale

0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 

Fais donc un écho de ta variable $searchUrl...

Puis relis ma première réponse....

0
Warren37 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention   3
 
<?php
$channelId = 'UC_F8DoJf9MZogEOU51TpTbQ';
$apiKey = 'api key';
 
 
// Requête pour obtenir les dernières vidéos de la chaîne
$videosUrl = "https://www.googleapis.com/youtube/v3/search?order=date&part=snippet&channelId=%24channelId&maxResults=1&key=%24apiKey";
 
$curl = curl_init($videosUrl);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curl);
 
if ($response === false) {
    echo 'Curl error: ' . curl_error($curl);
} else {
    $videosData = json_decode($response, true);
 
    if (isset($videosData['items'][0]['id']['videoId'])) {
        $videoId = $videosData['items'][0]['id']['videoId'];
        $videoTitle = $videosData['items'][0]['snippet']['title'];
        $videoDescription = $videosData['items'][0]['snippet']['description'];
        $videoThumbnail = $videosData['items'][0]['snippet']['thumbnails']['default']['url'];
 
        // Afficher la vidéo sur votre site web
        $html = '<div class="video-responsive">';
        $html .= '<iframe width="560" height="315" src="https://www.youtube.com/embed/' . $videoId . '" title="' . $videoTitle . '" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>';
        $html .= '</div>';
 
        echo $html;
    } else {
        echo 'No video found.';
    }
}
 
curl_close($curl);

ça avance.  J'obtiens la dernière vidéos mais dans la rubrique "shorts". Je cherche à avoir celle dans "Accueil" ou "vidéos"

"https://www.youtube.com/clashroyale"

0
Warren37 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention   3
 

J'ai réussi comme cela à récupérer la dernière vidéo dans la rubrique "vidéos" de la page youtube, mais comme il s'agit de la dernière vidéo publiée, si une vidéo est publiée dans une autre rubrique tel que "shorts" ou "playlist", ma vidéo sera remplacé. Je ne pense pas qu'on puisse restreindre la récupération à la rubrique vidéo de la page youtube.

<?php

$channelId = 'UC_F8DoJf9MZogEOU51TpTbQ'; // Identifiant de la chaîne Clash Royale

$feedUrl = 'https://www.youtube.com/feeds/videos.xml?channel_id='.$channelId;

// Récupération du contenu XML

$xml = file_get_contents($feedUrl);

// Conversion en objet SimpleXML

$feed = simplexml_load_string($xml);

if ($feed !== false && isset($feed->entry[0])) {

$latestVideo = $feed->entry[0];

$videoId = substr((string)$latestVideo->id, 9); // Extraction de l'identifiant de la vidéo

$videoUrl = 'https://www.youtube.com/embed/'.$videoId; // URL de l'intégration de la vidéo

// Affichage de la vidéo sur le site web

echo'<div class="video-responsive paddingtab blue-stylized-border" data-aos="fade-in" data-aos-offset="-5">';

echo'<iframe width="560" height="315" src="'.$videoUrl.'" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>';

echo'</div>';

} else {

echo'Aucune vidéo trouvée.';

}

?>
0