Pobieranie wartosci z przegladarki

0

Witam,

Urzadzenie posiada web server, do ktorego mozna sie dostac przez przegladarke. W interfejsie wyswietlane sa rozne parametry w tym moc.
Chcialbym z poziomu innego prostego programu napisanego w C++/Qt odczytac ta wartosc. Jest taka mozliwosc? Nie mam wgladu do kodu servera na urzadzeniu, jedynie to co jest wyswietlane w przegladarce.

2

Serwer powinien wystawiać odpowiednie endpointy API, które zwracają Ci potrzebne wartości. Tak to powinno wyglądać. A jak wygląda u Ciebie? Rozumiem, że nie masz możliwości postawienia takich endpointów. Jak wygląda strona, którą wystawia ten serwer? Czy jest to coś publicznie dostępnego?

2
  1. Zobacz czy ten webinterfejs nie pobiera danych ajaxem
  2. Jeśli nie, to po porostu scrapuj htmla tej strony i parsuj.
0

Niestety nie jest to publicznie dostepna strona, trzeba sie podlaczyc bezposrednio do urzadzenia aby miec dostep do servera. Nie znam sie na webie, podejrzalem zrodlo strony, znalazlem miejsce, w ktorym wstawiana jest wartosc mocy.

 <td>Avg. Power, W:</td>
                     <td id="ROP" class="digit">&nbsp;</td>

wartosc podstawia skrypt w js.

$("#SETPRR").slider("option", "max", SliderMax);
        $("#ROP").html(f.ROP);

Moge wrzucic calego htmla jezeli trzeba. Na podstawie tego jestem w stanie pobrac wartosc ROP?

1

Otwórz narzędzia developerskie w przeglądarce. Odśwież stronę. Popatrz czy pojawiły sie jakieś requesty dodatkowe które pobierają dane...

0

screenshot-20181011134008.png

Nie wiele mi tu mowi, chyba poszukam innego rozwiazania, za malo doswiadczenie w webie.

1

Jeśli to są jedyne requesty to znaczy ze po prostu wszystko leci w tym jednym htmlu. W takim wypadku musisz po prostu w aplikacji pobrać i sparsować htmla.

0

Tak, to jedyne requesty. Dzieki. Zastanawiam sie teraz czy nie latwiej bedzie to napisac w C# bo pozniej moze te dane bede dodawal do bazy.

2

uaktywnij pokazywanie requestów ajaxowych, kliknij przycisk "XHR" z lewej strony przycisku "Requests" w logu powinno pojawić się

XHR GET http .......
0

Zobaczylem, ze jest get
screenshot-20181011154649.png

Otworzylem monitor.cgx, zawiera dane, ktore mnie interesuja w JSON. Pozostaje dostac sie bezposrednio do tego pliku monitor.cgx i parsowac JSONA?
screenshot-20181011154843.png

1

No to chyba wszystko jasne. Robisz GET na tym pliku i masz wszystko. Musisz tylko pamiętać, że nie jest to część publicznego API i może ulec zmianie w przyszłości.

0

Dzieki za pomoc. To bedzie jednorazowa akcja tylko na tym sprzecie.
Pozdrawiam

0

Jeszcze jedno pytanie. Skorzystanie z QtNetwork i wysylanie requestow bedzie dobrym rozwiazniem? Czy lepiej pobrac plik i parsowac go lokalnie?
Znalazlem takie cos, prawdopodobnie napisze cos podobnego.
https://makina-corpus.com/blog/metier/archives/access-json-webservice-qt-c

1

Szczerze mówiąc najsensowniej będzie, jak użyjesz Pythona. Zrobisz to w jednej linii kodu. O ile oczywiście możesz. Wspominałeś jednak o C# to zakładam, że możesz to zrobić w czym zechcesz.

0
pingwindyktator napisał(a):

Szczerze mówiąc najsensowniej będzie, jak użyjesz Pythona. Zrobisz to w jednej linii kodu. O ile oczywiście możesz. Wspominałeś jednak o C# to zakładam, że możesz to zrobić w czym zechcesz.

Moge. Ale pytanie czy umiem :D nic nie pisalem w Pythonie wczesniej. Z nudow kiedys jakies podstawowe katy na codewars.

1
import requests

url = r'...'
print(requests.get(url).json()["ROP"])
0
pingwindyktator napisał(a):
import requests

url = r'...'
print(requests.get(url).json()["ROP"])

Dziala pieknie, dzieki. Chyba czas poznac Pythona:) Zintegruje to z reszta aplikacji i gotowe.

0

Jak najlepiej przekaz wartosc ze skryptu do reszty programu w C++? Probuje korzystajac z QProcess ale nie udaje sie odczytac poprawnej wartosci.
Mysle jeszcze czy nie zrobic po prostu pliku .exe ze skryptu i zapisywac wartosc np w pliku tekstowym a pozniej w aplikacji czytac wartosc z pliku ale to chyba niezbyt poprawne rozwiazanie.

  QStringList params;
  params << "getValue.py";
  p.start("python", params);
  p.waitForFinished(-1);
  QString currentPower = p.readAll();
  ui->label->setText(currentPower);
0
qblacksheep napisał(a):

Jak najlepiej przekaz wartosc ze skryptu do reszty programu w C++? Probuje korzystajac z QProcess ale nie udaje sie odczytac poprawnej wartosci.
Mysle jeszcze czy nie zrobic po prostu pliku .exe ze skryptu i zapisywac wartosc np w pliku tekstowym a pozniej w aplikacji czytac wartosc z pliku ale to chyba niezbyt poprawne rozwiazanie.

  QStringList params;
  params << "getValue.py";
  p.start("python", params);
  p.waitForFinished(-1);
  QString currentPower = p.readAll();
  ui->label->setText(currentPower);

Problem byl z lokalizacja interpetera Pythona. Musze podac pelna sciezke do interpetera i pelna sciezke do skryptu. Dopiero wtedy poprawnie pobiera wartosc.

     params << "C:\\Users\\Documents\\test\\test.py";
    process.start("C:\\Python\\Python.exe", params);
0

Spoko. Chociaż nie sądziłem, że w ten sposób chcesz tego użyć.

0

Jakie inne rozwiazanie proponujesz? Calosc w Pythonie napisac? Teraz realizuje to tak:

  • C++/QT

    • GUI (Prosty interfejs do pokazywania aktualnych parametrow),
    • Prosta logika, wywolywanie skryptu aby odczytac wartosc, dodawanie logow do bazy (data, aktualna moc).
  • Python

    • Request do webservera (pobieranie wartosci) i wypisywanie jej na standardowe wyjscie.
1

Uważam, że tworzenie skryptu pythonowego tylko po to, żeby pobrać wartość z JSONa z sieci nie jest dobrym rozwiązaniem. Pamiętaj, że po stronie C++ musisz zapewnić komunikacje z tym skryptem i error handling. Sądziłem, że jesteś w stanie zamknąć całość swojej aplikacji w pythonie. Jeśli nie (bo QT), to sugerowałbym poszukać w C++ czegoś, co pozwoli Ci łatwo zastąpić kod w pythonie. Pewnie sensownym byłoby Qt (tutaj i tutaj jakieś przykłady).

0

Zrobilem calosc w C++. Ale zaczynam sie uczyc Pythona, jedna linijka w Pythonie rozwiazuje problem, na ktory w C++/QT musialem przeznaczyc ponad pol dnia. Dzieki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1