• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Skrypt odpalany poprzez klienta na stronie, który wykona robotę po stronie servera

Object Storage Arubacloud
0 głosów
316 wizyt
pytanie zadane 14 grudnia 2022 w JavaScript przez Nitr0Skay Użytkownik (670 p.)

No więc sytuacja wygląda tak, iż chciałem Pobrać z podanej przez użytkownika strony kilka meta tagów - pytałem o to nawet w tym temacie: https://forum.pasja-informatyki.pl/575755/przeszukiwanie-kodu-zrodlowego-innej-strony

Pierwsza moja próba Web Scrappingu opierała się o protokół xmlHTTPrequest - jednak jak zauważyłem, nie jest to przeznaczone do Web Scrappingu przez CORS Policy. Poszperałem trochę i znalazłem pewne przesłanki, że najlepiej odpytywać po stronie servera (coś na wzór client - server - client), a więc pomyślałem, że Pakiet Puppeteer odpalany przy pomocy Node.js zrobi robotę. No więc napisałem prosty scrypt w node, który przeszukuje podaną stronę pod kontem posiadania pewnego meta tagu, gdy występuje on na stronie, to skrypt ma wypluwać  true, a gdy nie to false. Prosty skrypt, który działa (testowałem go na node przy użyciu konsoli). 

No i tak natrafiłem na pewną ścianę: mianowicie mam stronę typu index.html, na którym jest szablon formularza - jedno pole w które użytkownik wpisuje URL strony, którą chce sprawdzić no i przycisk. Tenże miał uruchamiać mechanizm - a więc skrypt na stronie (po stronie klienta) czyta zawartość formularza (a więc URL z tego inputa), zapisuje to do zmiennej, no i powinienem wysłać tę zmienną do skryptu node.js który by zrobił robotę po stronie servera (czyli odpalałby się właśnie po otrzymaniu żądania ze strony wraz ze zmienną z tym URL), a ten serverowy skrypt miałby wysłać potem odpowiedź (a więc wynik tego skryptu) z powrotem do strony. 

To tak z grubsza. Problem polega na tym, że nie bardzo wiem, jak to wszystko połączyć. W sensie miałem pomysł, aby wysłać url do tego skryptu node przy pomocy xmlHTTPrequest, coś mniej więcej w ten deseń:

const xhr = new XMLHttpRequest();
      xhr.open('GET', './scrypt.js', true);
      xhr.responseType = ?
      xhr.send(url);

i to umieszczałem w Event Listenerze przypiętym do wcześniej wspomnianego przycisku i po prostu script.js miał się odpalać i działać po stronie servera. W script.js siedzi funkcja, do której chciałem właśnie przekazać URL.

Gdyby mnie czas tak nie gonił to bym sam poszperał w internecie i metodą prób i błędów w końcu doszedłbym do właściwego rozwiązania prędzej, czy później, a właśnie jako iż zależy mnie teraz nieco na czasie, to potrzebuję jakiegoś naprowadzenia i nakierowania, bo nawet w sumie nie wiem, czy podążam we właściwym kierunku. A może trochę się zamotałem ? :D

Nie mniej jednak każda forma pomocy i naprowadzenia będzie mile widziana. Z góry dziękuję i Pozdrawiam :)

1 odpowiedź

+3 głosów
odpowiedź 14 grudnia 2022 przez ScriptyChris Mędrzec (190,190 p.)

Czyli po stronie serwera masz skrypt scrapujący jakąś stronę i chciałbyś do niego wysłać request, który go uruchomi i ewentualnie coś zwróci? Wystaw z serwera endpoint (np. przy pomocy Express), który uruchomi tenże skrypt. Zamiast XMLHttpRequest użyj fetch  - jest wygodniejszy w obsłudze.

komentarz 14 grudnia 2022 przez Nitr0Skay Użytkownik (670 p.)

Czyli po stronie serwera masz skrypt scrapujący jakąś stronę i chciałbyś niego wysłać request, który go uruchomi i ewentualnie coś zwróci?

Dokładnie o to mi chodzi. Proszę wybaczyć nieco chaotyczny obraz sytuacji :D

 Wystaw z serwera endpoint (np. przy pomocy Express), który uruchomi tenże skrypt.

Dobra, to już jakieś naprowadzenie. Zgłębię ten temat i w razie problemów zadam pytanie.
Ewentualnie popatrzę czy są jakieś konkretne alternatywy dla Expressa.

Zamiast XMLHttpRequest użyj fetch  - jest wygodniejszy w obsłudze. 

O właśnie ! Zapomniałem już trochę o fetch. Ale to bardziej przy zaciąganiu url do skryptu na serverze, czy przy zaciągnięciu wyniku tego serverowego skryptu z powrotem na stronę ? 

1
komentarz 14 grudnia 2022 przez ScriptyChris Mędrzec (190,190 p.)

Ale to bardziej przy zaciąganiu url do skryptu na serverze, czy przy zaciągnięciu wyniku tego serverowego skryptu z powrotem na stronę ? 

W komunikacji HTTP klientem (inaczej: stroną, która inicjuje połączenie) może być praktycznie cokolwiek, co umie wysłać request (przeglądarka, CURL w konsoli, Postman, Node.js), a serwerem cokolwiek, co umie odebrać request i na niego odpowiedzieć.

Fetch'em wysyłasz request z klienta. Ten dociera na serwer - gdzie dzieje się jakaś logika - który odpowiada klientowi (z opcjonalnymi danymi zwrotnymi). Możesz też wysłać request z serwera na inny serwer, bo mechanizm jest ten sam (pewnie poza różnicami w CORS czy cache).

komentarz 7 stycznia 2023 przez Nitr0Skay Użytkownik (670 p.)
Jedna rzecz wciąż nie daje mnie spokoju. Wiem mniej więcej, jak odpala się skrypt na Node, który uruchamia server (coś mniej więcej na zasadzie http.createServer) i on nasłuchuje, czy nie przychodzi jakiś request od klienta cały czas (mniej więcej tak ja to rozumiem - nie wiem, czy moje pojmowanie tego wszystkiego jest właściwe).

I teraz moje pytanie brzmi, czy ten server ma być tworzony (przy pomocy metody createServer od modułu http) za każdym razem, gdy wysyłane jest zapytanie od klienta z odpowiednią zmienną (tą którą poda użytkownik i ją zatwierdzi przyciskiem - uruchamiany jest wtedy Event Listener), czy może sęk w tym, że server ma być (w jakiś sposób) uruchomiony wcześniej tylko jeden raz i ma cały czas nasłuchiwać, czy od klienta nie idzide jakiś request ??

Nigdy wcześniej tego nie robiłem i nikt mi tego nie pokazał, więc ciężko mnie to sobie wyobrazić, jak w ogóle osiągnąć coś, co próbuję zrobić. Próbowałem wielu rzeczy, ale utknąłem w tym konkretnym punkcie. Odpowiedź na powyższe pytanie prawdopodobnie mnie pomoże
komentarz 7 stycznia 2023 przez ScriptyChris Mędrzec (190,190 p.)

Serwer uruchamia się raz i on cały czas nasłuchuje na przychodzące requesty - podobnie jak na stronie w przeglądarce raz ustawia się event listener na np. kliknięcie i on słucha cały czas - do momentu, gdy go nie zamkniesz lub zastopujesz skrypt (albo host tego nie zrobi odgórnie).

komentarz 7 stycznia 2023 przez Nitr0Skay Użytkownik (670 p.)

W porządku. Czyli jedna moja wątpliwość została rozwiana. To teraz powiedzmy, że mam script.js a w nim coś w deseń:

 

const http = require('http');
const port = process.env.PORT || 5000;  

http.createServer((req, res) => {
    res.writeHead(200, {'Content-Type': 'text/html'});
    
   res.end(/* Wynik działania mojego scryptu */);
}).listen(port);

Wrzucam ten plik na server razem z innymi plikami js i html ? Jak tak, to jak to potem odpalić z poziomu servera (na którym trzymam te pliki) by potem nasłuchiwało to cały czas na przychodzące requesty ze strony clienta ?? Jakoś zawsze wydawało mnie się to zawiłe, więc się w to nie bawiłem, teraz natomiast tego typu działanie mnie się przyda. Jak to ugryźć ? :D

komentarz 7 stycznia 2023 przez ScriptyChris Mędrzec (190,190 p.)

Zanim się rozpędzisz z tworzeniem serwera na piechotę (a widzę, że korzystasz z modułu http), to użyłbym jakiegoś mini frameworka pokroju Express - ułatwi obsługę zapytań.

Pozostałe pliki mogą leżeć obok, albo w podfolderach - grunt, żeby utrzymać jakąś spójność struktury plików. Pliki możesz serwować przy użyciu res.sendFile(); odpowiedzi na Ajax często odsyła się w postaci JSON. Całość uruchamiasz wywołując skrypt serwera poprzez komendę node w wierszu poleceń.

komentarz 7 stycznia 2023 przez Nitr0Skay Użytkownik (670 p.)

Zanim się rozpędzisz z tworzeniem serwera na piechotę (a widzę, że korzystasz z modułu http), to użyłbym jakiegoś mini frameworka pokroju Express - ułatwi obsługę zapytań.

No właśnie przy pierwszym razie wolałem uniknąć korzystania z Frameworków i stworzyć coś przy użyciu czystego JSa - pozwoli mnie to na lepsze jego poznanie. Skorzystanie z Frameworka w ogóle mnie nie pomoże w poznaniu podstaw tego zagadnienia.

Gdy uda mnie się to napisać w czystym JSie, to będzie to prostsze w przyszłości, gdy będę musiał napisać coś podobnego korzystając Frameworka, no i łatwiej będzie mnie zrozumieć pewne podstawy. Tak sądzę ;p 

Na chwilę obecną dziękuję za nakierowanie, Postaram się zgłębić nieco temat, przy pomocy artykułów, które mnie Pan podesłał i będę próbował coś ugrać. Gdy pojawią się kolejne wątpliwości, napiszę :D

Podobne pytania

0 głosów
1 odpowiedź 562 wizyt
0 głosów
0 odpowiedzi 56 wizyt
pytanie zadane 24 marca 2020 w JavaScript przez mknnn221 Początkujący (460 p.)
0 głosów
2 odpowiedzi 1,138 wizyt
pytanie zadane 6 września 2018 w Sieci komputerowe, internet przez Artur Koniec Gaduła (3,670 p.)

92,566 zapytań

141,420 odpowiedzi

319,614 komentarzy

61,952 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...