pátek 13. září 2024

curl: Simulace komunikace se serverem

Pokračuji v předchozím článku o curl a hlavíčkách (stahování souborů a hlavičky).

Pro simulaci celé komunikace, jak je popsána v minulém díle o hlavičkách, můžeme použít curl v Bashi s nastavenými hlavičkami pro oba požadavky – první požadavek na HTML soubor ze serveru zp....cz a druhý požadavek na JavaScript soubor ze serveru freeprivacypolicy.com. Ukážeme, jak přesně nasimulovat odesílání hlaviček a zpracování odpovědí. Níže je ukázka:

1. První požadavek: Stažení HTML souboru z zp....cz

curl -X GET "https://zp....cz/" \
-H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,image/svg+xml,*/*;q=0.8" \
-H "Accept-Encoding: gzip, deflate, br, zstd" \
-H "Accept-Language: cs,sk;q=0.8,en-US;q=0.5,en;q=0.3" \
-H "Connection: keep-alive" \
-H "DNT: 1" \
-H "Host: zp....cz" \
-H "Priority: u=0, i" \
-H "Sec-Fetch-Dest: document" \
-H "Sec-Fetch-Mode: navigate" \
-H "Sec-Fetch-Site: none" \
-H "Sec-Fetch-User: ?1" \
-H "Sec-GPC: 1" \
-H "Upgrade-Insecure-Requests: 1" \
-H "User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:130.0) Gecko/20100101 Firefox/130.0" \
--compressed --verbose

Parametr -X v příkazu curl specifikuje HTTP metodu, kterou chceš použít pro daný požadavek. Ve tvém případě:

  • -X GET říká curl, aby použil metodu GET, což je nejběžnější metoda pro získání dat z URL (např. stažení webové stránky nebo souboru). Ve většině případů curl implicitně používá metodu GET, takže tento parametr není nutný, pokud neplánuješ použít jinou metodu (např. POST, PUT, DELETE).

2. Druhý požadavek: Stažení JavaScript souboru z freeprivacypolicy.com

curl -X GET "https://www.freeprivacypolicy.com/public/cookie-consent/4.0.0/cookie-consent.js" \
  -H "Accept: */*" \
  -H "Accept-Encoding: gzip, deflate, br, zstd" \
  -H "Accept-Language: cs,sk;q=0.8,en-US;q=0.5,en;q=0.3" \
  -H "Connection: keep-alive" \
  -H "DNT: 1" \
  -H "Host: www.freeprivacypolicy.com" \
  -H "Priority: u=2" \
  -H "Referer: https://zp....cz/" \
  -H "Sec-Fetch-Dest: script" \
  -H "Sec-Fetch-Mode: no-cors" \
  -H "Sec-Fetch-Site: cross-site" \
  -H "Sec-GPC: 1" \
  -H "User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:130.0) Gecko/20100101 Firefox/130.0" \
  --compressed --verbose


Vysvětlení parametrů:

  • -H – nastavuje hlavičky požadavku.
  • --compressed – povoluje podporu kompresí jako gzip, br, deflate.
  • --verbose – zobrazí detaily komunikace, včetně přijatých a odeslaných hlaviček, což simuluje sledování celé komunikace.

Tímto způsobem bude curl odesílat požadavky s příslušnými hlavičkami a zpracovávat odpovědi, jak jsou uvedeny v komunikaci.

Uložení cookies

Hlavičky odpovědi, zejména cookies, jsou velmi důležité pro následné požadavky na stejný server. Když server v odpovědi nastaví cookies (například Set-Cookie), klient (v tomto případě tvůj Bash skript s curl) by měl tyto cookies uložit a použít je při dalších požadavcích. Tyto cookies mohou sloužit k udržení stavu session (např. pomocí PHPSESSID) nebo k identifikaci uživatele (např. pomocí kdojeto).

Jak správně zpracovat hlavičky odpovědi a cookies pomocí curl:

  1. Ukládání cookies: Když server nastaví cookies, je potřeba je uložit do souboru, abys je mohl při dalších požadavcích použít.
  2. Zasílání cookies zpět: Při dalších požadavcích je nutné tyto uložené cookies posílat zpět na server, aby mohl server pokračovat v komunikaci na základě session nebo jiných informací.

Simulace v Bash pomocí curl:

Zde je skript, který provede:

  • Stažení HTML stránky a uložení cookies do souboru.
  • Stažení JS souboru s použitím těchto cookies a simulací hlaviček.

#!/bin/bash

# URL serveru
BASE_URL="https://zp...cz"
JS_URL="https://www.freeprivacypolicy.com/public/cookie-consent/4.0.0/cookie-consent.js"

# Soubor, do kterého se uloží cookies
COOKIE_FILE="cookies.txt"

# První požadavek - stáhnutí HTML
curl -s -c "$COOKIE_FILE" \
  -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,image/svg+xml,*/*;q=0.8" \
  -H "Accept-Encoding: gzip, deflate, br, zstd" \
  -H "Accept-Language: cs,sk;q=0.8,en-US;q=0.5,en;q=0.3" \
  -H "Connection: keep-alive" \
  -H "DNT: 1" \
  -H "Host: zp....cz" \
  -H "Sec-Fetch-Dest: document" \
  -H "Sec-Fetch-Mode: navigate" \
  -H "Sec-Fetch-Site: none" \
  -H "Sec-Fetch-User: ?1" \
  -H "Upgrade-Insecure-Requests: 1" \
  -H "User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:130.0) Gecko/20100101 Firefox/130.0" \
  "$BASE_URL/"

# Druhý požadavek - stažení JS souboru s použitím uložených cookies
curl -s -b "$COOKIE_FILE" \
  -H "Accept: */*" \
  -H "Accept-Encoding: gzip, deflate, br, zstd" \
  -H "Accept-Language: cs,sk;q=0.8,en-US;q=0.5,en;q=0.3" \
  -H "Connection: keep-alive" \
  -H "DNT: 1" \
  -H "Host: www.freeprivacypolicy.com" \
  -H "Referer: $BASE_URL/" \
  -H "Sec-Fetch-Dest: script" \
  -H "Sec-Fetch-Mode: no-cors" \
  -H "Sec-Fetch-Site: cross-site" \
  -H "User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:130.0) Gecko/20100101 Firefox/130.0" \
  "$JS_URL"

Vysvětlení:

  1. První curl příkaz stáhne HTML stránku a uloží cookies do souboru cookies.txt. Používáme různé hlavičky, jako například Accept-Encoding a User-Agent, aby komunikace vypadala jako běžný prohlížeč.

  2. Druhý curl příkaz stáhne JS soubor, ale tentokrát použije uložené cookies (-b "$COOKIE_FILE"). Zasíláme také hlavičku Referer, která ukazuje, odkud byl požadavek odeslán (v tomto případě z zp....cz).

Proč jsou důležité odpovědi serveru?

  • Cookies: Slouží pro udržení session nebo autentizaci uživatele. Například PHPSESSID udržuje stav session mezi požadavky.
  • Cache-Control: Ovládá cacheování. Hlavička no-cache znamená, že by obsah neměl být uložen do cache.
  • Content-Encoding: Uvádí, jak je odpověď komprimována (např. gzip, br), což je důležité, pokud chceš odpověď správně rozbalit a zpracovat.
  • X-Powered-By: Informuje, na jaké technologii server běží (zde PHP a ASP.NET).

Uložení hlaviček a kontrola

Chcete-li uložit hlavičky odpovědi do souborů a následně kontrolovat, zda soubor již existuje na disku a nestahovat jej znovu, můžete v Bashi použít curl spolu s dalšími nástroji jako grep nebo head.

1. Uložení hlaviček odpovědi do souboru

Pomocí curl můžete uložit hlavičky odpovědi do samostatného souboru a tělo odpovědi (např. JS soubor) do jiného:

# Stáhne hlavičky a uloží je do souboru headers.txt, tělo uloží do file.js
curl -D headers.txt -o file.js "https://www.freeprivacypolicy.com/public/cookie-consent/4.0.0/cookie-consent.js"

2. Kontrola, zda je soubor již stažen

Před každým stahováním můžete zkontrolovat, zda soubor již existuje na disku:

# Zkontroluje, zda soubor file.js existuje
if [ -f "file.js" ]; then
    echo "Soubor již existuje, nestahovat."
else
    echo "Soubor neexistuje, stáhne se nyní."
    curl -D headers.txt -o file.js "https://www.freeprivacypolicy.com/public/cookie-consent/4.0.0/cookie-consent.js"
fi


3. Kontrola hlavičky 303 See Other

Hlavička 303 indikuje, že klient by měl použít jiný zdroj (URL) pro požadavek. Můžete tuto hlavičku kontrolovat takto:

# Stáhne jen hlavičky a kontroluje stavový kód
status_code=$(curl -I -s -o headers.txt -w "%{http_code}" "https://www.freeprivacypolicy.com/public/cookie-consent/4.0.0/cookie-consent.js")

# Kontrola, zda je status code 303
if [ "$status_code" -eq 303 ]; then
    echo "Hlavička 303 - soubor by měl být přesměrován."
else
    echo "Status code je $status_code, není potřeba přesměrování."
fi

 

4. Ukládání cookies pro další požadavky

Pro práci s cookies a jejich uchování mezi požadavky můžete použít curl s volbami -c a -b:

 # Uloží cookies do souboru cookies.txt
curl -c cookies.txt -D headers.txt -o index.html "https://zp....cz/"

# Při dalším požadavku načte cookies ze souboru cookies.txt
curl -b cookies.txt -D headers2.txt -o další_soubor.js "https://zp....cz/něco"

Vše v jednom skriptu

#!/bin/bash

# URL serveru
DOMAIN_1="zp..cz"

DOMAIN_2="www.freeprivacypolicy.com"

BASE_URL="https://$DOMAIN_1"
JS_URL="https://
$DOMAIN_2/public/cookie-consent/4.0.0/cookie-consent.js"

# Soubor, do kterého se uloží cookies
COOKIE_FILE="cookies.txt"
# Soubor, do kterého se uloží hlavičky
HEADERS_FILE_1="headers_1.txt"
HEADERS_FILE_2="headers_2.txt"
HEADERS_FILE_3="headers_3.txt"
# Soubor pro JS
JS_FILE="file.js"

# První požadavek - stáhnutí HTML a uložení hlaviček
curl -s -c "$COOKIE_FILE" -D "$HEADERS_FILE_1" \
  -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,image/svg+xml,*/*;q=0.8" \
  -H "Accept-Encoding: gzip, deflate, br, zstd" \
  -H "Accept-Language: cs,sk;q=0.8,en-US;q=0.5,en;q=0.3" \
  -H "Connection: keep-alive" \
  -H "DNT: 1" \
  -H "Host: 
$DOMAIN_1" \
  -H "Sec-Fetch-Dest: document" \
  -H "Sec-Fetch-Mode: navigate" \
  -H "Sec-Fetch-Site: none" \
  -H "Sec-Fetch-User: ?1" \
  -H "Upgrade-Insecure-Requests: 1" \
  -H "User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:130.0) Gecko/20100101 Firefox/130.0" \
  "$BASE_URL/"

# Kontrola, zda soubor JS již existuje
if [ -f "$JS_FILE" ]; then
    echo "Soubor $JS_FILE již existuje, nestahuje se znovu."
else
    echo "Soubor $JS_FILE neexistuje, stahuje se nyní."

    # Získání hlavičky a status kódu pro kontrolu 303
    status_code=$(curl -I -s -b "$COOKIE_FILE" -o "$HEADERS_FILE_2" -w "%{http_code}" \
      -H "Accept: */*" \
      -H "Accept-Encoding: gzip, deflate, br, zstd" \
      -H "Accept-Language: cs,sk;q=0.8,en-US;q=0.5,en;q=0.3" \
      -H "Connection: keep-alive" \
      -H "DNT: 1" \
      -H "Host: 
$DOMAIN_2" \
      -H "Referer: $BASE_URL/" \
      -H "Sec-Fetch-Dest: script" \
      -H "Sec-Fetch-Mode: no-cors" \
      -H "Sec-Fetch-Site: cross-site" \
      -H "User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:130.0) Gecko/20100101 Firefox/130.0" \
      "$JS_URL")

    # Kontrola status kódu
    if [ "$status_code" -eq 303 ]; then
        echo "Přesměrování 303 - kontrolujte novou lokaci."
        # Případně můžete extrahovat hlavičku Location pro přesměrování
        new_location=$(grep -i "Location:" "$HEADERS_FILE_3" | awk '{print $2}')
        echo "Nová lokace je: $new_location"
        # Stáhnutí JS z nové lokace
        curl -s -b "$COOKIE_FILE" -o "$JS_FILE" "$new_location"
    else
        # Stáhnutí JS souboru, pokud není přesměrování
        curl -s -b "$COOKIE_FILE" -o "$JS_FILE" "$JS_URL"
        echo "JS soubor stažen do $JS_FILE"
    fi
fi

Parametr -s v příkazu curl znamená "silent mode" (tichý režim). Tento režim způsobí, že curl nebude zobrazovat žádné informace o průběhu stahování, jako je například ukazatel postupu, chyby nebo informace o připojení. Tento režim je užitečný, když chcete minimalizovat výstup příkazu curl, například když pracujete se skripty a potřebujete pouze data, nikoli průběžné informace.

V kontextu tvého kódu:

  • curl -s -c "$COOKIE_FILE" znamená, že curl stáhne data (v tichém režimu) a uloží cookies do souboru "$COOKIE_FILE".
  • curl -s -b "$COOKIE_FILE" znamená, že curl stáhne data (v tichém režimu) a při tom odešle cookies uložené v souboru "$COOKIE_FILE" na server.

Pokud chceš z curl dostat více informací pro ladění, můžeš vynechat parametr -s nebo použít -v (verbose) pro více podrobný výstup.

Parametr -I v příkazu curl znamená HEAD request. Tímto příkazem nepožaduješ kompletní obsah stránky nebo souboru, ale pouze hlavičky HTTP odpovědi.

V tomto kontextu:

  • curl -I pošle požadavek na server pouze pro získání hlaviček a ne stáhne celé tělo odpovědi.
  • -s je volba pro tichý režim, aby se nezobrazovaly průběžné zprávy nebo chyby.
  • -b "$COOKIE_FILE" znamená, že curl při odesílání požadavku pošle uložené cookies z tohoto souboru.
  • -o "$HEADERS_FILE" uloží hlavičky odpovědi do souboru.
  • -w "%{http_code}" vypíše status kód HTTP odpovědi (například 200, 303, atd.).

Tímto způsobem můžeš získat pouze hlavičky, včetně status kódu, který lze zkontrolovat pro případy jako je přesměrování (status kód 303).

 


Žádné komentáře:

Okomentovat

vvv

Štítky

.profile adm AI alfa transparence AND any aplikace asociativní pole atomicity audio awk bash benchmark bezpečnost biblehub BJT boolean buffering Cache-Conrol Cloudflare code Collector Cut-off colorpicker compare cookies css CSS3 curl cut čas data loss data lost data transfer reliability datasheet datetime.strptime development dioda diody EBO Emitter Cut-off Current ETag exclude exec Expires fflock fflush ffmpeg file read file write file_get_contents file_get_contents/file_put_contents file_put_contents filter find first_install.sh flock Fly-back dioda font-face fóra fotorezistor fread functions funkce fwrite gate gate drive geolokace gradient-background grep grub grub update hebrejština history hlavičky HS html html 5 https hudba charakterizace chroot ICES IGBT img sizes img srcset impedance implementace imshow inference inrush current install jalový výkon javascript javescript jednocení seznamů js kapacita součástek koeficient zesílení komunikace se serverem konfigurace Krita KSF Last-Modified lazy caching led LEFT JOIN librosa ligatury linux list log manuál masky matplotlib Max-Age measure memory měření MFCC MFCC koeficienty mint míry modules moralizace morphologie MOSFET mount moviepy mysql náběhový proud napěťová ochrana návod nel Network Error Logging NLP not nth-child oblékání ochrana okruhy přátel OpenVINO IR formát optočlen ořezové masky OSHB otázky otázky_jazyky otázky_moralismu_řešení parsování path personifikace photorec php php 4 php 5 php 6 php 7 php 8 phpbb phpBB3 pitch PN přechody pnp pole práva profilování program prune průraz přepěťová ochrana přepolování pseudokódd PWM regulátory pydub python python3 pytorch RBE RDSon read reaktance rectifier regulace vstupního napětí relyability replace restore reverzní geolokace RIGHT JOIN rm role rozvržení disků pro OS linux a data databází řešení samba sdílení Sec-Fetch-Dest Sec-Fetch-Mode Sec-Fetch-Site Sec-Fetch-User Secure Shell sed Set Cookie shunt schottka skript sloupce song sort soubory soundfile spínané zdroje spínání split SQL ssh stabilizace napětí stahování stream string strojové učení stropové učení syntax T5 tabulky tepelná ztráta test text-shadow thermal runaway time timestamp tkinter tr transistor transition tranzistor tranzistory tuple tvorba otázek TVS účiník update va charakteristika Vgs video Vth vynechání adresářů vývoj while wrapovací funkce XOR zdánlivý výkon zdroj zenerka zenerovo napětí zip zip archiv zkratky zpomalení zpracování textu Žalmy