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

Jak pobrać zawartość strony za pomocą javascript, jeśli pobranie danej treści wymaga zalogowania?

Aruba Cloud - Virtual Private Server VPS
+3 głosów
275 wizyt
pytanie zadane 19 września 2023 w JavaScript przez Mateusz Analityk Stary wyjadacz (13,710 p.)
edycja 8 października 2023 przez Mateusz Analityk

Jeśli strona nie wymaga logowania robię to za pomocą.

var response = UrlFetchApp.fetch(url);

Jednak jeśli strona wymaga logowania nie wiem, jak podejść do tematu.

Program uruchamiam całkowicie zewnętrznie poza przeglądarką. Znam hasło i login do konta.

Może temat jest prosty do ogarnięcia, i ktoś z was będzie w stanie mnie nakierować. Z góry dziękuję za pomoc.

ODŚWIEŻENIE PYTANIA 08.10.2023 W ODPOWIEDZI PONIŻEJ

2 odpowiedzi

+4 głosów
odpowiedź 19 września 2023 przez Comandeer Guru (606,920 p.)

Jeśli znasz dane dostępowe do konta, to najprościej byłoby wysłać żądanie POST pod adres formularza logowania i zapisać ciasteczko/token, który zwróci Ci serwer. I to ciasteczko/token trzeba będzie dodawać do każdego kolejnego zapytania, żeby serwer wiedział, że ma do czynienia z zalogowanym użytkownikiem.

Niemniej może się okazać, że to nie jest aż tak proste, bo np. formularz może mieć jakieś zabezpieczenie typu token anty-CSRF. Więc wówczas trzeba jeszcze ogarnąć, jak taki token jest generowany i załączać go do żądania.

+1 głos
odpowiedź 8 października 2023 przez Mateusz Analityk Stary wyjadacz (13,710 p.)
const cookies = [
  'c_user=100024636xxxxxx;',
  'xs=17%3Ay2GduLHcLRdxxxxxxxxx;',
  'datr=ECrSZK6PAi69trh6txxxxxxxx;',
  'dpr=1.3636363636363635;',
  'fr=0j74mLNoFhotcKElj.AWUS2rxxxxxxxxx;',
  'm_page_voice=100024636xxxxxx;',
  'presence=C%7B%22lm3%22%3A%22u.10000xxxxxxxxxxxxx;',
  "usida=eyJ2ZXIiOjEsImlkIjoiQXMxxxxxxxxxxxxx;",
  'wd=1408x164;',
  'x-src=%2Fdocs%2Ffacebookxxxxxxxxxxxxxx',
  'm_pixel_ratio=1;',
];

const url = 'https://www.facebook.com'; // Adres URL strony, którą chcesz pobrać

function run() {
  try {
    const options = createRequestOptions(cookies);
    const htmlContent = fetchHtmlContent(url, options);
    if (htmlContent) {
      const folder = createOrGetFolder();
      const fileName = createFileName(new Date());
      saveContentToFile(folder, fileName, htmlContent);
      const fileUrl = getFileUrl(folder, fileName);
      if (fileUrl) {
        logFileUrl(fileUrl);
      } else {
        console.error('Błąd podczas uzyskiwania URL pliku.');
      }
    } else {
      console.error('Błąd podczas pobierania zawartości HTML.');
    }
  } catch (error) {
    console.error('Błąd:', error.message);
  }
}

function createRequestOptions(cookies) {
  return {
    method: 'GET',
    headers: {
      'Cookie': cookies.join(';'),
    },
  };
}

function fetchHtmlContent(url, options) {
  const response = UrlFetchApp.fetch(url, options);
  if (response.getResponseCode() === 200) {
    return response.getContentText();
  } else {
    console.error(`Błąd ${response.getResponseCode()}: Nie udało się pobrać zawartości HTML.`);
    return null;
  }
}

function createOrGetFolder() {
  const folderName = createFolderName(new Date());
  const folderIterator = DriveApp.getFoldersByName(folderName);
  return folderIterator.hasNext() ? folderIterator.next() : DriveApp.createFolder(folderName);
}

function createFolderName(date) {
  const year = date.getFullYear();
  const month = (date.getMonth() + 1).toString().padStart(2, '0');
  const day = date.getDate().toString().padStart(2, '0');
  return `${year}/${month}/${day}`;
}

function createFileName(date) {
  const hour = date.getHours().toString().padStart(2, '0');
  const minute = date.getMinutes().toString().padStart(2, '0');
  const second = date.getSeconds().toString().padStart(2, '0');
  return `${hour}${minute}${second}.html`;
}

function saveContentToFile(folder, fileName, content) {
  try {
    folder.createFile(fileName, content, 'text/html');
  } catch (error) {
    console.error(`Błąd podczas zapisywania pliku: ${error.message}`);
  }
}

function getFileUrl(folder, fileName) {
  const file = folder.getFilesByName(fileName);
  return file.hasNext() ? file.next().getUrl() : null;
}

function logFileUrl(url) {
  if (url) {
    console.log(`Link do zapisanego pliku: ${url}`);
  }
}


/* const phpSession = 'ciasteczko uwierzytelniające';
const url = 'adres URL, którego zawartość jest dostępna tylko po zalogowaniu';

function getParsedHTML() {
  try {
    const options = {
      headers: {
        'Cookie': `PHPSESSID=${phpSession}`
      }
    };
    
    const response = UrlFetchApp.fetch(url, options);
    
    // Przetwarzanie odpowiedzi, parsując ją jako tekst HTML lub JSON
    const htmlContent = response.getContentText();
    // Dalsza część kodu, która opracowuje zawartość strony pochodzącej ze zmiennej htmlContent
    
    Logger.log(htmlContent); // Loguj zawartość do dziennika
  } catch (error) {
    console.error('Błąd:', error);
  }
}
*/

Jak myślicie, co jeszcze należałoby zrobić w kodzie powyżej, aby pobrać zawartość strony facebook po zalogowaniu, kod działa dla prostszych stron, gdzie udało mi się odnieść sukces, tutaj mozecie sobie sprawdzić, w tym przypadku kod ładuje pustą stronę tak jakby tylko nagówek bez konkretnych danych, próbuję kopiować całą sesję cooke i wysłać ją w nagłówku https, ciasteczka, które są wypisane w kodzie w zmiennej "cookies", ale to nie wystarcza, pytanie dlaczego?

Wiem, że facebook stosuje uwierzytelnienie za pomocą tokena, ale chciałem hipotetycznie zrobić to w inny sposób

1
komentarz 8 października 2023 przez Comandeer Guru (606,920 p.)
Facebook pewnie ma bardziej zaawansowaną heurystykę, sprawdzającą choćby, czy ma do czynienia z przeglądarką. No i całkiem możliwe, że wszystko jest tam renderowane przez JS, więc treści i tak nie uda Ci się pobrać bez czegoś pokroju Puppeteera.

Podobne pytania

+1 głos
2 odpowiedzi 1,313 wizyt
+2 głosów
3 odpowiedzi 7,306 wizyt

93,335 zapytań

142,330 odpowiedzi

322,415 komentarzy

62,669 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...