Blox.pl – feed RSS dla pojedynczej kategorii

Wymaganiem udziału w konkuresie DSP2017 jest podanie feedu RSS zawierającego wyłącznie posty związane z konkursem. Blox.pl spłatał mi niemiłego figla i dał wybór – albo stary, paskudny wygląd, albo brak możliwości pobrania feedu RSS dla pojedynczej kategorii. Sprawę zgłosiłem, ale znając czasy realizacji stwierdziłem, że mam trzy możliwości: zrezygnować z DSP2017, postawić osobnego bloga specjalnie dla DSP2017 albo zrobić coś samemu.

Pierwsze dwie możliwości odrzuciłem. Jakoś nie widział mi się blog z 20 postami, kolejnego prowadzić mi się nie chce, a Blox ma swoje zalety i do porzucenia jeszcze nie dojrzałem. Spojrzałem co też mam do dyspozycji pod ręką, bo w pewne parsowanie feedu RSS bawiłem się już przy pomocy Perla (patrz zawartość mojego konta na blabler.pl). Niestety, stwierdziłem, że niezbyt się to nadaje do użytku.

Poza tym, przeszedłem na Pythona, więc pomyślałem o małej rozgrzewce. Pierwszym pomysłem było przeparsowanie całego feeda i złożenie RSS. Znalazłem przykłady parsowania XML z użyciem beautifulsoup4, z którego zresztą trochę wcześniej korzystałem. Wyciąganie zawartości poszczególnych postów poszło bardzo dobrze.

Stwierdziłem, że zamiast się bawić w tworzenie feedu kolejnym modułem, w ramach eksperymentu dodam przy pomocy chamskich printów nagłówki od XML. O dziwo zadziałało, Firefox widział coś, co wyglądało prawie jak oryginał. Jedynym problemem było kodowanie – zdecydowanie był problem z pl-znakami. Rzecz w tym, że Blox używa iso-8859-2, a Python wypluwa UTF-8. Wystarczyła szybka zmiana deklaracji kodowania w nagłówku XML i już było OK.

Kolejny problem wyszedł przy przepuszczeniu feeda przez validatory feedów RSS. Okazało się, że beautifulsoup4 zamienia wszystkie znaki w tagach na lowercase i – wierząc szybkiemu sprawdzeniu – nie ma prostego sposobu, by go od tego odwieść. Podjąłem próbę zamiany moduł na inny, ale szybko zrezygnowałem na rzecz brzydkich, ale skutecznych sedów na wyniku działania skryptu.

Na koniec zostało dodanie wywołania (z użyciem utworzonego na tę okoliczność virutalenv) do crona:

*/15 * * * * /home/rozie/dsp2017/bin/python /home/rozie/rss_from_category_blox.py 2>/dev/null | /bin/sed s'/pubdate/pubDate/g' | /bin/sed 's/lastbuilddate/lastBuildDate/g' > /tmp/dsp2017.xml && /bin/mv -f /tmp/dsp2017.xml /var/www/dsp2017.xml
*/15 * * * * /home/rozie/dsp2017/bin/python /home/rozie/rss_from_category_blox.py 2>/dev/null > /tmp/dsp2017.xml && /bin/mv -f /tmp/dsp2017.xml /var/www/dsp2017.xml

Całość wrzucam na GitHub, na wypadek, gdyby miało się komuś przydać.

UPDATE: Zgodnie z sugestią z komentarza, parsuję XML prawidłowo i pozbyłem się sed poprawiającego wyjście.

5 powodów do udziału w DSP2017

Nie jestem programistą i nie jest to blog programistyczny[1]. Czemu więc dołączyłem do konkursu Daj Się Poznać 2017?

  • Po pierwsze, uważam, że to świetna inicjatywa, dobra zabawa i doskonały motywator.
  • Po drugie, zawsze lubiłem konkursy programistyczne typu Potyczki Alogrytmiczne.
  • Po trzecie, uważam, że administrator powinien znać przynajmniej podstawy programowania, nawet jeśli nie udziela się programistycznie w większych projektach. Zresztą, devops (modne słowo) way to konfiguracja jako kod i bez przynajmniej podstaw jest… ciężko. Jeśli w ogóle się da. 😉
  • Po czwarte, ostatnio spodobał mi się Python i jest okazja, żeby poćwiczyć.
  • Po piąte, mam pomysł na mały projekt, który trafił do szuflady (czytaj: na dysk) i DSP2017 jest świetną okazją, żeby go zmaterializować. Jak to ładnie ktoś ujął „wizja bez implementacji to halucynacja”.

Największy problem sprawiła mi… platforma bloga czyli sam Blox. Wymogiem uczestnictwa w DSP2017 jest podanie kanału RSS, na którym będą pojawiały się wpisy konkursowe. I tylko one. Niestety, nic takiego tu nie istnieje, przynajmniej nie w nowym szablonie. Zgłosiłem to na forum, mają sprawdzać, ale złudzeń nie mam – muszę radzić sobie sam. Jest plan, szczegóły jutro.

Konkursem zainteresowałem się bliżej 28. lutego i powyższy problem sprawił, że pierwotnie odpuściłem, na szczęście zapisy do DSP2017 zostały przedłużone do 12. marca, więc podobnie jak ja macie jeszcze szansę zdążyć się zarejestrować.

Do całości podchodzę luźno – ma to być głównie motywator do materializacji projektu i okazja do poćwiczenia Pythona. Biorąc pod uwagę ilość wpisów na blogu, głównym problemem mogą być same dwa wpisy tygodniowo, a szczególnie ten drugi, niekoniecznie związany z projektem. A jeszcze trzeba sam projekt realizować… Niemniej, trzeba próbować. 🙂

[1] Mam nadzieję, że to wyznanie nie spowoduje dyskwalifikacji. Postaram się spełnić wymagania konkursowe.

Komunikacyjne podobieństwa

Czasem patrzę na różne rzeczy i stwierdzam, że wszystko to jest do siebie bardzo podobne. Półtora roku temu napisałem:

Blog to zbiór stron z atrybutami author, date, title, body, comments (comment author, comment date). Pewnie jeszcze tags.

No dobrze, zapomniałem jeszcze o category. Przypomniało mi się to w związku z pytaniem, które dostałem na maila, a które dotyczyło eksportu zawartości bloga na WordPressa i wynikającym z tym grzebaniem w skryptach różnych, starych i nowych.

Tyle, że jakby się dobrze zastanowić, to ta struktura jest powszechna w komunikacji. Weźmy takiego Facebooka – mamy wpisy, są tagi, jest treść, autor i data. Jedyne czego nie ma, to tytuł. Pod wpisami oczywiście są komentarze. Czyli w zasadzie blog.

Facebook oczywiście nie jest wyjątkiem, podobnie jest na Twitterze czy G+. A jakby się zastanowić głębiej, to początki sięgają pewnie NNTP lub emaili. Tam również były w postach data, autor i tytuł. Na komentarze trzeba by tam spojrzeć inaczej: każdy post mógł być komentarzem – decydowało o tym umiejscowienie w hierarchii. W pewien sposób rozwiązanie lepsze i bardziej elastyczne, niż to z blogów – tu protezą jest trackback lub linkowanie. Za to nie było tagów, które zapewniają komunikację/połączenia poziome pomiędzy wpisami.

Nie wiem czy pisałem już kiedyś o tym, ale zastanawiam się, na ile realne i sensowne byłoby użycie serwerów NNTP do komunikacji rozproszonej, niezależnej, powiedzmy „obywatelskiej”. Coś jak Diaspora. Oczywiście z jakimś sensownym frontendem do czytania. I pewnie z tagami i kategoriami, które łatwo można by było uzyskać przy pomocy wprowadzenia dodatkowych nagłówków, np. X-Category oraz X-Tags. Po co? Cóż, wydaje mi się, że istnieje gotowy, dojrzały soft, sprawdzony w działaniu w sporej skali. Pytanie, czy soft ten przypadkiem nie jest już przestarzały. Ale mam wrażenie, że sporo pary projektów typu Diaspora idzie w pisanie istniejących rzeczy, zamiast w układanie flow i dopasowywanie istniejących narzędzi. Rozumiem, że tworzenie jest fajne, ale jeśli ma być to wymyślanie koła od nowa, to IMHO przestaje mieć sens.

I jeszcze jedna sprawa, pasująca do układanki. Jakiś czas temu został zamknięty serwis Delicious, grupujący linki. Znalazłem backup i co? Jest to link, pełniący rolę treści, jego tytuł, są tagi i data. W związku z tym bliski jestem eksportu starych linków do minibloga i napisania prostego skryptu do dodawania nowych wpisów. Oczywiście pelican jako silnik, a skrypt w Pythonie.