Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

M5Stack. Youtube: число подписчиков, просмотров и лайков

У Youtube есть API, позволяющий узнать различные статистические данные - число подписчиков, просмотров, лайков.

Перед написанием скечта нужно узнать идентификатор канала. Выбираем любой канал на Youtube и копируем адресную строку в браузере. Мой скромный канал имеет адрес "https://www.youtube.com/channel/UCfdJ5xx_kKYbrV7S0I6nodA". Жирным шрифтом выделен идентификатор, который следует запомнить.

Запрос для получения нужной информации о числе подписчиков имеет следующий вид:


https://www.googleapis.com/youtube/v3/channels?id=​ID​&part=statistics&key=​KEY

Вместо ID нужно подставить идентификатор канала, о котором говорилось выше. С ключом KEY придётся немного повозиться. Ключ для доступа к API предоставляется бесплатно, получить его можно на странице ​ https://console.developers.google.com. Там следует выбрать раздел API и сервисы, выбрать Учётные данные и нажать кнопку Создать учётные данные и выбрать вариант Ключ API. На странице появится ваш ключ в виде длинной строки "AIzaXXXXXXX-X-XXXXXXXXXXXXXXXXXXXXXXXXX".

Формируем нужный адрес: https://www.googleapis.com/youtube/v3/channels?id=UCfdJ5xx_kKYbrV7S0I6nodA&part=statistics&key=AIzaXXXXXXX-X-XXXXXXXXXXXXXXXXXXXXXXXXX (я не буду указывать свой ключ по понятным причинам) и смотрим результат в браузере.


{
 "kind": "youtube#channelListResponse",
 "etag": "\"nxOHAKTVB7baOKsQgTtJIyGxcs8/lINwFZQCmT-IRftRiKjgSPDUAU0\"",
 "pageInfo": {
  "totalResults": 1,
  "resultsPerPage": 1
 },
 "items": [
  {
   "kind": "youtube#channel",
   "etag": "\"nxOHAKTVB7baOKsQgTtJIyGxcs8/ODSjLQkA8JKDkhwX1rWTU6cPHi4\"",
   "id": "UCfdJ5xx_kKYbrV7S0I6nodA",
   "statistics": {
    "viewCount": "134762",
    "commentCount": "0",
    "subscriberCount": "58",
    "hiddenSubscriberCount": false,
    "videoCount": "157"
   }
  }
 ]
}

В json-ответе нас интересует массив items, а точнее его элемент statistics, который содержит ключ subscriberCount. Для извлечения данных воспользуемся библиотекой ArduinoJson. После получения документа создадим объект типа JsonArray, и если он не пуст, обратимся к первому элементу (items[0] - это первый элемент) и его дочернему элементу по имени. После этого мы сможем получить интересующий нас параметр.

В скетче оставил вызовы в монитор порта, если вы будете проверять пример на плате ESP32 без дисплея. Не забудьте подставить свои данные от WiFi-сети и ключ для Youtube API.


#include <M5Stack.h>

#include "WiFi.h"
#include <HTTPClient.h>
#include <ArduinoJson.h>

// Указываем идентификатор и пароль от своей WiFi-сети
const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";

void handleReceivedMessage(String message) {
  StaticJsonDocument<1500> doc;    //Memory pool. Поставил наугад для демонстрации

  DeserializationError error = deserializeJson(doc, message);

  if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.c_str());
    return;
  }

  //  Serial.println();
  //  Serial.println("----- DATA FROM Youtube ----");
  //M5.Lcd.print("----- DATA FROM Youtube ----");

  // Get the array "items"
  JsonArray items = doc["items"];
  if (items.size() > 0) {
    // Get the object "statictics"
    JsonObject statistics = items[0]["statistics"];
    // Get the count of subscribers
    long subscriberCount = statistics["subscriberCount"];
    Serial.print("Number of subscribers: ");
    Serial.println(subscriberCount);
    clearScreen();
	
	// Выводим число подписчиков
    M5.Lcd.print("Subscribers: ");
    M5.Lcd.print(subscriberCount);
  }

  Serial.println("------------------------------");
}

void clearScreen() {
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.setTextColor(WHITE);
  M5.Lcd.setTextSize(3);
}

void setup() {
  M5.begin();

  Serial.begin(115200);
  Serial.print("Connecting to ");
  M5.Lcd.print("Connecting to ");

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
    M5.Lcd.print(".");
    WiFi.begin(ssid, password);
  }

  //Serial.println("");
  //Serial.println("WiFi connected!");
  M5.Lcd.print("WiFi connected!");
}

void loop() {
  String id = "UCfdJ5xx_kKYbrV7S0I6nodA"; // мой Youtube-канал
  String key = "YOUR_KEY";
  String url = "https://www.googleapis.com/youtube/v3/channels?id=" + id + "&part=statistics&key=" + key;

  Serial.println("Connecting to www.googleapis.com");
  HTTPClient http;
  http.begin(url);
  int httpCode = http.GET();

  if (httpCode > 0) {
    Serial.print("httpCode: ");
    Serial.println(httpCode);
    String payload = http.getString(); // raw string
    //Serial.println(payload);
    // Парсинг Json
    handleReceivedMessage(payload);
  } else {
    Serial.print("HTTP request error: ");
    Serial.println(httpCode);
    Serial.println( http.errorToString(httpCode));
  }

  http.end();
  // Пауза 2 мин
  delay(120000);
}
Youtube subscriberCount

Иногда желательно посматривать на монитор порта. У меня были случаи, когда сервер отказывался обрабатывать запрос с первой попытки. Я не понял, это закономерность или случайность.

Serial Monitor

Количество просмотров

По такому же принципу можно узнать количество просмотров конкретного видеоролика. Вам нужно знать его идентификатор и снова использовать свой ключ.

Адрес для просмотра: https://www.googleapis.com/youtube/v3/videos?part=statistics&id=L7P8K79XX-U&key=YOUR_KEY.

Жирным шрифтом выделен идентификатор моего видеоролика (вы можете использовать любой другой) и место для вашего ключа.

Будет получен ответ в следующем виде.


{
 "kind": "youtube#videoListResponse",
 "etag": "\"nxOHAKTVB7baOKsQgTtJIyGxcs8/-k0rcX3BF3pwWkWSdSAYe81Hiyo\"",
 "pageInfo": {
  "totalResults": 1,
  "resultsPerPage": 1
 },
 "items": [
  {
   "kind": "youtube#video",
   "etag": "\"nxOHAKTVB7baOKsQgTtJIyGxcs8/qIwKlVXCbEODY7qGP4oM8aKCexc\"",
   "id": "L7P8K79XX-U",
   "statistics": {
    "viewCount": "144",
    "likeCount": "1",
    "dislikeCount": "1",
    "favoriteCount": "0",
    "commentCount": "0"
   }
  }
 ]
}

Нам снова понадобится массив items, его элемент statictics и ключ viewCount. Фактически придётся поменять код в нескольких местах и всё заработает. Проделайте это самостоятельно.

Дополнительные материалы

Реклама