Помогите разобраться с кодом - Часы на ESP 8266 и матрице max 7219
- Войдите на сайт для отправки комментариев
Сб, 29/02/2020 - 21:32
Доброго времени суток! Прошу помочь разобраться с кодом.
Нашел в инете проект часов на esp 8266 и матрицах с max 7219, повторил его, все получилось, все работает, кроме получения курса валют( в оригинале пара PLN/USD). С момента выхода проекта прошло уже прилично времени и скорей всего изменилась структура сайта с которого берется курс валют и в коде нужно указать другие ориентиры на сайте где расположена искомая информация. В общем если подскажите как правильно настроить поиск нужных символов, где и что указать что бы код заработал буду очень Вам признателен! Вот этот код, который находит на сайте курс нужной валюты и выводит на дисплей часов:
// ======================================================================= const char* currencyHost = "cinkciarz.pl"; void getCurrencyRates() { WiFiClientSecure client; Serial.print("connecting to "); Serial.println(currencyHost); if (!client.connect(currencyHost, 443)) { Serial.println("connection failed"); return; } client.print(String("GET / HTTP/1.1\r\n") + "Host: " + currencyHost + "\r\nConnection: close\r\n\r\n"); //Serial.print("request sent"); int repeatCounter = 0; while (!client.available() && repeatCounter < 10) { delay(500); Serial.println("c."); repeatCounter++; } Serial.println("connected"); while (client.connected() && client.available()) { String line = client.readStringUntil('\n'); // Serial.println(line); int currIdx = line.indexOf("/kantor/kursy-walut-cinkciarz-pl/usd"); if (currIdx > 0) { String curr = line.substring(currIdx + 33, currIdx + 33 + 3); curr.toUpperCase(); line = client.readStringUntil('\n'); int rateIdx = line.indexOf("\">"); if (rateIdx <= 0) { Serial.println("Found rate but wrong structure!"); return; } currencyRates = " PLN/" + curr + ": "; if (line[rateIdx - 1] == 'n') currencyRates += char('~'+24); else currencyRates += char('~'+23); // down/up currencyRates += line.substring(rateIdx + 2, rateIdx + 8) + " "; line = client.readStringUntil('\n'); rateIdx = line.indexOf("\">"); if (rateIdx <= 0) { Serial.println("Found rate but wrong structure!"); return; } if (line[rateIdx - 1] == 'n') currencyRates += char('~'+24); else currencyRates += char('~'+23); // down/up currencyRates += line.substring(rateIdx + 2, rateIdx + 8); currencyRates.replace(',', '.'); break; } } client.stop(); } // =======================================================================
Я бы Вам посоветовал брать курс валюты не с левого польского сайта, а переделать на Центробанк (если Вы в России) или на Ваш банк, в котором Вы обслуживаетесь.
Да тут собственно не в валюте дело, а хочу именно понять как находить нужную инфу на сайте. Вот закусило, хочу добиться что бы часы показывали курс валют с этого сайта(раньше это ведь работало), пока не очень понимаю как и к чему привязываться при поиске нужных символов на сайте. Вернее понятно что нужно находить какой то уникальный кусок кода, который ближе всего к искомому участку, но вот как это правильно сделать не могу додуматься.. Если знаете как подскажите, буду благодарен.
"Хочу добиться" и "подскажите где исправить" - две большие разницы.
хочу добиться
Так добивайтесь на сайте своего банка точно также, как на том.
Делается это просто.
1. Закачайте нужную Вам страницу в браузер
2. Включите "Просмотр кода страницы". Вы увидите текст страницы, которая Вам нужна. Именно такой текст Вы получите при скачивании страницы в ардуино.
3. Изучите текст. найдите нужную Вам информацию.
4. Выявите признаки в тексте страницы, по которым Вы сможете найти нужное (например, нужная мне информация находится в div c id=rate)
5. Только после этого пишите программу. Программа такая: скачали текст с сайта, ищите там установленные признаки и по ним извлекаете нужную информацию.
Если Вы неуверенно работаете со строками, даже не надейтесь сделать это быстро. Для начала придётся стать специалистом по обработке строк. Но всё решаемо.
текст в строке к которой можно привязаться я нахожу в общем то без проблем если это все в одной строке:
Но как быть если сам искомый текст на следующей строке и там кроме этих цифр больше нет ничего:
может как то можно эти строки объединить в одну ...или тут нужен другой метод? что нужно сделать что бы найти эти цифры (3,9086) ?
А при чем здесь вообще строки?
Разбирайте текст по мере поступления без разбивки на строки.
Как?
Молча. Чего Вы привязались к строкам - дались они Вам? Вы ведь текст читаете не строками, а посимвольно - сплошным потоком. Перевод строки - такой же символ, как и остальные, вот и обрабатывайте его как остальные.
Я полагал что именно строками текст читается (как вижу в браузере).... не понял про перевод строки, можете на приведенном мною коде показать как это сделать, что бы наглядно было?
.... Вроде раздел для начинающих....
если бы я знал как это сделать не спрашивал бы..... :(
(как вижу в браузере)....
И что Вы видите в браузере? Последовательность символов. Там где в последовательности встречается символ перевода строки, там для Вашего удобства происходит переход на новую строку. Не более того. А сам по себе символ перевода строки - такой же символ, как и все остальные.
Это Вы его читаете строками функцией client.readStringUntil потому, что Вам так удобнее. Внутри она читает посимвольно (посмотрите в её код). И Вам никто не мешает читать посимвольно. Для этого в библиотеке есть специальный метод. Какой? Я не знаю, т.к. Вы не привели полного кода, и я понятия не имею какую библиотеку Вы используете. Но метод посимвольного чтения есть в любой.
Спасибо большое за ответ..... пробелы - это тоже символы, их тоже нужно учитывать правильно?
Вот полный код часов:
Ну, вот, смотрите, Вы используете класс WiFiClientSecure, унаследованный в конечно итоге от Stream. Значит, Вам доступны все (от слова "все") функции чтения и записи, которые есть, например, в Serial. Поэтому, если Вам нужно читать посимвольно, то и читайте себе client.read(), никто Вам не запрещает.
Я бы на Вашем месте, сначала отложил бы в сторонку большой скетч, а взял бы скачанную страницу (как текстовую константу) и научился бы выделять из неё то, что нужно в отдельной программе. А потом бы уже готовый вытаскивальщик встроил бы в большой скетч.
Понял, спасибо Вам огромное. Я в принципе так и сделал - маленький скетч, который получает код с сайта.
Тут еще проблемка возникла - Вы советовали брать курc например с сайта сбербанка, а там он(сайт) на скриптах( на сайтах других банков картина аналогичная) и в коде я вообще ничего не смог найти по валюте, т.е на обычной странице браузера есть курс а в html коде нет ничего даже близко, я так понимаю что это типа защиты от ботов что ли, и тут видимо придется искать сайты где это можно получить данные по Api. Это как то можно обойти? я так понимаю тут вариант делать запрос как то через браузер или отсылать запрос на сервер так, как это делает браузер?
Это как то можно обойти? я так понимаю тут вариант делать запрос как то через браузер или отсылать запрос на сервер так, как это делает браузер?
если сайт на скриптах, то браузер скачивает скрипт и исполняет его на стороне клиента. Из чего следует. что вы так сделать не сможете - ну если только не встроите в свою программу интерпретатор яваскрипта...
Понял, спасибо большое за ответ.
Тут еще проблемка возникла - Вы советовали брать курc например с сайта сбербанка, а там он(сайт) на скриптах( на сайтах других банков картина аналогичная) и в коде я вообще ничего не смог найти по валюте
Ну, тут разные способы есть. Всё зависит от того, что Вам нужно. Если только курсы типа "примерно", так их можно получить через MT4 (это система для торговцев на Форексе) API и парсить ничего не надо.
Если же нужен конкретный банк, то нужно посмотреть как именно он их рисует. Если он рисует скриптами, надо смотреть на эти скрипты - возможно, там тупой json запрос, так кто Вам мешает сделать такой же? В общем, если нужен конкретный банк, то надо на него и смотреть.
Вот, например, ЦБ РФ (https://www.cbr.ru/currency_base/daily/ ) делает всё просто, посмотрите на текст - там голимая таблица прямо сидит.
Сбербанк заполняет на лету, но без защиты, т.е. расковырять можно, но уже сложнее, чем у ЦБ.
Какой банк Вас интересует?
Мне нужно получать реальный курс рубля к доллару.. ну можно еще курс евро .....получается видимо это ЦБ РФ
Ну, с ЦБ там всё просто - видели их страницу? Справитесь? Или помощь нужна?
Да, здесь с сайтом ЦБ получилось все без проблем, даже по сути исходный код править особо не пришлось, высчитал только расположение нужных символов и все работает.... спасибо Вам огромное за помощь!!!!!
Не за что.