GDPR Broker Bot
Lokální GDPR agent, který mapuje, kdo drží moje data — a systematicky vymáhá přístup, výmaz a důkazy pro stížnost
O co jde?
Problém: Existují stovky data brokerů — firem, které tiše sbírají, agregují a přeprodávají osobní data. Nikde neexistuje seznam „kdo má zrovna ta moje". Ručně obeslat desítky firem, hlídat zákonné lhůty a vést si přehled je práce na týdny — kterou nikdo neudělá.
Řešení: Lokální Python agent, který tu otravnou práci dělá za mě. Rozesílá GDPR žádosti o přístup (čl. 15) a výmaz (čl. 17), čte příchozí odpovědi, hlídá 30denní lhůty, počítá u každého brokera skóre rizika a u mlčících složí důkazní balíček pro stížnost na ÚOOÚ. A co je nejlepší — z odpovědí sám zjišťuje, komu broker data prodal dál.
Princip (access-first): Žádost podle čl. 15 není dotaz „prosím", je to páka — správce musí přiznat, odkud data má (zdroj) a komu je předal (příjemci). Proto bot u sběračů dat posílá nejdřív jen přístup a o výmaz požádá až když firma potvrdí, že data drží — jinak by smazala dřív, než stihne přiznat, kudy data tečou. Nejdřív zmapovat, pak uklízet.
v hledáčku
v terénu
čistá stdlib
hlídá ji bot
Jak to funguje
Od žádosti po eskalaci — a zpátky k novým cílům
Co bot umí
Celá smyčka od žádosti po stížnost
Žádosti čl. 15 → 17 (access-first)
U sběračů dat pošle nejdřív jen přístup (jaká data máte, odkud a komu jste je dali) a o výmaz požádá až po potvrzení, že data drží — ať nesmažou důkazy dřív, než přiznají příjemce. U klíčových brokerů ručně psané dopisy, jinak univerzální šablona.
Approval gate
Bot nikdy nepošle nic naslepo. Připraví dávku, pošle její souhrn do Telegramu a čeká na moje „ANO". Teprve pak odesílá. Mám tak vždy poslední slovo nad tím, co odejde mým jménem.
Čte odpovědi
IMAP stahuje poštu, páruje ji k žádosti podle Message-ID a klasifikuje: potvrzení, věcná odpověď, nebo nedoručení (bounce). Když broker odpoví na osobní mail, stačí zprávu přeposlat — bot ji podle obsahu sám spáruje. Bounce i potvrzení hlásí do Telegramu.
Řetězení příjemců
Tady nastupuje Claude. Sonnet přečte odpověď a vytáhne, komu broker data předal. Každou přiznanou firmu bot sám přidá jako nový cíl ke schválení — síť žádostí se tak rozrůstá bez mého zásahu.
Hlídá lhůty
Správce má na odpověď 30 dní. Bot u každé žádosti počítá deadline, a když vyprší bez věcné odpovědi, označí ji jako po lhůtě a připraví urgenci (follow-up). Potvrzení „máme to" lhůtu nezastaví.
Eskalace na ÚOOÚ
Když broker mlčí i po urgenci, bot připraví draft stížnosti na Úřad pro ochranu osobních údajů. Tenhle krok ale zůstává výhradně ruční — žádná stížnost neodejde automaticky.
Report „kdo drží data"
Z databáze sestaví přehled — kdo odpověděl, kdo přiznal, že data má, komu je prodal a kdo mlčí. Generuje ho ve dvou verzích: veřejnou (bez osobních údajů, pro web/článek) a soukromou (kompletní audit s identitou a úryvky).
Skóre rizika
Každému brokerovi spočítá skóre 0–100 (🔴 / 🟠 / 🟢) z toho, jak se chová: drží data, prodal je dál a kolika příjemcům, ignoruje lhůtu, odmítl, nebo jen automaticky potvrdil příjem. Hned vidím, na koho se zaměřit první.
Důkazní balíček pro ÚOOÚ
Pro každého brokera umí vyexportovat spis — timeline žádostí, Message-ID, data a lhůty, doslovné citace z odpovědí, AI rozbor a shrnutí porušení. Hotový podklad pod stížnost, ne ruční dolování z mailů.
Redakce před AI
Než kus odpovědi pošle Claudovi, nahradí v něm moje známé údaje
(mail, jméno, telefon, adresa…) značkami jako [EMAIL]. Claude tak vidí jen to,
co potřebuje k vytažení příjemců — moje identita do API neodchází.
Běží sám přes cron
Každé ráno stáhne odpovědi, vyřetězí nové příjemce a aktualizuje report. V pondělí navíc zkontroluje lhůty a připraví follow-upy. Já jen otevřu Telegram a schválím, co má odejít.
Síť, která se rozrůstá sama
Nejchytřejší část — a jediná, kde hraje roli AI
Neexistuje master-seznam „kdo má moje data". Klíčový trik je proto v tom, že GDPR nutí každého správce přiznat své příjemce — komu data předal nebo prodal. A přesně tohle bot využívá k tomu, aby se sám rozrůstal:
„Vaše data jsme získali od firmy A a předali jsme je firmám B a C." Přesně to po něm čl. 15 vyžaduje.
Sonnet přečte volný text odpovědi a vrátí strukturovaný seznam: zdroj, příjemci, jestli firma data drží. Žádné ruční čtení desítek mailů.
Firmy B a C se samy přidají jako nové cíle (ke schválení) a do Telegramu přijde upozornění. Příští dávka jde i na ně.
Je to jediná část celého bota, která sahá na AI — a běží na mém vlastním Anthropic klíči. A i sem jde jen redigovaný text odpovědi: moje známé údaje bot předem nahradí značkami, takže Claude vidí jen příjemce a zdroj. Zbytek (odesílání, párování, lhůty, skóre, důkazy) je čistá Python logika, která jede zadarmo.
„data jsme získali od A,
předali firmám B, C"
Sonnet › { zdroj: A,
příjemci: [B, C] }
+ 2 noví brokeři → fronta
Telegram › „přibyli B, C"
Stack & Tech
Jádro bota
- Python 3.12 — jen stdlib
- smtplib · imaplib · sqlite3
- Žádné
pip install - Vlastní mini
.envloader
E-mail vrstva
- Samostatná schránka jen na GDPR
- SMTP — odesílání žádostí
- IMAP — čtení odpovědí
- Párování přes Message-ID
- Detekce bounce i potvrzení
AI vrstva
- Claude Sonnet — řetězení
- Structured output (příjemci)
- Redakce PII před odesláním
- Můj vlastní Anthropic klíč
- Jediné místo, kde běží AI
Provoz & data
- SQLite — brokeři, žádosti, lhůty
- Cron — denně + pondělní kontrola
- Telegram approval gate
- Skóre rizika + důkazní spisy
- Public + private report
Co jsem se naučil
Co bylo nejtěžší a co bych dnes udělal jinak
B2B brokeři párují data podle profesní identity, ne osobního e-mailu — proto osobní žádost často vrátí „o vás nic nemáme", i když data mají. Někteří chtějí prokázat identitu přes portál (LinkedIn, pracovní mail, telefon). Kompromis: dávám jen veřejný LinkedIn odkaz, ale pracovní mail ani telefon brokerovi nerozdávám — to by jim jen prozradilo další vazbu.
Původně bot posílal přístup i výmaz najednou. Lekce z provozu: firma, která data nedrží (nebo je nechce přiznat), klidně „smaže" a zmizí dřív, než řekne, komu je prodala. Proto teď jede access-first — výmaz až po potvrzení, že data drží. Mapa toku dat je cennější než rychlý úklid.
První verze klasifikovala odpovědi heuristikou („obsahuje slovo X → má data") a pletla se — několik mailů označila špatně. Claude (Sonnet) na strukturovanou extrakci je výrazně přesnější; jednoduchá pravidla zůstala jen jako záloha, když AI není po ruce.
Soukromí a bezpečnost
Bot běží čistě lokálně na mém home serveru. Všechna data — seznam brokerů, odeslané žádosti i jejich odpovědi — jsou v lokální SQLite databázi u mě doma. Přihlašovací údaje (e-mail, klíče, token) jsou mimo verzování a nikdy se nedostanou do gitu. Do Claude API putuje jen redigovaný text odpovědí brokerů kvůli vytažení příjemců — moje známé údaje jsou předtím nahrazené značkami. A protože jde o vymáhání mých vlastních práv, posílá bot ven jen to, co podle GDPR sám smím žádat. Tahle stránka popisuje, jak je bot postavený — žádné konkrétní osobní údaje ani seznam firem tu nenajdeš.
Pro celou komunikaci jsem navíc založil úplně samostatnou e-mailovou schránku určenou jen pro tyhle GDPR žádosti. Veškerá pošta s brokery (odeslané žádosti, odpovědi, bounce, urgence) tak teče přes ni — moje osobní schránka zůstává čistá a nepřijdou mi do ní desítky automatických odpovědí. Zároveň mám korespondenci pěkně pohromadě na jednom místě, kdyby došlo na stížnost k ÚOOÚ.