Blogrys

Śmigłe wsieciobranie i rozpalam

Od dobrych dziesięciu lat na początku każdego miesiąca odwiedzam kilka (kiedyś: kilkanaście) witryn internetowych i ściągam interesujące mnie treści na Kindla1. Najczęściej używam w tym celu przeglądarkowej wtyczki o nazwie Push To Kindle2. Niestety, PTK nie radzi sobie z artykułami z „Tygodnika Powszechnego”, który zaprenumerowałem próbnie na rok w jesiennej promocji. Redaktor webowy TP dziwnie rozkłada divy, wskutek czego PTK widzi tylko środkową część dokumentu i naiwnie przekształca go w awangardowy reportaż.

Ręczne kopiowanie artykułów i wysyłanie ich mailem na czytnik jest żmudne, tym bardziej, że co miesiąc przerzucam sobie w ten sposób 20-30 tekstów. Postanowiłem sprawę zautomatyzować:

  1. Artykuły do pobrania pozostawiam w otwartych zakładkach przeglądarki i zapisuję ich adresy hurtem wtyczką o tajemniczej nazwie Save All Tab URLs.
  2. Odpalam skrypt zaprezentowany poniżej, który pobiera wszystkie artykuły wgetem, zipuje je w sposób akceptowalny dla serwera Amazonu i wysyła na mój adres kindlowy.
  3. No, prawie wysyła. Thunderbirda nie da się obsługiwać wyłącznie z wiersza poleceń, więc na koniec muszę się poświęcić i osobiście kliknąć przycisk SEND.

Link do pobrania skryptu

Pokolorowany skrypt do przesłania dokumentów na Kindle, cz. 1

Pokolorwany skrypt do przesłania dokumentów na Kindle, cz. 2

Jak to działa?

Na samym początku obwieszczam systemowi, że skrypt ma być uruchomiony w powłoce zsh. Linuksiarze się zdziwią: Dlaczego właśnie w zsh, skoro 99.9% skryptów odpala się w bashu? Ano dlatego, że zsh posiada unikatową, uroczą opcję, która łatwo rozwiązuje ograniczenie narzucone przez Amazona. Zaraz do tego dojdziemy.

W linijkach 3-6 wpisuję informacje loginowe dla portalu „Tygodnika…”, następnie katalog, w którym pliki zostaną przetworzone, a wreszcie mój kindlowy adres mailowy. Ze zrozumiałych powodów tutaj te cztery zmienne wyciąłem.

Linijki 8-12 sprawdzają, czy uruchamiając skrypt podałem nazwę pliku z URL-ami do ściągnięcia. Jeżeli nie, programik usłużnie przypomina mi, do czego został stworzony.

W linijce 14 przenosimy się do katalogu, w którym wszystkie operacje się odbędą. W zasadzie ta komenda jest zbyteczna, ale „wielbię porządek i pełne szkło”.

Linijki 16-24 sprawdzają, czy wśród linków do ściągnięcia figuruje słowo „powszechny”. Jeżeli tak, to wypadałoby się najpierw zalogować do portalu TP, co wget niezwłocznie czyni. Jeżeli nie, tworzymy puste ciasteczko, ponieważ nie będziemy zaglądać za żadne inne paywalle.

Linijka 25 stanowi serce algorytmu: wget pobiera wszystkie linki z pliku, który został wskazany w momencie uruchomienia skryptu. Potem wyrzucamy zbędne już informacje loginowe zakodowane w ciasteczku.

W linijkach 28-32 pakujemy pobrane artykuły do ZIP-ów. Amazon pozwala wysłać mailem na Kindla kilka skompresowanych plików jednocześnie, ale nie wiedzieć czemu wymaga, by ilość dokumentów w jednym archiwum nie przekraczała 25. Takie dzielenie włosa na czworo jest warunkiem na tyle nietypowym, że ani zip nie posiada opcji, która pozwoliłaby go spełnić, ani bash, popularna powłoka do pisania skryptów, nie oferuje żadnego rozwiązania tej kwestii (z tego co wiem).

I tutaj z pomocą przychodzi inna powłoka, zsh, ze swoimi kosmicznymi parametrami globowania (czyli ekspansji nazw plików). Globowanie polega na tym, że na rozkaz * wyświetlą nam się wszystkie pliki zgromadzone w jednym miejscu. Jeżeli wpiszemy *.html, wyświetlą się wszystkie pliki z rozszerzeniem .html. I mniej więcej tutaj możliwości basha się kończą, ale w zsh możemy wpisać *.html(Y25), co pokaże tylko 25 plików hateemelowych (niekoniecznie alfabetycznie pierwszych).

Logika linijek 28-32 powinna stać się w tym momencie dość jasna: W linijce 29 tworzymy pętlę, która sprawdza, czy w katalogu pozostały jeszcze dokumenty do spakowania. Jeżeli tak, ćwierć setki z nich zostaje zarchiwizowanych zipem. Flaga -m przenosi dokumenty (tzn. usuwa je z katalogu po spakowaniu), a flaga -T testuje wpierw, czy wszystko spakowało się poprawnie (tę pierwszą flagę powinno zawsze ubezpieczać się testowaniem). Po drodze zwiększamy przyrostek, aby każdy kolejny wyprodukowany ZIP nazywał się inaczej niż poprzedni.

W linijkach 34-40 tworzymy łańcuch znaków określający zzipowane pliki na potrzeby Thunderbirda. Chodzi o wygenerowanie czegoś w stylu:

'mydocs0.zip, mydocs1.zip, mydocs2.zip'

Jest to odrobinę kłopotliwe, ponieważ trzeba przypilnować krańcowych apostrofów oraz oddzielić starannie nazwy archiwów przecinkiem i spacją. Linijka 40 usuwa przecinek i spację dodaną z rozpędu po nazwie ostatniego pliku oraz przypięczetowuje łańcuch końcowym apostrofem ukrytym za wstecznym ukośnikiem (ukryć go musimy, bo apostrofy są w gruncie rzeczy metaznakami).

W linijce 41-42 tworzymy wreszcie maila z załącznikami, wysyłamy i gotowe.

Na zakończenie wypada wyjaśnić wydumany tytuł notki:

  • Nazwa „wget” jest skrótem od „World Wide Web get”.
  • Nazwa „zip” pochodzi od przymiotnika „śmigły”. Jeżeli zawsze wydawało Wam się, że przecież od suwaka błyskawicznego… to też macie rację, bo „zipper” również pochodzi od „śmigłego” („śmigły zamek”).
  • Nazwa „Kindle” wzięła się od czasownika oznaczającego rozpalanie lub rozniecanie ognia. Jim Morrison śpiewał „light my fire” tylko dlatego, żeby sylaby się zgadzały.
  1. Dlaczego nie monitoruję ich na bieżąco RSS-em? Ponieważ chodzi o internetowe czasopisma pokroju „Kultury Liberalnej” lub „Dwutygodnika”, które treści produkują dużo, a mnie ciekawią tylko nieliczne z publikowanych na ich łamach tekstów. Nie chcę więc codziennie zaśmiecać sobie feedowego czytnika niepotrzebnymi nagłówkami. Zarazem artykuły wartościowe potrafią być na tyle wartościowe, że ich wyłowienie poprzez comiesięczne, ekspresowe przejrzenie tytułów en masse jawi się jako znośna rutyna. 

  2. Wolałem co prawda Send To Kindle, lecz od lat nie działa. 






Komentarze

Pacjent z Choroszczy (2023-12-09 22:25:49)

Polecam przeczytać świetną książkę - nienożyca

https://www.youtube.com/watch?v=V37a9uuk4bo

Piotrek G. (2023-12-12 19:14:05)

Mm fajne :)
Tego Thundirbirda mozesz ogarnac jakims rozwiazaniem RPA, ale brzmi to juz jak mocny overengineering. Jakis prosty sendmail podpiety pod SMTP googla, czy czegos w tym stylu?
W sumie wcisniecie send to pewnie nie problem, ale ... ;)

Pozdrawiam

Borys (2023-12-13 15:26:02)

O, super, że ciągle tutaj zaglądasz. Kopę lat. :)

Owszem, Thunderbirda mógłbym zastąpić terminalową aplikacją (sam testuję ostatnio aerca, ponieważ odbiłem się i od mutta, i od alpine), ale o ile wget i zip to standardowe narzędzia, o tyle z prymitywnych programów pocztowych nie każdy korzysta... Z drugiej strony nie każdy korzysta też z Thunderbirda. :)

Wcisnęcie SEND najłatwiej byłoby chyba zautomatyzować xdotool, lecz samodzielne wciśnięcie pozwala mi jednocześnie zatwierdzić całą operację.

Notabene, ulepszyłem skrypt i zaktualizowałem jego opis.

Piotrek G. (2023-12-16 08:44:54)

No kopę lat, to fakt.
Ale RSS pilnuje, żebym niczego nie przegapił :)

No tak mam w głowie, że domknięcie całości byłoby hm eleganckie? Ale z drugiej strony z doświadczenia zawodowego i prywatnego wiem, że overengineering w automatyzacji zabija motywację do robienia kolejnych. Także nie ma co na siłę dla samego efektu :)

Ogólnie bardzo fajne Ci to wyszło