Requête php api youtube

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

10 réponses

  1. 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.';
    
    }
    
    ?>
    1. <?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"

      1. 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

        1. Modérateur

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

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

      2. 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.

        1. 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

          1. Modérateur

            Change ton var_dump en :

            var_dump($activitiesData);
        2. <?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);
          ?>
          
          1. 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" } ] } } "

            1. 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;
              
                  }
              
              }
              
              ?>
              1. 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;
                    }
                }
                ?>
                1. Modérateur

                  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);
              2. Modérateur

                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);
                }