3.6 Выводим количество друзей в “Контакте”
Продолжим углубляться в тонкости Web. На этот раз мы выведем количество друзей “ВКонтакте” для заданного пользователя. Подобная задача довольно часто встречается в профессиональном программировании, когда нужно получить и отобразить данные с какого-то сайта. Поэтому рассмотрим подробнее, как это делается.
Шаг-1. Находим, как получить список друзей
Каждый крупный сайт имеет так называемый “интерфейс разработчика”, или API - Application Program Interface, набор функций, доступный программистам для доступа к данным. Набираем в гугле “vk.com get friends API” (международным языком в программировании является английский), и первая же ссылка возвращает нам нужную страницу с описанием параметров: https://vk.com/dev/friends.get.
Еще немного ищем в интернете примеры использования, и в итоге получаем, что нам нужно выполнить такой запрос: https://api.vk.com/method/friends.get?user_id=ID, где ID - это идентификатор пользователя, который можно посмотреть в подсказке к ссылке на каждой странице. Берем первый попавшийся идентификатор, например 29744451, и открываем ссылку https://api.vk.com/method/friends.get?user_id=29744451 в браузере.
Работает! Мы получили страницу, которая выглядит примерно так:
Данный ответ сервера представляет собой список идентификаторов друзей пользователей в формате Json. Это текстовый формат, для чтения которого есть специальные библиотеки. Но сначала нужно загрузить сами данные.
Шаг-2. Получение данных с сервера.
Для получения данных в Arduino есть специальный класс HTTPClient.
Код для загрузки данных выглядит так:
const char *url = "https://api.vk.com/method/friends.get?user_id=29744451";
HTTPClient http;
http.begin(url);
int http_code = http.GET();
if (http_code > 0) {
String json = http.getString();
...
}
Можно вывести данные в serial port и убедиться, что возвращается правильный список друзей. Он должен выглядеть также, как и в браузере по ссылке выше.
Шаг-3. Обработка данных
Нам не нужен весь список целиком, достаточно лишь узнать количество друзей. Для этого используем библиотеку обработки (парсинга) Json, скачать которую можно по ссылке https://github.com/bblanchon/ArduinoJson. Как обычно, файлы необходимо скачать и распаковать в папку Документы\Arduino\libraries.
Чтение данных из массива и получение его количества с помощью этой библиотеки выглядит так.
DynamicJsonBuffer jsonBuffer(16*1024);
JsonObject& parsed = jsonBuffer.parseObject(json);
if (parsed.success()) {
JsonArray& response = parsed["response"];
int count = response.size();
Serial.print("Number of friends: ");
Serial.println(count);
} else {
Serial.println("Parsing error");
}
Как можно видеть, мы получаем объект типа JsonArray, у которого узнаем размер вызовом метода size(). Также мы создаем объект DynamicJsonBuffer для хранения распакованных данных, при этом выделяется 16Кб памяти для временного буфера в памяти.
Результат готов! Мы получили данные в виде переменной count, теперь мы можем вывести данные в serial port.
Код программы полностью выглядит так.
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
const char* ssid = "TP-LINK_AB11";
const char* password = "12345678";
void setup() {
Serial.begin(115200);
Serial.print("Connecting to ");
Serial.println(ssid);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
WiFi.begin(ssid, password);
}
Serial.println("");
Serial.println("WiFi connected!");
}
void loop() {
const char *url = "https://api.vk.com/method/friends.get?user_id=134212064";
Serial.println("Connecting to api.vk.com");
HTTPClient http;
http.begin(url);
int httpCode = http.GET();
if (httpCode > 0) {
String json = http.getString();
// Обработка Json
DynamicJsonBuffer jsonBuffer(16*1024);
JsonObject& parsed = jsonBuffer.parseObject(json);
if (parsed.success()) {
JsonArray& response = parsed["response"];
int count = response.size();
Serial.print("Number of friends: ");
Serial.println(count);
} else {
Serial.println("Json parsing error");
}
} else {
Serial.println("HTTP request error");
}
http.end();
// Пауза 2 мин
delay(120000);
}
Важно: при создании любых запросов к серверу рекомендуется делать их как можно реже, чтобы не перегружать сервер. Именно поэтому в конце функции стоит пауза на 2 минуты. Слишком частые запросы могут стать даже причиной блокировки (бана) по IP-адресу, особенно это касается плат типа ESP32, которые могут работать круглые сутки. Поэтому стоит делать запросы так редко как возможно, исходя из логики работы программы. Например, если мы делаем устройство, показывающее количество друзей в “Контакте”, то нет смысла запрашивать число друзей каждую минуту, скорее всего и интервала проверки раз в 10 минут или даже 1 час будет вполне достаточно.