Tutoriel Youtube Analytics API avec C# / Forms

Il existe peu de documentations pour l’utilisation de l’API Youtube Analytics pour le C#. Si vous cherchez à obtenir les statistiques de votre chaîne Youtube en utilisant les Forms, voici un exemple très simple en partant de la query… à l’affichage des résultats !

Récupérer statistiques chaine youtube avec l'API Youtube Analytics

Comment récupérer les statistiques de sa chaîne avec l’API Youtube Analytics ?

Youtube API

Récupération de statistiques basiques
Chercher des vidéos
Uploader des vidéos

Youtube Analytics API

Récupération de statistiques précises
Filtrage par date de début et fin

On commence par les prérequis

Pour utiliser l’API il vous faudra installer le package Nuget Google.Apis.YouTubeAnalytics.v2, ainsi que le package plus général de l’API Youtube vous pouvez lancer directement le téléchargement de packages dans le terminal PM :

Install-Package Google.Apis.YouTubeAnalytics.v2 -Version 1.49.0.2113
Install-Package Google.Apis.YouTube.v3 -Version 1.49.0.2112

Les dépendances qui seront également installées automatiquement :

Google.Apis.1.49.0
Google.Apis.Auth.1.49.0
Google.Apis.Core.1.49.0
Google.Apis.YouTubeAnalytics.v2.1.49.0.2113
Newtonsoft.Json.12.0.3

Création du projet sur la console de développement Google

Rendez-vous sur la console de développement Google, on va y créer un projet et ensuite lui attribuer les apis que nous utiliserons :

Une fois votre projet créée cliquez sur Tableau de bord et Activer les API et les Services et sélectionnez :

YouTube Data API v3
YouTube Analytics API

L’utilisation de l’API

Les requêtes API avancées pour récupérer les statistiques propre a votre chaîne Youtube nécessitent une authentification Oauth 2.
On commence par créer une fonction asynchrone qui ne retourne rien :

public async void Run()
{
   UserCredential credential;
   using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read))
   {
      credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
      GoogleClientSecrets.Load(stream).Secrets,
      new[] { YouTubeService.Scope.YoutubeReadonly },
      "user",
      CancellationToken.None
      );
   }
}
N’oubliez pas de placer le client_secrets.json dans le répertoire \bin\Debug\netcoreapp3.1 de votre solution.

Ensuite, dans la même fonction on déclare une variable avec une instance initialiser de youtubeservice avec notre oath e parametre et le « header » http de l’application qui sera envoyé

var youTubeAnalyticsService = new YouTubeAnalytics.v2.YouTubeAnalyticsService(new BaseClientService.Initializer()
   {
   HttpClientInitializer = credential,
   ApplicationName = Assembly.GetExecutingAssembly().GetName().Name
});

On prépare notre requête avec les paramètres qu’on veut récupérer de notre chaîne
voir la liste de toutes les métriques disponibles

var request = youTubeAnalyticsService.Reports.Query();
request.StartDate = ("2019-01-01");
request.EndDate = ("2020-09-30");
request.Ids = ("channel==UCmLQ3sdAd6CypJIne5ZANaA");
request.Metrics = ("views,comments,likes,dislikes,estimatedMinutesWatched,averageViewDuration");

On exécute notre query dans une instance de la classe Queryresponse qui nous retournera nos infos :

QueryResponse requestquery = request.Execute();

On créé une liste d’int pour y stocker les données retournées :

List<int> myChannelDataList = new List<int>();

On parcourt nos 6 objets du résultat de la query avec un foreach, on converti / cast ensuite les objets en int pour pouvoir les afficher :
Le listsize sera un .Count pour incrémenter les boucles pour afficher nos retours

int listsize = 0;
foreach (object obj in requestquery.Rows[0])
  { 
  int value = Convert.ToInt32(obj);
  myChannelDataList.Add(value);
  //Exemples
  Debug.WriteLine("Value : " + value);
  Debug.WriteLine("LISTE / " + myChannelDataList[0]);
  Debug.WriteLine("Count : " + myChannelDataList.Count);
  //Exemples
  listsize = myChannelDataList.Count;
}

à la compilation ça nous donnera :

AraClouds-Recuperer-statistiques-chaine-youtube

Affichage des résultats dans la form

On créé une liste de strings ( les Metrics ), notre listsize étant listsize = myChannelDataList.Count ( le nombre d’objets ) donc 6 labels seront créés

List<string> metrics = new List<string> { "Vues", "Commentaires", "Likes", "Dislike", "Minutes", "MoyenneTemps" };
for (int i = 0; i < listsize; i++)
{
  Label labels = new Label();
  labels.Top = (i + 4) * 20;
  labels.Left = 100;
  labels.AutoSize = true;
  labels.TextAlign = ContentAlignment.MiddleLeft;
  labels.Text = metrics[i] + " :" + myChannelDataList[i].ToString();
  this.Controls.Add(labels);
}

Si vous supprimez, changer d’ordre les métriques de la query pensez à rectifier le List metrics

Youtube Analytics API C# Forms

Mais il manque un truc là non ?

Obtenir le nombre d’abonnés avec l’API Youtube

Cette donnée ce récupère sur l’API générale de Youtube, son fonctionnement est quasi identique :

var youtubeService = new YouTubeService(new BaseClientService.Initializer()
{
   HttpClientInitializer = credential,
   ApplicationName = Assembly.GetExecutingAssembly().GetName().Name
});
var requestSub = youtubeService.Channels.List("statistics");
requestSub.Mine = (true);

ChannelListResponse responsesub = requestSub.Execute();

foreach (var sresults in responsesub.Items)
{
  var substats = sresults.Statistics;
  var subcount = substats.SubscriberCount;

  Debug.WriteLine("SubCount : " + subcount);

  Label labels = new Label();
  labels.Top = 16;
  labels.Left = 280;
  labels.AutoSize = true;
  labels.TextAlign = ContentAlignment.MiddleLeft;
  labels.Text = "Subs :" + subcont;
  this.Controls.Add(labels);
}

Une fois notre fonction exécutée on obtiendra :

Youtube Sub counter API c#

Code complet de la fonction (hors contrôles) :

public async void FetchYoutubeAnalyticsAPI()
{
  UserCredential credential;
  using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read))
  {
    credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
    GoogleClientSecrets.Load(stream).Secrets,
    new[] { YouTubeService.Scope.YoutubeReadonly },
    "user",
    CancellationToken.None
    );
}

var youTubeAnalyticsService = new YouTubeAnalyticsService(new BaseClientService.Initializer()
{
  HttpClientInitializer = credential,
  ApplicationName = Assembly.GetExecutingAssembly().GetName().Name
  });

  var request = youTubeAnalyticsService.Reports.Query();
  request.StartDate = ("2019-01-01");
  request.EndDate = ("2020-09-30");
  request.Ids = ("channel==UCmLQ3sdAd6CypJIne5ZANaA");
  request.Metrics = ("views,comments,likes,dislikes,estimatedMinutesWatched,averageViewDuration");

  QueryResponse requestquery = request.Execute();

  List<int> myChannelDataList = new List<int>();

  int listsize = 0;
  foreach (object obj in requestquery.Rows[0])
  {
    int value = Convert.ToInt32(obj);
    myChannelDataList.Add(value);
    /* Debug.WriteLine("Value : " + value);
    Debug.WriteLine("LISTE / " + myChannelDataList[0]);
    Debug.WriteLine("Count : " + myChannelDataList.Count);*/
    listsize = myChannelDataList.Count;
  }
List<string> metrics = new List<string> { "Vues", "Commentaires", "Likes", "Dislike", "Minutes", "MoyenneTemps" };
for (int i = 0; i < listsize; i++)
{
  Label labels = new Label();
  labels.Top = (i + 4) * 20;
  labels.Left = 100;
  labels.AutoSize = true;
  labels.TextAlign = ContentAlignment.MiddleLeft;
  labels.Text = metrics[i] + " :" + myChannelDataList[i].ToString();
  this.Controls.Add(labels);
}
// https://developers.google.com/youtube/v3/docs/channels/list
var youtubeService = new YouTubeService(new BaseClientService.Initializer()
{
  HttpClientInitializer = credential,
  ApplicationName = Assembly.GetExecutingAssembly().GetName().Name
  });
  var requestSub = youtubeService.Channels.List("statistics");
  requestSub.Mine = (true);

  ChannelListResponse responsesub = requestSub.Execute();

  foreach (var sresults in responsesub.Items)
  {
    var substats = sresults.Statistics;
    var subcount = substats.SubscriberCount;

    Debug.WriteLine("SubCount : " + subcount);

    Label labels = new Label();
    labels.Top = 16;
    labels.Left = 280;
    labels.AutoSize = true;
    labels.TextAlign = ContentAlignment.MiddleLeft;
    labels.Text = "Subs :" + subcount;
    this.Controls.Add(labels);
  }
}

avec sresult.Statistics vous pourrez aussi récupérer ceci :

//nb total de vues de la chaine
var viewCount = substats.ViewCount;
//nb total de vidéos
var videoCount = substats.VideoCount;
//nb total de commentaires
var commentsCount = substats.CommentCount;

Retrouvez le projet complet de l’utilisation de l’API Youtube Analytics en C# sur github