Tak trochu jiný RSS agregátor

Už je to nějaký ten čas, co jsem přestal se čtením iDnes.cz (a jejich mobilní aplikaci otevřu jen kvůli MOgirls  v rubrice Xman) a své „pole působnosti“ rozšířil mezi větší počet pro mě zajímavých zpravodajských serverů. Jelikož ale ruční procházení většího množství webů není tak pohodlné, rozhodl jsem se svůj zelený mozek po delší době opět dokopat k programování a i když výsledek nemám momentálně v plánu dát nějak veřejně k dispozici, pokusím se ho zde co nejlépe popsat a třeba někoho inspirovat k podobné tvorbě, s jeho zdroji a na pro něm zajímavých technologiích.

Technologie
Jako prvním velkým problémem se stal již samotný výběr technologií, na kterých bych celé řešení postavil. Dokud byl člověk v IT, měl dostatek času na výběr té nejzajímavější a vždy byl po ruce někdo, kdo byl schopen poradit. Zkusil jsem tedy nejdříve rozchodit starou verzi – Jak vlastně rozchodit ten React? A na Windows? Jak nakonfigurovat správně Gulp? Jaký použít storage? No jo, už to není co bývalo a tak mi po dni neúspěšného snažení došlo, že tímto tempem se z místa nepohnu. Proto jsem nakonec opustil od super technologicky vymakaného prototypu na papíře a rozhodl se … skutečně něco naprogramovat. K tomu mi pro moje potřeby bohatě postačil Flask (Python) na backendu a jQuery na frontendu. Na pomoc s frontendem jsem si ještě přibral opravdu výbornou šablonu (resp. sbírku různých komponent) Unify, pro kterou jsem konečně našel využití. To vše pak uloženo v privátním repozitáři na GitHubu a spuštěno v Docker containeru a deployováno … přes git push  a git pull .

Roboti
Projekt jako takový má dvě části – roboty, kteří pravidelně parsují vybrané RSS kanály a web, který to všechno přehledně zobrazuje. První úkol bylo tedy sesbírání potřebných RSS kanálů. Aby přidávání nových zdrojů bylo co nejjednodušší, uložil jsem si všechna potřebná nastavení (adresa, kam ukládat, formát použitého datumu…) do konfiguračního souboru a vytvoření úplně primitivního RSS robota je otázka pouhého založení nové třídy pro každý zdroj, která dědí ze základního RSS robota. Navíc je možné přetížit libovolnou metodu a dodatečně si například dotáhnout obrázek z Open Graph atributu nebo ošetřit špatně kódované znaky. Samotné spuštění je pak otázka jen jednoho příkazu:

Pokud navíc použiju přepínač -v , získám podrobný popis toho, co zrovna robot dělá a s přepínačem --dry  mohu robota spustit, ale nedojde k uložení žádných dat (vhodné při testování nového robota).

Jaká data si člověk z RSS vezme je už na volbě každého, já chtěl vedle údajů dostupných přímo z RSS získávat ještě obrázek z Open Graph (pokud je dostupný) a vygenerovat si ke každému článku tagy, podle kterých by bylo možné články třídit.

Generování tagů jsem rozebíral již v článku Automatické generování klíčových slov, proto jen zmíním, že je k tomu použita služba MorphoDiTa.

S obrázky bylo práce trochu víc. Samotné získání jejich adresy nebyl problém díky knihovně BeautifulSoup, bylo však potřeba vyřešit, odkud soubory načítat. Nejjednodušší bylo samozřejmě načítat je přímo z externích zdrojů, ale jednak to některé servery nevidí rády (a po několika připojeních vás odpojí) a za druhé nemáte kontrolu nad formátem obrázku (a ano, některé weby nemají problém zde uvést 8MB obrázek…). Nakonec jsem tedy zvolil cestu stažení obrázku lokálně a jeho zmenšení a optimalizaci pomocí Pillow, kdy se většinou dostávám na zmenšení o 80-90% oproti původnímu obrázku a významně se to podepisu jednak na trafficu na serveru, úspoře diskového prostoru, ale také na rychlosti načítání webové prezentace.

O pravidelné spouštění se stará cron a data jsou následně ukládána do SQLite souboru (není teda potřeba žádný běžící SQL server).

Webová prezentace
Mít články uložené v databázi je jistě fajn věc, ale nikdo je zde nebude manuálně procházet. Proto je, jak jsem již zmiňoval, druhou částí projektu webová prezentace, která data zobrazí způsobem oku lahodícím. Zde se již meze na vzhled ani funkčnost nekladou a je čistě na autorovi, jak bude výsledek vypadat a co bude umět. Pro mě bylo zásadní rozdělení do několika hlavních zájmových oblastí (Zpravodajství, Sociální sítě, Armáda…) a možnost mít také mobilní verzi, s čím velmi pomohlo právě zmiňované Unify postavené nad Bootstrap 4.

Deployment
Z mých dob v IT vím, že deploy aplikace se dá řešit mnoha moderními, pohodlnými a automatizovanými způsoby, avšak pro mé soukromé účely jsem nakonec zvolil cestu nejmenšího odporu v podobě pushnutí do repozitaře z lokálního počítače a pullnutí změn a případný restart Docker containeru na serveru. Pro často používané operace jsem si vytvořil několik základních instrukcí v Makefile.

Container se již sám postará o to, aby byly nainstalovány potřebné závislosti a aplikace inicializována a spuštěna.

O samotné servírování webové stránky z Dockeru se pak stará nginx jako reverzní proxy.

Výsledek
Výsledkem je (pro mě) přehledná webová stránka, na kterou se mi pravidelně dotahují nové články a mě tak stačí jedno místo, kde si můžu přečíst zprávy z několika zdrojů. Ano, jistě se nejedná o žádný technologický skvost, ukázku best practices nebo optimalizaci všeho všude, ale jedná se o (především) funkční aplikaci, do které mohu jednoduše přidávat další funkcionality. A to mi přijde podstatnější než ukázková SPA s do posledního detailu promyšleným návrhem a deploymentem postavená na Reactu (nebo co teď frčí) a Gulpu nebo Meteoru.

Mohlo by se vám líbit...

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *