Requête php api youtube

Fermé
Warren37 Messages postés 40 Date d'inscription vendredi 10 juin 2022 Statut Membre Dernière intervention 25 septembre 2023 - 12 juin 2023 à 18:27
Warren37 Messages postés 40 Date d'inscription vendredi 10 juin 2022 Statut Membre Dernière intervention 25 septembre 2023 - 16 juin 2023 à 15:11

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 38469 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 22 avril 2025 4 741
12 juin 2023 à 20:12

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 vendredi 10 juin 2022 Statut Membre Dernière intervention 25 septembre 2023 3
Modifié le 13 juin 2023 à 08:30

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 38469 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 22 avril 2025 4 741
13 juin 2023 à 08:40

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 vendredi 10 juin 2022 Statut Membre Dernière intervention 25 septembre 2023 3
Modifié le 13 juin 2023 à 10:07

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 vendredi 10 juin 2022 Statut Membre Dernière intervention 25 septembre 2023 3
13 juin 2023 à 10:22

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 vendredi 10 juin 2022 Statut Membre Dernière intervention 25 septembre 2023 3
Modifié le 14 juin 2023 à 09:45
<?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 vendredi 10 juin 2022 Statut Membre Dernière intervention 25 septembre 2023 3
14 juin 2023 à 09:46

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 38469 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 22 avril 2025 4 741
14 juin 2023 à 09:53

Change ton var_dump en :

var_dump($activitiesData);
0
Warren37 Messages postés 40 Date d'inscription vendredi 10 juin 2022 Statut Membre Dernière intervention 25 septembre 2023 3
Modifié le 14 juin 2023 à 10:09

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 vendredi 10 juin 2022 Statut Membre Dernière intervention 25 septembre 2023 3
14 juin 2023 à 10:29

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 38469 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 22 avril 2025 4 741
14 juin 2023 à 12:54

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

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

0
Warren37 Messages postés 40 Date d'inscription vendredi 10 juin 2022 Statut Membre Dernière intervention 25 septembre 2023 3
Modifié le 14 juin 2023 à 13:20
<?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 vendredi 10 juin 2022 Statut Membre Dernière intervention 25 septembre 2023 3
Modifié le 16 juin 2023 à 15:12

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