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ůcurlimplicitně 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í jakogzip,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:
- 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.
- 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í:
První
curlpříkaz stáhne HTML stránku a uloží cookies do souborucookies.txt. Používáme různé hlavičky, jako napříkladAccept-EncodingaUser-Agent, aby komunikace vypadala jako běžný prohlížeč.Druhý
curlpříkaz stáhne JS soubor, ale tentokrát použije uložené cookies (-b "$COOKIE_FILE"). Zasíláme také hlavičkuReferer, která ukazuje, odkud byl požadavek odeslán (v tomto případě zzp....cz).
Proč jsou důležité odpovědi serveru?
- Cookies: Slouží pro udržení session nebo autentizaci uživatele. Například
PHPSESSIDudržuje stav session mezi požadavky. - Cache-Control: Ovládá cacheování. Hlavička
no-cacheznamená, ž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
PHPaASP.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á, žecurlstáhne data (v tichém režimu) a uloží cookies do souboru"$COOKIE_FILE".curl -s -b "$COOKIE_FILE"znamená, žecurlstá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 -Ipošle požadavek na server pouze pro získání hlaviček a ne stáhne celé tělo odpovědi.-sje 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říklad200,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