Automatická detekce volného místa v autobusech na lince Liberec - Praha
19. 4. 2009 23:06
12.3.2010: Viz Oskarův komentář, prográmek je opět pravděpodobně nefunkční na rezervaci pro SA.
Prográmek řeší automatické ohlášení volného místa na lince Liberec-Praha provozované
- Dopravní podnik města Liberce, a.s.
- na adrese http://dpml.rezervace-bus.cz/
- STUDENT AGENCY s.r.o.
- na adrese http://www.studentagency.cz/express/vnitro/
Modelová situace, zapomenete se rezervovat do autobusu a po chvíli je už všude plno. Občas se ale někdo odhlásí. Zjistit to, že se někdo odhlásil je komplikované a znamená to sledovat několik stránek pořád dokola nebo si nainstalovat rozšíření do Firefoxu ReloadEvery.
- Existuje ale jiné řešení (CLI verze pro Linux)
- Download: bus-004.tar.gz
- Screenshot: sa.png
- Konkurenční program ;) (verze pro .NET/Mono)
- Program s podobnou ideou, ale mnohokrát vylepšený naleznete na stránkách Matěje Finwë Humpála.
- Rozšíření pro firefox (Add-on) (multiplatformní)
- Zatím nedotáhnuté, musím ještě dodělat to hlavní, hldání spoje. Jednoduchá rezervace autobusu student agency
Moje řešení
Moje řešení jde ale jiným směrem. Když chcete sledovat určitý spoj, stačí si zjistit jeho ID a pak říct mému scriptu, aby to pohlídal. Jde pouze o upozornění na volné místo, takže rezervaci musíte provést osobně, ale i tak, je to docela dobrá pomůcka.
Jak zjistit ID
Přejděte na stránku pro den, který chcete sledovat a klikněte na lupičku u nejbližšího spoje. Otevře se nová stránka a v adresním řádku má napsané na konci číslo, které je právě ID spoje. Pokud u vašeho vybraného spoje lupička není, stačí ji tipnout z jiného ID spoje nad požadovaným. Je větší jen o 1.
Najděte tedy pokusně požadovanou stránku vašeho spoje a zapamatujte si její ID.
Jak používat program
Program je napsán v jazyce PHP, protože je to jediný jazyk na scriptování, který ovládám. Určitě by to bylo možné napsat v nějakém vhodnějším jazyku, ale perl, python, bash, ruby ani nic jiného se kuli tomu nechci učit.
Program se spoučtí z příkazová řádky a pokud si ho dáte do adresáře, který je v PATH, pak stačí spouštět jen jako
$ sa 54700
Je možné uvést i více sledovaných spojů
$ sa 54700 54701 54702 54703
Omezení programu
Program kontroluje všechny zadané spoje každých 20 vteřin. Pokud je ve spoji místo, tak se také pokaždé ukáže bublina s oznámením volného místa. Je proto vhodné sledovat jen zcela zaplněné autobusy.
Program vyžaduje spouštění na Linuxu s fungujícím
notification-daemon, který právě dělá ty bubliny. Pro gentoo
to znamená závislosti na x11-libs/libnotify a
`>=dev-lang/php-5. Asi k tomu vytvořím ebuild, aby se to dalo jednoduše
nastavit.
Pro php plati ještě jeden požadavek. Zatím se stránka stahuje pomocí
volání funkce fopen, takže musí být v
/etc/php/cli-php5/php.ini zapnuta direktiva
allow_url_fopen=On.
Changelog
bus-004 – 14.10.2009
- Přidána podpora pro cURL (by Oscar), program si sám zjistí, jestli je
cURL dostupné (pro gentoo je tedy potřeba
USE=curl emerge php, pro debian a odvozenéapt-get install php5-curl)
bus-003 – 19.4.2009
- Doplněna podpora pro autobusy Liberec Praha od DPML. Autobusy se zadávají
jako „d<id>“, tedy
./bus d135 - Opravena chyba zpracovávání posilových autobusů u Student Agency
sa-002 – 22.3.2009
- Přepracováno kvůli změne webu student agency
- Přidána podpora pro všechny vnitrostátní linky student agency (ID linek se vzájemně nepřekrývají)
sa-001 – 16.3.2008
- první verze programu
- sledování linky Liberec – Praha
TODO
Sledování jestli je v autobuse místo je až ta krajní možnost. Někdy se hodí, že máte sice místo, ale například na sedadle 59 a chcete ho na sedadle menším než 16. Další možností je, že sedíte u okénka a chcete do uličky, nebo jste v posile a chcete do regulérního autobusu. Toto zatím program neumí, ale až budou vznikat podobné požadavky, jistě to do programu dopíšu.
Ahoj, přihřeju si polívčičku a prozradím, že verze SA Notify 1.7 podporující nový rezervační systém je venku :)
Taky koukám jak puk na kontrolu linek DPML a hlavně to rozšíření do Firefoxu, to jestli někdy dotahneš do konce, budu bez práce zase já :)
Ahoj, pokud se chceš vyhnout nutnosti nastavovat URL fopen wrapper, který navíc v další verzi PHP už nemá být, vygooglil jsem na to jednoduchou funkci, která využívá curl:
function curlGet($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, „BezAgentaToHlasiError/403“);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
return curl_exec($ch); }
Tak nám zase (potřetí) změnili web. Nový systém je výrazně propracovanější a tím i složitější na ovládání z hlediska uživatele. Navíc nějak donutí Firefox, aby si nepamatoval přihlašovací údaje, takže je to tam potřeba pořád vyplňovat,
Asi to bude chtít konečně vytvořit rezervačního démona, co mu předám datum a čas spoje, spustím ho a on poběží tak dlouho, dokud se mu nepodaří něco zarezervovat, pak mi jen pošle e-mail :)
Tak to je teda od nich hezké. Bohužel pro ně jsem přestal používat linky SA. Linky DPML jsou většinou z části ještě volné, takže už nepotřebuji nic sledovat.
Je to škoda, že skript už nebude obnovován. Dlouho mi sloužil k plné spokojenosti. Po pár drobných úpravách mi dokonce posílal SMSku s volnými místy. Tak se asi budu muset víc ponořit do tajů parsování v PHP a zkusit si to spravit. Každopádně děkuji za dosavadní podporu skriptu.

