6
votes

Comment savoir si une chaîne YouTube est actuellement diffusée en direct sans utiliser la recherche?

Je travaille sur un site Web pour charger plusieurs diffusions en direct de chaînes YouTube. Au début, j'essayais de trouver un moyen de le faire sans utiliser l'API de YouTube, mais j'ai décidé de céder.

Pour savoir si une chaîne diffuse en direct et obtenir les liens de diffusion en direct que j'utilise: p>

https://www.googleapis.com/youtube/v3/search?part=snippet&channelId={CHANNEL_ID}&eventType=live&maxResults=10&type=video&key={API_KEY}

Cependant, avec un quota minimum de 10000 et chaque recherche valant 100, je ne peux faire qu'environ 100 recherches avant de dépasser ma limite de quota, ce qui n'aide pas du tout. J'ai fini par dépasser la limite de quota en 10 minutes environ. :(

Quelqu'un connaît-il un meilleur moyen de déterminer si une chaîne diffuse actuellement en direct et quels sont les liens de diffusion en direct, en utilisant le moins de points de quota possible?

I Je souhaite recharger les données YouTube de chaque utilisateur toutes les 3 minutes, les enregistrer dans une base de données et afficher les informations à l'aide de ma propre API pour économiser les ressources du serveur ainsi que les points de quota.

J'espère que quelqu'un a une bonne solution pour ce problème!

Si rien ne peut être fait à propos des liens, il serait très utile de déterminer si l'utilisateur est en direct sans utiliser 100 points de quota à chaque fois.


2 commentaires

"Je souhaite recharger les données YouTube pour chaque utilisateur toutes les 3 minutes, les enregistrer dans une base de données et afficher les informations à l'aide de ma propre API pour économiser les ressources du serveur ainsi que les points de quota." Oui, ce n'est que la mise en cache de base, et exactement ce que je vous recommande de faire. Vous pouvez même demander à votre script de faire la recherche à chaque fois, de placer un proxy (tel que Nginx) et de le mettre en cache tout seul ... en déchargeant ce problème sur une autre couche.


Quelle langue utilisez-vous pour récupérer ces données toutes les 3 minutes et les mettre en base de données?


3 Réponses :


4
votes

Étant donné que la question spécifiait uniquement que les quotas de l'API de recherche ne devaient pas être utilisés pour savoir si le canal diffusait en continu, j'ai pensé partager une sorte de méthode de contournement. Cela peut nécessiter un peu plus de travail qu'un simple appel d'API, mais cela réduit l'utilisation du quota d'API à pratiquement rien:

J'ai utilisé une simple requête Perl GET pour récupérer la page principale d'une chaîne Youtube. Plusieurs éléments uniques se trouvent dans le code HTML d'une page de chaîne diffusée en direct:

Le nombre de balises de spectateurs en direct, par exemple

  • 753 visionnage
  • . Le LIVE NOW tag badge: En direct maintenant .

    Pour vérifier si une chaîne diffuse actuellement en direct, il faut une simple correspondance pour voir si la balise HTML unique est contenue dans les résultats de la requête GET. Quelque chose comme: if ($ get_results = ~ / $ unique_html /) (Perl). Ensuite, un appel d'API ne peut être effectué que vers un identifiant de chaîne qui diffuse réellement, afin d'obtenir l'identifiant vidéo du flux.

    L'avantage de ceci est que vous savez déjà que la chaîne est en streaming, au lieu d'utiliser des milliers de points de quota pour le découvrir. Mon script de test identifie avec succès si une chaîne est en streaming, en recherchant dans le code HTML: (notez les espaces supplémentaires étranges dans le code de Youtube).

    Je ne sais pas quelle langue OP utilise, ou je voudrais aider avec une requête GET de base dans cette langue. J'ai utilisé Perl et inclus les en-têtes de navigateur, l'agent utilisateur et les cookies, pour ressembler à une visite normale de l'ordinateur.

    Les robots.txt de YouTube ne semblent pas interdire l'exploration de la page principale d'une chaîne, uniquement la page de communauté d'une chaîne.

    Faites-moi savoir ce que vous pensez des avantages et des inconvénients de cette méthode, et commentez ce qui pourrait être amélioré plutôt que de ne pas aimer si vous trouvez une faille. Merci, bon codage!

    MISE À JOUR 2020 Le yt-badge-live semble avoir été obsolète, il ne montre plus de manière fiable si la chaîne est en streaming. Au lieu de cela, je vérifie maintenant le HTML pour cette chaîne:

    {"text": "regarder"}

    Si j'obtiens une correspondance, cela signifie que la page est en streaming. (Les canaux non diffusés ne contiennent pas cette chaîne.) Encore une fois, notez l'étrange espace blanc supplémentaire. J'échappe également à tous les guillemets puisque j'utilise Perl.


    2 commentaires

    J'ai écrit un script comme celui-ci similaire en php en utilisant DOMDocument mais j'ai rencontré un problème avec lui en utilisant une quantité insensée de ressources et prenant beaucoup de temps à compléter, la fonction file_get_contents semblait également charger le css associé à cette page, ce qui est totalement inutile. Si je pouvais l'empêcher de faire cela, ce serait une solution potentielle. Quel est votre raisonnement derrière l'utilisation de PERL sur PHP pour faire cette demande?


    Il utilisait trop de bande passante? Hmm, je suppose que je n'ai pas le volume de demandes à découvrir. J'utilise un droplet DigitalOcean de 5 $ pour le mien qui a environ 1 To sortant et entrant gratuit. J'avais déjà un tas de scripts Perl donc j'en ai juste modifié un pour ça. Voici un exemple de requête PHP complète avec des en-têtes de navigateur: beamtic.com/setting-request-headers -curl



    5
    votes

    Voici mes deux suggestions:

    • Vérifiez ma réponse où j'explique comment vous pouvez vérifier comment récupérer des vidéos de chaînes qui diffusent en direct.
    • Une autre option pourrait être d'utiliser l'URL suivante et de d'une manière faire une ou plusieurs demandes à chaque fois pour vérifier s'il y a un streaming en direct.

    https://www.youtube.com/channel//live

    CHANNEL_ID est l'ID de chaîne que vous souhaitez vérifier si cette chaîne diffuse en direct 1 .


    1 Notez simplement que peut-être que l'URL ne fonctionnera pas dans tous les canaux (et cela dépend du canal lui-même) .

    Par exemple, si vous vérifiez le channel_id UC7_YxT-KID8kRbqZo7MyscQ - lien vers la diffusion en direct de cette chaîne - https : //www.youtube.com/channel/UC4nprx9Vd84-ly7N-1Ce6Og/live , cette chaîne indiquera s'il diffuse en direct, mais, avec son identifiant de chaîne UC4nprx9Vd84-ly7N-1Ce6Og - lien vers cette chaîne en direct -, il affichera sa page principale à la place .


    3 commentaires

    L'utilisation du nom de la chaîne fonctionne également comme https://www.youtube.com/c/ / live et https://www.youtube.com/user/ / live en supprimant tout espace s'il y en a dans le nom de la chaîne


    @Amineze merci. J'ai testé avec "Microsoft" comme ceci: https://www.youtube.com/c/Microsoft/live et https://www.youtube.com/user/Microsoft/live , mais peut-être que cela ne fonctionne pas avec toutes les chaînes YouTube comme "NASAtelevision": fonctionne avec https://www.youtube.com/user/NASAtelevision/live , mais pas avec < code> https://www.youtube.com/c/NASAtelevision/live .


    Le 'utilisateur' et le 'c' peuvent être différents avec d'autres chaînes, alors que NASAtelevision est le nom d'utilisateur, NASA est le nom de la chaîne (toutes les chaînes n'utilisent pas les deux le même nom) donc https://www.youtube. com / c / NASA / live , fonctionne à la fois en majuscules et en minuscules. Bien que l'utilisation de «c» avec le nom du canal ne fonctionne pas avec certains canaux, l'identifiant et le nom d'utilisateur fonctionnent. Le problème avec ces méthodes est que vous ne pouvez pas choisir vers lequel il redirige pour un canal exécutant plusieurs flux en direct, mais il est idéal pour vérifier qu'un canal diffuse en direct et utiliser l'API pour récupérer les identifiants vidéo des flux en direct. .



    1
    votes

    En ajoutant à la réponse de Bman70 , j'ai essayé d'éliminer la nécessité de faire une demande de recherche coûteuse après avoir su que la chaîne diffuse en direct. J'ai fait cela en utilisant deux indicateurs dans la réponse HTML de la page des chaînes qui diffusent en direct.

    function findLiveStreamVideoId(channelId, cb){
      $.ajax({
        url: 'https://www.youtube.com/channel/'+channelId,
        type: "GET",
        headers: {
          'Access-Control-Allow-Origin': '*',
          'Accept-Language': 'en-US, en;q=0.5'
      }}).done(function(resp) {
          
          //one method to find live video
          let n = resp.search(/\{"videoId[\sA-Za-z0-9:"\{\}\]\[,\-_]+BADGE_STYLE_TYPE_LIVE_NOW/i);
    
          //If found
          if(n>=0){
            let videoId = resp.slice(n+1, resp.indexOf("}",n)-1).split("\":\"")[1]
            return cb(videoId);
          }
    
          //If not found, then try another method to find live video
          n = resp.search(/https:\/\/i.ytimg.com\/vi\/[A-Za-z0-9\-_]+\/hqdefault_live.jpg/i);
          if (n >= 0){
            let videoId = resp.slice(n,resp.indexOf(".jpg",n)-1).split("/")[4]
            return cb(videoId);
          }
    
          //No streams found
          return cb(null, "No live streams found");
      }).fail(function() {
        return cb(null, "CORS Request blocked");
      });
    }
    

    Cependant, il y a un compromis. Cette méthode confond les flux récemment terminés avec les flux en direct actuellement. Une solution de contournement à ce problème consiste à obtenir le statut du videoId renvoyé par l'API Youtube. Cette demande ne coûte qu'une unité.


    0 commentaires