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

Puppeteer wywala server node po paru sekundach

Object Storage Arubacloud
+1 głos
276 wizyt
pytanie zadane 15 stycznia 2023 w JavaScript przez Nitr0Skay Użytkownik (670 p.)

Witam. Otóż męczę się trochę z działaniem Puppeteera po stronie servera. Postawiłem prosty server node.js po stronie którego miałbym uruchamiać Puppeteera, jednak integracja nie przeszła po mojej myśli:

Uncaught ProtocolError ProtocolError: Protocol error (Page.navigate): Invalid parameters Failed to deserialize params.url - BINDINGS: mandatory field missing at position 50
    at <anonymous> (file:///C:/marcin/Projects/gsCChekker/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Connection.js:329:24)
    at send (file:///C:/marcin/Projects/gsCChekker/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Connection.js:325:16)
    at navigate (file:///C:/marcin/Projects/gsCChekker/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Frame.js:229:47)
    at goto (file:///C:/marcin/Projects/gsCChekker/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Frame.js:207:13)
    at goto (file:///C:/marcin/Projects/gsCChekker/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Page.js:440:91)
    at module.exports (file:///C:/marcin/Projects/gsCChekker/gsCChekker.js:5:16)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)

Błąd pojawia się parę sekund po odpaleniu w przeglądarce i przez te parę sekund skrypt Puppeteera działa normalnie i wynik otrzymam taki jaki powinienem, o ile się zmieszczę w tych paru sekundach, nim wyskoczy powyższy błąd.

server.js wygląda następująco:

const http = require('http');
const port = process.env.PORT || 5000;  
const path = require('path');
const fs = require('fs');
const url = require('url');
const indexPath = path.join(__dirname, '/index.html');

http.createServer(async (req, res) => {
    res.writeHead(200, {'Content-Type': 'text/html'});
    
    if(req.url === '/' && req.method === 'GET') {
        res.end(fs.readFileSync(indexPath));
    } else {
        const query = url.parse(req.url, true).query;
        const json = JSON.stringify(query);
        const u = JSON.parse(json).url;
        const gs = require('./gsCChekker.js');
              gs(u).then(resolve => {
                      if(resolve)   {
                        res.end('This site has Google Search Console Tool');
                      } else {
                        res.end('This site probably has not Google Search Console Tool');
                      }
              });
    }
    
}).listen(port, () => {
    console.log(`Listening on Port: ${port}`);
});

Natomiast skrypt Puppeteera wygląda tak:

module.exports = async function(url) {
    const puppeteer = require('puppeteer');
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto(url, {waitUntil: 'domcontentloaded'});
    const GSC = await page.$("meta[name='google-site-verification']");
    const isGSC = (GSC === null) ? false : true;
    page.close();
    browser.close();
 
    return Promise.resolve(isGSC);
}

 

No i działa dobrze, przez pierwsze dwie czy trzy sekundy po odpaleniu servera, ale po każdym odświeżeniu strony (czy to endpoint '/', czy to każdy inny pod else) wyskakuje powyższy błąd. Odkryłem, że to głównie ten kawałek kodu go powoduje:

gs(u).then(resolve => {
               if(resolve)   {
                        res.end('This site has Google Search Console Tool');
               } else {
                        res.end('This site probably has not Google Search Console Tool');
               }
 });

Wie ktoś może, dlaczego ? 

Co to za błąd, no i jak to naprawić ??

Bo mnie już skończyły się pomysły. Przeczesałem google i nie znalazłem odpowiedzi na mój problem (możliwe, że niezbyt dokładnie szukałem)

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

Możesz pokazać co jest w zmiennej url wewnątrz eksportowanej funkcji (tam, gdzie używasz Puppeteer'a)?

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

Kurde, po przesiadce z Windowsa do Ubuntu (versja node jest ta sama), nagle przestało działać całkowicie wywalając mnie ten błąd:

node:internal/modules/cjs/loader:1042
  throw err;
  ^

Error: Cannot find module '/home/marcin/Pulpit/Projects/gsCChekker/server.js'
    at Module._resolveFilename (node:internal/modules/cjs/loader:1039:15)
    at Module._load (node:internal/modules/cjs/loader:885:27)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:82:12)
    at node:internal/main/run_main_module:23:47 {
  code: 'MODULE_NOT_FOUND',
  requireStack: []
}

Node.js v19.2.0

Serio, podziwiam Was, że macie do tego taką cierpliwość...

 

Przez to chwilowo nie mogę odpowiedzieć na powyższe pytanie. Choć do tej exportowanej funkcji przekazywałem odpowiednio spreparowany URL, taki jak podał użytkownik. Ale to dopiero po requeście, bazowo breakpoint '/' miał wyświetlać tylko stronę z formularzem.

 

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

Czy po przesiadce reinstalowałeś paczki (usunięcie folderu node_modules i wykonanie npm install od nowa)?

komentarz 15 stycznia 2023 przez Nitr0Skay Użytkownik (670 p.)
edycja 15 stycznia 2023 przez Nitr0Skay
Nie zrobiłem tego. Zaraz to zrobię i zdam relację.

 

Edit:

Nadal ten sam błąd wyskakuje
1
komentarz 15 stycznia 2023 przez ScriptyChris Mędrzec (190,190 p.)
Jak uruchamiasz swój skrypt?
komentarz 16 stycznia 2023 przez Nitr0Skay Użytkownik (670 p.)

Skrypt uruchamiałem przy pomocy Javascript Debug Terminal  wbudowanego w Visual Studio Code:

 

Ale potem zdałem sobie sprawę z tego, iż powinienem spróbować jeszcze w Terminalu Ubuntu i o dziwo, zadziałało, przez pierwsze parę sekund, potem pojawia się błąd z początku tematu, ale udało mnie się wyświetlić to, co dostaje Puppeteer, Uruchamia się zatem ten kod z pliku server.js:

const query = url.parse(req.url, true).query;
        const json = JSON.stringify(query);
        const u = JSON.parse(json).url;
        const gs = require('./gsCChekker.js');
              gs(u).then(resolve => {
                      if(resolve)   {
                        res.end('This site has Google Search Console Tool');
                      } else {
                        res.end('This site probably has not Google Search Console Tool');
                      }
              });

Blok kodu else dla endpointów różnych niż "/".

Dodałem więc prosty console.log w funkcji z Puppeteerem:

module.exports = async function(url) {
    const puppeteer = require('puppeteer');
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    console.log(url);
    await page.goto(url, {waitUntil: 'domcontentloaded'});
    const GSC = await page.$("meta[name='google-site-verification']");
    const isGSC = (GSC === null) ? false : true;
    page.close();
    browser.close();
 
    return Promise.resolve(isGSC);
}

No i wynik działania powyższych daje następujące rezultaty:

Natomiast Terminal wypluwa mi to:

A zatem skrypt zdążył się wykonać, nim się wykrzaczył, ale console.log z exportowanej funkcji zwrócił poprawnie przetworzony link, taki jaki powinien dostać. Natomiast funkcja ta zwróciła false ponieważ te forum prawdopodobnie nie posiada meta tagu, który mnie interesuje ;p

1 odpowiedź

0 głosów
odpowiedź 19 lutego 2023 przez Nitr0Skay Użytkownik (670 p.)
edycja 19 lutego 2023 przez Nitr0Skay

Po długich poszukiwaniach odkryłem, że błąd ten był z jakiegoś powodu rzucany przez 

page.close();

 

Zajrzałem do kodu w Page.js

Z linijce 789 jak byk jest zwracany promise. Zatem powinienem użyć await:

await page.close();
await browser.close();

Ale z jakiegoś powodu o tym zapomniałem. Przepraszam za zamieszanie i dziękuję za pomoc :)

Podobne pytania

0 głosów
2 odpowiedzi 427 wizyt
pytanie zadane 17 maja 2020 w Sieci komputerowe, internet przez boneoflive Użytkownik (930 p.)
+1 głos
1 odpowiedź 357 wizyt
pytanie zadane 12 października 2021 w JavaScript przez chrystian Gaduła (4,780 p.)
–1 głos
1 odpowiedź 158 wizyt
pytanie zadane 20 stycznia 2021 w Sieci komputerowe, internet przez yapyap Obywatel (1,730 p.)

92,583 zapytań

141,434 odpowiedzi

319,668 komentarzy

61,966 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!

...