Освой Arduino играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
У 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);
}
Иногда желательно посматривать на монитор порта. У меня были случаи, когда сервер отказывался обрабатывать запрос с первой попытки. Я не понял, это закономерность или случайность.
По такому же принципу можно узнать количество просмотров конкретного видеоролика. Вам нужно знать его идентификатор и снова использовать свой ключ.
Адрес для просмотра: 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. Фактически придётся поменять код в нескольких местах и всё заработает. Проделайте это самостоятельно.