Objednává na Stravě z nenovějšího objedu oběd 2. Kód ještě není v úplně nejlepší formě, ale alespoň dělá to co má. Níže pak bude rychle popsané fungování a další potřebné inforamce.
Projekt migrován na strava.cobi.world. Více info naleznete tam. Tenhle projekt je zastaralý - nové verze naleznete na výše zmíněné doméně.
Program potřebuje k běhu splňovat následující podmínky:
-
Operační systém s Pythonem
- Program je napsaný v Pythonu, takže nemá moc velké požadavky, ale o tom více dole (Python, Info o Pythonu - jak si ho stáhnout, atd.)
-
32 nebo 64 bitový systém
- Jen píšu aby bylo jasné, že to funguje snad všude
-
150 kB volného místa
- 150 kB je 0.15 MB, je to málo, ale i tak je dobré vědět kolik to má
-
Na ram, cpu, nebo gpu to nemá žádné požadavky
- Můžete to zkusit stusti i na bramboře, je to Python takže třeba...
Vše se dozvíte ve souboru data/info.md, ale zde budou základní věci alespoň. Vše potřebné si najdete, nebo mi napište.
-
Obecně fungování
-
Fungování
- Kód má všechny potřebné soubory ve stejné složce (podsložce) jako je kód na objednávání samotný.
- Stačí spustit soubor gui.py a program vás navede co máte dělat.
- Konkrétně o objednávání jídel se dozvíte níže.
-
Setup
- Jakmile jste spustili kód, měl by se vám zobrazit setup.
- Zdali se vám program otevře do okna pro objednávání, znamená to že nejspíš byl setup vypnutý, pro více info přejděte na sekci o debugování.
- Zde je potřeba abyste zadali vaše údaje na stravu a pokračovali dále.
- Jako další krok je potřeba abyste si nastavili Chat GPT, jenže s tímto jsem měl menší problémy a Ještě to nefunguje, takže můžete Nastavování tady přeskočit.
- Po dokončení setupu by se měl kód otevřít na uživatelském rozhraní programu.
-
Uživatelské rozhraní
-
Okno, které vidíte má několik kateorií:
- Přehled
- Nastavení
- Chat GPT
- Rozšířené možnosti
-
Přepínat mezi nimi můžete pomocí stisknutí tlčítka pro danou kategorii *Momentálně nefunguje pro Linuxová zařízení.
-
Dané kategorie si více rozebereme níže:
- Přehled
Přehled slouží k zobrazení aktivity u objednávání. Vidíte zde běh programu, celkem objednáno obědů a poslední objednávku. Jakmile kliknete na text s časem do příští objednávky, tak by se vám měl čas resetovat a nový pokus o obědnání by měl hned proběhnout. Více info v data/info.md. - Nastavení
Je to nastavení, co byste čekali. Nastavte zde vše co potřebujete, upravte jméno, heslo**, vše potřebné. Po stistkutí uložit by vám mělo vyskočit oznámení, zdali chcete změny uplatnit už teď. Program si ze souboru na začátku načte pouze potřebné info pro start a zbytek si bere přímo ze souborů, které si znovu otevře, takže to minimálně ovlivní fungování a běh programu. Více věcí ohledně nastavování najdete v data/info.md. ** Při ukládání hesla máte na výbeř možnost šifrování hesla, slouží to pouze, aby při např ukázání souboru nebylo hned možné vidět heslo, protože klíč k dešifrování se nechází ve stejném souboru (případně bych chtěl do budoucna opravit) - Chat GPT
Chat GPT momentálně nefunguje a není nutné zadávat cokoli s ním spojeného. Do budoucna bych to chtěl přepracovat, upravit aby to fungovalo. Zatím si můžete vyplnit jaká jídla máte a nemáte rádi, to se nestratí. Zde je zbytečné cokoli říkat, až s updatem, který opraví Chat GPT - více v data/info.md. - Rozšířené možnosti
Naleznete zde pár věcí jak se dostat do programu, ne všechny ale fungují, jsou pouze experimentání a můžou i rozbít program. Radši bych nechal program ať si funguje jak je. Pro více info o rozšířených možnostech se dočete v sekci pro vývojáře.
- Přehled
-
Program má i sekci bez GUI, tedy jen s konzolí.
-
Když okno zavřete, měla by se vám ona zmíněná sekce otevřít - na výběr teď máte ze tří možností:
- Zmáčknete enter
- Po zmáčknutí entru by se vám mělo okno zpět otevřít.
- Program objednává a funguje na pozadí i bez okna.
- Více info o tomto v sekci pro vývojáře.
- Napíšete "res" a zmáčknete enter
- Tento příkaz restartuje kód.
- Res oficiálně ukončí daný proces který probíhá a uloží potřebné věci - není doporučené kód ukončovat jakýmkoli jiným způsobem - a znovu kód spustí.
- Pro více info se podívejte do sekce jak s programem nezacházet.
- Napíšete "exit" a zmáčknete enter
- Tento příkaz Ukončí běh kódu.
- Exit oficiálně ukončí daný Všechny potřebné procesy tak jak má a uloží potřebné inmformace.
- Pro více info se podívejte do sekce jak s programem nezacházet.
- Zmáčknete enter
-
Je možné, že když cokoliv nebude fungovat, že se více dozvíte v info.md, nebo v souboru debug.txt, případně mi napište.
-
-
Objednávání jídel
- Kód se každou stanovenou dobu přihlásí k vašemu školnímu účtu na stravě a pokusí se objednat stanovený oběd.
- Všechny možné nastavení najdete v sekci Nastavení v programu, nebo ve souboru data/settings.json.
- Chtěl jsem to ještě udělat, že to zůstane třeba den přihlášené, že se to nebude muset pokaždé přihlašovat, ale nevím jestli by to fungovalo.
- Objednávnání trvá jen chvilku, počkejte pár sekund a mělo by to být.
- Pozor: kód nespracovává chyby při objednávání moc dobře, takže když víte, že se něco pokazilo, tak zkontrolujte debug.txt
-
-
Fungování podrobně
-
Objednávání jídel Jídla kód objednává pomocí několika základních kroků:
- Získání dostupných objedů
- Nalezení posledního z nich
- Vybrání možnosti 1/2
- Provedení změn
- Uložení změn
Každý krok si při příští aktualizaci podrobně probereme, teď je to všechno.
- Více o fungování kódu a instrukce najdete v sekci pro vývojáře.
-
Zde bude něco málo pro toho, kdo si chce kód, upravit, opravit, aktualizovat, nebo cokoli s ním udělat. Nechce se mi to moc popisovat zjednodušeně, takže pokud umíte Python, dobře pro vás
-
Obecné informace
Něco málo co je potřeba, nebudu popisovat celý kód, to až případně dole. Připravuji funkce jako pluginy a několik dalších, něco málo o nich zde najdete.-
Error restartV1 is not defined
Error byl způsobován použitímrestartV1na bindování před definováním funkce. V novějších verzích jsem ten řádek odstranil. Byl to:label.bind("<Button-1>", restartV1)Na starších verzích jej také odstraňte jestli se chcete erroru zbavit, ale nemusí to 100% fungovat. -
Enkryptování hesla
Heslo enkryptuji pomocí knihovny 'crypthography'. Při ukládání do nastavení zkontroluje, jestli je encrypt_value1 nastavena na True. Jestli ano, tak pak to zašifruje pomocí:pwdd = Fernet(keyy).encrypt(password_value.encode()).decode()-> Vygeneruje to klíč, enkryptuje heslo, zapíše enkryptované heslo a klíč. Můžete předělat knihovnu pro enkryptování, musíte ji ale předělat na všech místech, jsou to: setup, ukládání nastavení a možná ještě někde. -
Nastavení proměn programu
Původně mělo sloužit k nastavení proměn když kód běží - to se hodí pro debugování, ale ještě jsem ji nepřidal. Později ji přídám, jestli si ji chcete vytvořit sami, klidně můžete, byl bych rád kdybyste mi poslali kód a já bych ji dal do příští verze
-
-
Vlákna
1vlákno: spustí funkci na obědnávání, poté časovač <- přičaosvači to zapíše za jak dlouho novy update jidel 2vlákno: Když klikneš na čaš spustí to vlákno1 znovu 3vlákno: gui < hlavní chod aplikace, není vlákno 4vlákno: Zapíše data do currentData.txt (vlákna, běží kód, posl obj, celkem obj, problémy) 5vlákno: Když se zavře 3vlákno spustí se toto a naslouchá na entru pro spuštění vlákna 3Každé vlákno má zvláštní přístup, musíte se podívat na požadavky pro ukončení vlákna, např. nastavení exit_event.set(). Případně sem přijde víc brzo.
-
Běh podrobně
Víc přijde brzo -
Instrukce
Nějaké info pro implementaci různých prvků-
Pluginy
Do budoucna bych chtěl přidat možnost instralování pluginů. Každý plugin bude ve složce plugins/<název_pluginu>. Bude to jak Python knihovny - bude obsahovat soubor init.py. V něm budou buď importovány, či definovány tři třídy: help, main a run- Třída main dostane parametry pro okno, aby vytvořila toplevel a zde mohou být nastavení pluginy a další možnosti.
- Třída help vrátí textou pomoc, která bude zobrazena v okně.
- Třída run by měla spustit main.run, nebo main.stop, jako argument dostane inicializovanou třídu. Bude zodpovědná za běh pluginu.
V kódě bude pluginu několik dostupných míst, které budou používatelné a se kterýma bude kód moct manipulovat. Více až s updatem
-
-
Objednávání
Níže je podrobně popsán proces objednávání.Stavba požadavků
Každý požadavek má zvláštní přístup, zde je popsán:-
Vytvoříme data požadavku
Data jsou ve slovníku, např.:data = {"cislo": cislo_jidelny, "jmeno":jmeno, "heslo":heslo, "zustatPrihlasen":False, "lang":"CZ"}Tato data převedeme do json formátu pomocí:json_data = json.dumps(data)Poté vytvoříme hlavičku požadavku:{'Content-Type': 'text/plain'}To je z dat vše. -
Nastavování požadavku
Vytvoříme obsah funkcerequests.post()následovně:'https://app.strava.cz/api/login', data=json_data, headers={'Content-Type': 'text/plain'}Složíme spolu vše co je potřeba a dáme to do funkce, takže nakonec to bude vypadat:requests.post('https://app.strava.cz/api/login', data=json_data, headers={'Content-Type': 'text/plain'})Tím jsme vytvořili požadavek, který se odešle. -
Získávání odpovědi
Po odeslání požadavku jej zpracujeme pomocí:odpoved_slovnik = json.loads(odpoved.text)odpoved je odpověď z požadavku a pomocí "json" knihovny převedeme stringová data, která jsme přijali do Python slovníku. S tím pak dále pracujeme
Objednávání pořadě
-
Přihlášení
Pomocí řádkurequests.post('https://app.strava.cz/api/login', data=json_data, headers={'Content-Type': 'text/plain'})odešleme požadavek na přihlášení. Jesli jsou údaje špatné (status kód != 200) napíšeme upozornění. (Od verze 0.9) Přebereme odpověď a uložíme z ní potřebná data. -
Nastavení potřebných věcí
Netuším proč to tam mají, ale je to potřeba. Požadavek vypadá jako:requests.post('https://app.strava.cz/api/coder', data=json_data, headers={'Content-Type': 'text/plain'})Ani nezpracováváme odpověď. -
Načtení dostupných objedů
Načítáme dostupné obědy, ale jako provní složíme požadavek:data = {'cislo': cislo, "sid":sid, "s5url":s5url, "konto":konto, "podminka":podminka, "ignoreCert":ignoreCert, "resetTables":resetTables, "lang":"CZ"}Pakjson_data = json.dumps(data)A nakonec jej sestavíme a odešlemerequests.post('https://app.strava.cz/api/objednavky', data=json_data, headers={'Content-Type': 'text/plain'})Poté objednávky přebereme, najdeme poslední oběd a jeho větu a upravíme podle toho, jestli chcete 1, nebo 2. Nakonec nastavíme lo (last order) na název tohoto obědu. -
Objednání jídla
Na server pošleme naši volbu, jako vždy první sestavíme požadavek:odpoved = requests.post('https://app.strava.cz/api/pridejJidloS5', data=json_data, headers={'Content-Type': 'text/plain'})Pak pomocí json knihovnyjson_data = json.dumps(data)A nakonec odešlemeodpoved = requests.post('https://app.strava.cz/api/pridejJidloS5', data=json_data, headers={'Content-Type': 'text/plain'})To je vše, ani odpověď nespracováváme. Na serveru by měla být na volba uložena, jen je potřeba ji potvrďit. -
Konečné ukládání
Jinak jsem to nazval potvrzovaní v předchozím kroku. Tak zase jako vždy:data = {'cislo': cislo, "sid":sid, "url":url, "xml":None, "pocet":1, "ignoreCert":ignoreCert, "lang":"CZ"}Dumpnemejson_data = json.dumps(data)A nakonec odešlemeodpoved = requests.post('https://app.strava.cz/api/saveOrders', data=json_data, headers={'Content-Type': 'text/plain'}) -
Čekání
Nakonec nám zbývá už jen počkat...for i in range(orderUpdateInterval): if not exit_event.is_set(): time.sleep(1) waited = waited + 1
-
- Info k debugování.
- Tento seznam nemusí obsahovat vše, kdyžtak mi napište a já se to pokusím vyřešit
-
Debugování při startu:
- Když vám nefunguje setup, nebo program nejde spustit.
- Podrobněji v data/info.md.
-
Setup
- Když se vám kód při prvním spuštění nezapne do setup módu udělejte následující kroky:
- Otevřete soubor data/config.json
- V souboru data/config.json najďete sekci "data"
- V ní přepněte setup z false na true
- Uložte soubor a spusťte program znovu
- Je možné, že nastala chyba při setupu, např. že se vám heslo nezašifruje, pak postupujte podle těchto kroků:
- Zkontrolujte debug.txt
- Podle infomací přejděte do data/info.md
- V sekci debugging by měla být odpověď
- Jestli nemáte řešení tam mi napište
- Když se vám kód při prvním spuštění nezapne do setup módu udělejte následující kroky:
-
Problémy se spouštěním
- Je možné, že program nelze sputit, tak zkontrolujte:
- Soubor data/debug.txt - v něm uvidíte důvod
- Jestli máte stažené všechny knihovny
- Podívejte se do souboru gui.py a zkontorujte, zda-li jsou všehcny knihovny přístupné.
- Příkazy níže napište do příkazového řádku vašeho počítače.
- Jestli vám nějaká chybí, použijte příkaz
pip install <název knihovny> - Aktualizujte knihovny pomocí příkazu
pip install --upgrade <název knihovny> - Zkontrolujte danou knihovnu pomocí příkazu
pip show <název knihovny> - Více info o pip najdete na stránkách PyPi
- Že je Python správně nainstalovan a případně další faktory, které mohou způsobovat chybu
- Je možné, že program nelze sputit, tak zkontrolujte:
-
Přepínání "scén"
- Scény považuji možnosti jako je Nastavení, Chat GPT, Rozšířené Možnosti a přehled.
- Je možné, že mezi scény nelze přepínat, s tím zatím nic neuděláte, to musím já opravit.
- Na Linuxech to fungovat nemusí, když si najdete jak to opravit, můžete, ale časem to opravím oficiálně.
-
Další chyby
- Jedna důležitá rada: vše najdete v data/info.md.
- Jesli ne, tak mi napište, já s něčím přijdu.
-
Program bez GUI
- Zda-li vám nefunguje kód zodpovědný za objednávání mimo GUI, můžete se to pokusit vyřešit nastavováním různých věcí, kód bych nechal tak jak je, protože mně to funguje.
- V data/info.md je více info kdyby bylo potřeba.
- Je možné, že nastane chyba, která shodí celý program, která může nastat kdykoli a kdekoli, ale když běží více vláken najednou, tak chyba v jednom z nich neukončí celý program, ostatní vlákan tomu brání. Více info v sekci pro vývojáře.
-
Vypínání a restartování:
- Program má pro vypínání a restartování několik způsobů.
- Je potřeba aby se uložily informace, které má program jen aktuálně a mohly by být potřeba při příštím zpuštění.
- Vypínání
- Pro vypnutí udělejte následující kroky:
- Zvřete GUI okno
- Vepiště do konzole exit (nebo odejít)
- Stiskněte enter a chvíli počkejte
- Jakýkoli jiný způsob by mohl ztratit nějaké důležité informace.
- Ačkoli by to až tak moc nevadilo, je to spíše funkce do budoucna.
- Pro vypnutí udělejte následující kroky:
- Restartování
- Program někdy potřebuje restartovat, tak je tu možnost jak to udělat rychleji.
- Je zde pár způsobů, prvním z nich je:
- Zavřete GUI okno
- Vepište do konzole "res", nebo "obnovit"
- Potvrďte zmáčknutím entru
- Další způsoby zde stále existují, ale není potřeba je znát.
- Další možnosti
- Dřive byla možnost vstoupt do tzv. "cmd módu", jenže tato možnost je od verze 0.87 odebrána.
- Stále je možné z kódu vyvolat funkci pro ukončení programu.
-
Správa vláken
- Do tohoto se nechci moc motat, vše info o vláknech najdete v sekci pro vývojáře, nebo v souboru data/info.md.
- Pokud nemusíte, tak nechte program si určit jaká vlákna potřebuje použít sám.
- Pokud se ale rozhodnete zkusit jak vlákna fungují, nedoporučujeme vlákno ukončit uprostřed nějakého většího procesu - mohlo by to vést ke chybám.
- Dávejte si pozor, abyste nespustili 5. vlákno pokud nemusíte, můžou se pak otevřít 2 okna, chci to takhle nechat, protože občas se to hodí, ale někdy to může způsobit problémy.
-
Všeobecné poznámky:
- Není doporučené kód ukončovat jakýmkoli jiným způsobem než zavřením GUI okna a vepsáním "exit" do konzole. Pro více info se podívejte do sekce jak s programem nezacházet.
- Verze: cislo; A -> Alfa; a -> verze a; + -> nedokončená verze, rozšíření napsané verze, ale nedokončené; může být i třeba: 1.0Ba+
- V souboru data/settings.json je sekce pro odesílání mailu když nastane daná situace, ale potřebuje to hodně práce s knihovnami pro maily a zároveň to má vysoké požadavky na mail, takže to snad ani přidávat nebudu.
- Momentálně si program musíte aktualizovat sami z githubu, ale časem bych chtěl přidat klienta pro aktualizace
- V souboru data/currentData.txt jsou uloženy inforamce jako: kolik zbývá do další objednávky, poslední objednávka, atd. - i když tam něco upravíte, program si určité věci přepíše zpět.
- Pozor: v souoru data/config.json nastavujte showErrorOnDebug na true pouze když víte, že potřebujete upozornit na zápis do debug.txt - jindy to zastaví běz vlákna 3 a můžou nastat potíže
-
Doporučení
- Poté co si stáhnete složku, doporučuji, ať si ji přejmenujete, protože kód se sám aktualizuje, tak verze se nemusí shodovat