Okno terminálu s vizualizáciou nákupného košíka
Logo andrejkostal.sk

17. 3. 2026

6 min čítania

Postavil som si CLI, ktoré za mňa nakupuje na Alze

Každý mesiac objednávam na Alze to isté. Kávové kapsuly, prací prášok, drogériu. Nič vzrušujúce, nič, pri čom by som potreboval listovať ponukou. Stále tie isté produkty, ten istý checkout, ten istý AlzaBox. Otvoriť web, vyhľadať, preklikať sa piatimi stránkami, potvrdiť. A o mesiac znova.

Pri pravidelných nákupoch nechcem nakupovať. Chcem, aby sa nakúpilo.

Tak som postavil CLI, cez ktoré môj AI asistent vyhľadá tovar na Alze, porovná možnosti a pripraví objednávku. Ja potvrdím a je hotovo.

Ako to vyzerá v praxi

Celý priebeh, od hľadania po objednávku:

$ alza search "nespresso capsules" -n 5

1. [5765432] Nespresso Vertuo Pop Barista Variety Pack
   Price: 5,49 € | In stock
2. [5834521] Starbucks by Nespresso Blonde Espresso Roast
   Price: 4,29 € | In stock
3. [5612098] Nespresso Original Ispirazione Roma
   Price: 3,99 € | In stock
...

Pred rozhodnutím si pozriem detaily a recenzie:

$ alza product 5612098

[5612098] Nespresso Original Ispirazione Roma
Price: 3,99 €
Rating: ★★★★½ 4.6/5 (238 ratings, 45 reviews)
  92% recommend | 1200+ sold
Availability: In stock

Parameters:
  Capsule type: Nespresso Original
  Intensity: 8/13
  Quantity: 10 pcs

Potom produkt buď pridám do košíka a idem klasickým checkoutom, alebo použijem QuickBuy, objednávku na jedno kliknutie:

$ alza quickbuy 5612098 --quote

⏳ Creating price quote...

╔═══════════════════════════════════════════════╗
║  ✅ QUOTE CREATED                             ║
╠═══════════════════════════════════════════════╣
║  Total:     3,99 €                            ║
╚═══════════════════════════════════════════════╝

QuickBuy preskočí košík aj celý checkout. Objednávku vytvorí rovno s uloženou platobnou kartou a vaším preferovaným AlzaBoxom. Jeden príkaz a objednávka je odoslaná. Prepínač --quote ukáže len cenu, nič neobjedná. Ak ho vynecháte a potvrdíte cez -y, z karty sa stiahnu peniaze.

Agent nikdy nezadá objednávku naslepo. Najprv vždy vytvorí ponuku (quote), ukáže presný produkt, cenu a spôsob doručenia a počká na moje výslovné potvrdenie. Ak hľadanie vráti viac podobných produktov, zastaví sa a opýta sa, ktorý myslím. Nejde o plnú autonómiu. Ide o to, aby som nemusel robiť nudnú časť.

Prečo CLI a nie automatizácia prehliadača

Najprv som skúsil automatizáciu prehliadača. Fungovala, ale bola to zlá abstrakcia.

Prehliadačoví agenti (nástroje, ktoré v skutočnom prehliadači preklikávajú weby) sú univerzálni: fungujú na akomkoľvek webe. Sú ale pomalí, krehkí pri zmene UI a ťažko sa kontrolujú. Pozeráte, ako robot kliká po tlačidlách, a dúfate, že trafí tie správne. Keď sa UI zmení, automatizácia sa pokazí zvláštnym spôsobom, ktorý sa ťažko ladí.

Vlastné CLI komunikuje priamo s API na backende. Je rýchlejšie, predvídateľné a každý krok sa dá dohľadať. Keď sa niečo pokazí, pokazí sa nahlas: API vráti chybu, nie screenshot nesprávnej stránky.

Cenou je rozsah. Prehliadačový agent zvládne akýkoľvek e-shop. Moje CLI funguje len na Alze. Pri pravidelných nákupoch v jednom obchode sa to oplatí.

Ako to funguje pod kapotou

Alza nemá verejné API. Všetko v tomto nástroji som zistil spätnou analýzou sieťovej komunikácie prehliadača: otvoril som Chrome DevTools, prešiel nákupným procesom a zmapoval endpointy.

Skutočnou prekážkou bol Cloudflare. Bežní HTTP klienti sa k API Alzy vôbec nedostali. Nakoniec som použil knižnicu v Go na TLS fingerprinting, ktorá napodobňuje TLS handshake Chromu dosť verne na to, aby kontrolou prešla.

Prihlásenie sa viezie na vašej existujúcej session v Chrome. Do Alzy sa normálne prihlásite v prehliadači, CLI prečíta session cookies, vymení ich za krátkodobý API token a s ním robí samotné volania. Token vyprší približne po 90 minútach, ale CLI ho samo na pozadí obnoví. CLI si od vás nikdy nepýta heslo. Používa len krátkodobé tokeny odvodené z vašej session v prehliadači.

Vrstva AI agenta

Samotné CLI len zabezpečuje komunikáciu s Alzou. Zaujímavé je to, čo je nad ním.

Používam ho cez chat s AI asistentom, ktorý má CLI k dispozícii ako nástroj. Keď napíšem „objednaj kávové kapsuly, tie moje obvyklé“, asistent:

  1. Pozrie históriu objednávok (alza orders --query "nespresso")
  2. Nájde produkt, ktorý zvyčajne kupujem
  3. Spustí alza quickbuy <id> --quote a zistí aktuálnu cenu
  4. Požiada ma o potvrdenie
  5. Odošle objednávku

Pri nových produktoch hľadá, porovnáva hodnotenia a ceny a predloží mi možnosti. Agent urobí prieskum, posledné slovo mám ja.

Tu CLI jasne vyhráva nad automatizáciou prehliadača. Agent môže rýchlo za sebou volať alza search, alza product a alza reviews a spracúvať štruktúrovaný JSON. Žiadne čakanie na vykreslenie stránok, žiadne vyskakovacie okná, žiadne súhlasy s cookies.

# Agent's actual flow (JSON mode for structured parsing)
alza orders --query "detergent" --format=json
alza search "persil washing powder" -n 5 --format=json
alza product 7816725 --format=json
alza reviews 7816725 --stats --format=json
alza quickbuy 7816725 --quote --format=json
# ... waits for my confirmation ...
alza quickbuy 7816725 -y --no-coupon

Čo som sa pri stavbe naučil

Reverse engineering je z princípu krehký. Alza môže API kedykoľvek zmeniť a všetko sa pokazí. V praxi sa API na backende mení oveľa menej často ako UI. Používam to od konca roka 2025 a hlavné endpointy sa nezmenili. Keď sa zmenia, nástroj sa pokazí nahlas: jasná chybová hláška, nie tichý výpadok.

E-shopy automatizáciu naozaj nechcú. Ochrana Cloudflare, rotácia tokenov, fingerprinting - nie náhodou to vyžaduje TLS fingerprinting a vyťahovanie cookies namiesto obyčajných HTTP požiadaviek. Je to pevne v šedej zóne: technicky možné, oficiálne nepodporované.

Najťažší je checkout. Vyhľadávanie a detaily produktu sa zmapovali ľahko. Pri zadaní objednávky (QuickBuy) som musel zmapovať vyše 30 polí v tele požiadavky, z ktorých mnohé vyzerajú bezvýznamne, no bez nich požiadavka neprejde. Polia ako IsTretinka, IsBusinessCardSelected, ShowPaymentCards - všetky nastavené na konkrétne hodnoty podľa toho, čo posiela prehliadač.

Nástroje pre agentov potrebujú výstup v JSON. Prepínač --format=json som spočiatku pridal len tak mimochodom, no ukázalo sa, že je nevyhnutný. AI agenti spoľahlivo čítajú JSON. S formátovaným výstupom z terminálu majú problém. Každý príkaz preto podporuje čitateľný aj strojový výstup. Čitateľný je pre mňa, JSON pre agenta. Odkedy mám štruktúrovaný výstup pri každom príkaze, nástroj prestal pôsobiť ako terminálový hack a začal pôsobiť ako infraštruktúra.

Rutinný nákup nepotrebuje web

Táto stavba ma presvedčila o jednoduchej veci: pri rutinných nákupoch je web často nesprávne rozhranie.

Existuje kategória nákupov, kde je klasické prehliadanie a klikanie len zbytočná réžia: opakované komoditné položky, pri ktorých rozhoduje cena, dostupnosť a doterajšia spokojnosť, nie objavovanie. K praciemu prášku nepotrebujete produktové fotky. Nepotrebujete scrollovať odporúčania. Potrebujete to, čo kupujete vždy, za dobrú cenu a doručené na obvyklé miesto.

Časť rutinných nákupov už vybavujem cez chat. Znie to futuristicky, kým to človek nevyskúša. Medzi „potrebujem kávové kapsuly“ a „zajtra ich máte v AlzaBoxe“ naozaj nemusí byť 15 klikov.

Samozrejme, nie na všetko. Keď kupujem slúchadlá alebo darček, chcem prehliadať, porovnávať a podrobne čítať recenzie. Ale pri veľkej časti nákupov, ktoré sú naozaj rutinné? Veta v chate je lepšie rozhranie než web.

Vzory, ktoré sa dajú použiť aj mimo Alzy

Aj keď Alzu nikdy nepoužijete, tri vzory z tohto projektu sa hodia všade:

  1. Ak sa dá, používajte API namiesto automatizácie prehliadača. Priame volania API sú rýchlejšie, spoľahlivejšie a agentom sa s nimi pracuje ľahšie. Automatizácia prehliadača je záloha, nie východisková voľba.
  2. Výstup nástroja navrhnite pre ľudí aj pre agentov. Každý príkaz by mal mať čitateľný predvolený výstup a režim --format=json. Pridať ho je lacné a výrazne to rozšíri, čo všetko môže nástroj používať.
  3. Akcie, ktoré sa nedajú vrátiť, dajte za potvrdenie cez quote. Každý nástroj, ktorý míňa peniaze alebo robí nezvratné zmeny, by mal mať dry-run alebo quote režim. Agent si tak pred vykonaním pozrie, čo sa stane.

Vyskúšajte si to

Kód je open source: github.com/kuringer/alza-cli

Upozorňujem: je to hobby projekt postavený na môj konkrétny postup. Funguje len s Alza.sk (Slovensko), na prihlásenie potrebuje Chrome a môže sa pokaziť, keď Alza zmení backend. Vzory v ňom sú ale použiteľné ďaleko za hranicami Alzy.

Ak vás zaujíma, ako agentský nákup funguje v praxi - nie ako prezentácia o koncepte, ale ako reálne bežiaci kód - možno stojí za pohľad.

Ak ste podobný nástroj postavili pre iný e-shop alebo uvažujete o nákupoch cez agentov z pohľadu predajcu, rád sa o tom dozviem. Napíšte mi na hi@andrejkostal.sk.