Всем привет, в данной самоделки я покажу как можно сделать дешевый, простой, но в то же время эффективный парсер данных из интернета на базе платформы Arduino с Wifi модулем. С помощью нее, легко можно узнать практически любую информацию из сети за считанные секунды. Это может быть кол-во подписчиков на youtube, кол-во входящих сообщений Вконтакте, опубликовали ли самоделку и т.д.

Вот простая схема, которую необходимо собрать.

Перед началом чтения статьи, я бы рекомендовал посмотреть видео, где показываются возможности самоделки и ее практическое применение.

Нам потребуется:
-Платформа на базе семейства ESP, в моем случаи и это WeMos D1 R2

-LCD дисплей для вывода информации, у меня популярный LCD 1602 с модулем I2C
-провода и кнопка (хотя она возможно вам и не понадобится)
А так же
-USB кабель (для загрузки прошивки)
-WiFI точка доступа
— Необязательное
— собственный сайт и домен (для обработки сложных запросов популярных сайтов)

Перед тем, как приступить к следующим этапам, убедитесь что среда, через которую вы будете загружать скетч поддерживается семейство микроконтроллеров ESP. Для настройки Arduino IDE, перейдите на habr и следуйте инструкциям по установке. Ссылка: https://habr.com/ru/post/371853/

Подробное описание изготовления:
Условно этапы можно разделить на 2 части.
1 Сборка «железной» части
2 Загрузка программы и ее настройка

Сборка первого этапа заканчивается очень быстро. Собираем ее по изображению выше и все.
Модуль дисплея
VCC — 5V
GND — GND
SCL — D15
SDA — D14

Buttun — GND to D7

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

Второй этап немного сложней, открываем Arduino IDE, выбираем соответствующую плату и указываем порт на котором она находится. В моем случаи плата: WeMos D1 R1 И порт 3

Все остальные настройки можно оставить по умолчанию.
Сам скетч:
 Показать / Скрыть текст/*
Скетч для парсинга информации с сайтов, и дальнейшей вывод на дисплей

Скетч написан каналом MEGAVOLT https://www.youtube.com/MEGAVOLT

Версия v0.1, если будут какие-либо ошибки просьба написать комментарий под видео

*/
//НАСТРОЙКИ
const char* ssid = "RT-2.4GHz_WiFi_AD08"; //имя wifi точки
const char* password = "NqkDATh3"; //пароль wifi точки
const String A = "http://jsonplaceholder.typicode.com/users/1,name,User 1:;http://jsonplaceholder.typicode.com/users/2,name,User 2:;";
String DataArr[9][3] = {};
const bool anotherLine = true; // вывод информации на разных строках
const byte interruptPin = D7; //пин кнопки
const int delay_ = 5000;
//*************
#include
#include
#include
#include
#include
#include

int countElem,cur;
unsigned long currentMillis;

DynamicJsonDocument doc(1024);
LiquidCrystal_I2C lcd(0x27,16,2);

class Parse {

public:

static void Execute (){
HTTPClient http; //Declare an object of class HTTPClient

http.begin(DataArr[cur][0]); //Specify request destination
int httpCode = http.GET(); //Send the request

if (httpCode > 0) { //Check the returning code
deserializeJson(doc, http.getString());
String echo = DataArr[cur][2];
String payload = http.getString(); //Get the request response payload
Serial.println(echo);
String DataJ = doc[DataArr[cur][1]];//Print the response payload
Parse::printPaint(DataJ, echo + ": ");
} else {Serial.print("Error "); Serial.println(httpCode) ;}

http.end(); //Close connection
}

static void printPaint(String Print = "" , String Param = ""){
lcd.clear();
lcd.setCursor(0, 0);
if (anotherLine){
lcd.print(Param);
lcd.setCursor(0, 1); lcd.print(Print);
} else lcd.print(Param + Print);

}

static void explodeStr(){
String sourse = A;
char delemiter = ';';
countElem = -1;

while (sourse.indexOf(';') != -1){
countElem++;
String tmpText = sourse.substring(0, sourse.indexOf(';'));
sourse.replace(tmpText + ";", "");
String urlGet = tmpText.substring(0 , tmpText.indexOf(',')); tmpText.replace(urlGet + ",", "");
String Data = tmpText.substring(0 , tmpText.indexOf(',')); tmpText.replace(Data + ",", "");
String echoText = tmpText.substring(0 , tmpText.indexOf(',')); tmpText.replace(echoText + ",", "");
Serial.print(urlGet);Serial.print(" ");Serial.print(Data);Serial.print(" ");Serial.print(echoText);
Serial.println("————");
DataArr[countElem][0] = urlGet;
DataArr[countElem][1] = Data;
DataArr[countElem][2] = echoText;
}

}
};

void setup () {

Serial.begin(115200);
WiFi.begin(ssid, password);
lcd.init();
// turn on LCD backlight
lcd.backlight();
pinMode(interruptPin , INPUT_PULLUP);

currentMillis = millis();
Parse::explodeStr();
Parse::printPaint("" , "Connect, ");
int i = 0;
while (WiFi.status() != WL_CONNECTED) {
Serial.print("Connecting..");
lcd.setCursor(i, 1); lcd.print(".");
i++;
delay(1000);

}
Serial.println("Connect successful") ;

}

void B (){
if (WiFi.status() == WL_CONNECTED) { //Check WiFi connection status
Parse::Execute();
}
}

void loop() {

if (!digitalRead(interruptPin)){
cur++; if (cur > countElem) cur = 0;
Parse::printPaint("wait" , "Please, ");
currentMillis = millis();
B();

delay(300);
}

if (millis() — currentMillis >= delay_)
{
currentMillis = millis();
B();

}

}
Обратите внимание что у вас должна быть еще дополнительно установлены 2 библиотеки.Это ArduinoJson.h и LiquidCrystal_I2C.h !

Затем изменяем в настройках скетча важные переменные, это SSID (имя Wifi точки) и password (пароль Wifi точки)

После чего, можно загружать прошивку.
Если дисплей был подключен верно, то на нем будет выводится следующая информация.

Если этого не происходит, проверьте следующую настройку.

Укажите правильный I2C адресc. В любом случаи, лучше первый раз после загрузки скетча открыть Serial порт, и убедится что соединение было успешно установлено.

Если этого не происходит, перепроверьте данные Wifi точки.

Если все успешно загрузилось и подключилось, то на дисплеи вы должны увидеть следующее:

Можете так же нажать на кнопку, и проверить обновляются ли данные (если вы ее подключили).
Все, на этом этапе 95% работы выполнено, осталось только указать в настройка данные, которые необходимо парсить. Все они находятся в константе «A»
const String A = "http://jsonplaceholder.typicode.com/users/1,name,User 1:;http://jsonplaceholder.typicode.com/users/2,name,User 2:;";
Итак, синтаксис записи прост. Все источники разделены между собой на группы, отделяющиеся точка с запятой (;).
Каждая группа состоит из 3 главных параметров, это
— URL, на который будет идти запрос
— Значение, которое нужно извлечь.
— Дополнительный текст, выводимый на дисплей.
Таким образом http://jsonplaceholder.typicode.com/users/1,name,User 1: ==
URL = http://jsonplaceholder.typicode.com/users/1
KEY = name
text = «User 1:»

Если сейчас перейти по ссылке http://jsonplaceholder.typicode.com/users/1То можно увидеть следующую информацию

Где собственно и видно откуда взялось значение «name».

Таким образом, можно уже извлекать информацию с простеньких сайтов. Но этот метод не годится для работы с «серьезными» сайтами, которые работаю с SSL сертификатами, которые проверяют запросы и выводят всякую капчу если им что-то не нравится, да и к тому же вывод данных слишком сложен, что бы обработать их «силами ардуино». Как я не пробовал «обходить» все это, но есть вещи которые или работают очень не стабильно или вовсе не работают. Постоянные обновления сертификатов не сильно то помогают. Поэтому как я считаю, наиболее разумным решением будет создание собственного сайта, «внутри» которого все эти запросы будут выполниться, обрабатываться и выводится самой ардуино в «упрощенном» виде. Как создать сайта есть множество статей/видео/форумов и т.д, в нынешнее время это не проблема. Предположим у Вас он есть, тогда загрузите на него следующий файл. Назовите его как вам удобно, ну скажем «pars.php».

<?php
/*

Код для парсинга информации с сайтов, и дальнейшеий вывод на дисплей

Код написан каналом MEGAVOLT https://www.youtube.com/MEGAVOLT

Версия v0.1, если будут какие либо ошибки просьба написать комментарий под видео

*/
header('Content-Type:text/plain;charset=utf-8');
function C($url){
return json_decode(file_get_contents($url));
}

if (isset($_GET['type'])){
switch($_GET['type']){

case "test":
echo json_encode(array("test" => "Good"));
break;

case "yt1":
$key_youtube = ""; // в гугле пишем "как получить ключ api youtube"
$a = C("https://www.googleapis.com/youtube/v3/channels?part=statistics&id=UC-lHJZR3Gqxm24_Vd_AJ5Yw&key=" . $key_youtube);
echo json_encode(array("count_sub" => $a->items[0]->statistics->subscriberCount));
break;

case "vk":
$key_vk = ""; // в гугле пишем "как получить ключ api vk"
$a = C("https://api.vk.com/method/groups.getMembers?group_id=155504801&sort=id_asc&access_token=" . $key_vk . "&v=5.102");
echo json_encode(array("count_sub" => $a->response->count));
break;

case "surs":
$a = C("https://www.cbr-xml-daily.ru/daily_json.js");
echo json_encode(array("curs" => $a->Valute->USD->Value));
break;
}
}

?>

В данный момент реализовано 3 позиции:
Парсинг подписчиков на youtube
Парсинг подписчиков в группе vk.com
Парсинг курса USD

Обратите внимание что там необходимо иметь собственные API ключи доступа, получить их так же не проблема.

Запрос выполняется следующим образом.
http://mysite.ru/pars.php?type=sursтогда в скетче переменная A будет иметь следующий вид
const String A = «http://mysite.ru/pars.php?type=сurs,curs,USD: ;»;

Таким методом можно парсить сложные сайты, и выдавать только ту информацию, которая нужна. Еще одним плюсом такого подхода заключается то, что можно заранее в настройках скетча вписать сайты, а для изменения информации вывода использовать изменение на серверной стороне. Таким образом платформа будет являться только «связующим» звеном между Вашим сайтом.

Спасибо за внимание! Удачи в начинаниях.

Источник: usamodelkina.ru