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í 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í
curl
příkaz stáhne HTML stránku a uloží cookies do souborucookies.txt
. Používáme různé hlavičky, jako napříkladAccept-Encoding
aUser-Agent
, aby komunikace vypadala jako běžný prohlížeč.Druhý
curl
pří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
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
aASP.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á, žecurl
stáhne data (v tichém režimu) a uloží cookies do souboru"$COOKIE_FILE"
.curl -s -b "$COOKIE_FILE"
znamená, žecurl
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ří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