Go to english version of this post / Przejdź do angielskiej wersji tego wpisu
Już od kilku tygodni publikuję serię niedzielnych wpisów #TDBNews, w której wypisuję interesujące rzeczy, na które natrafiłem w danym tygodniu. manualne zbieranie tych, w mojej ocenie, interesujących artykułów byłoby bardzo żmudną i niezwykle nieefektywną pracą, którą musiałbym powtarzać cyklicznie co tydzień, poświęcając na to część niedzielnego czasu, który mógłbym przeznaczyć na inne zajęcia. Z uwagi na to postanowiłem to zautomatyzować i to w baaardzo prosty sposób. Zasada działania jest trywialna i dla ułatwienia przedstawię ją w punktach.
- Codziennie przeglądam moje źródła RSS (używam aplikacji Reeder), oś czasu w Mastodon oraz Reddita, czyli moje trzy główne okna na informacje ze świata.
- Gdy natrafię na jakiś pozornie interesujący artykuł to zapisuję go do listy Przeczytaj później, do której wracam przeważnie dopiero wieczorem.
- Następnie te faktycznie interesujące rzeczy udostępniam na moim profilu na Mastodonie dopisując do niego specjalny hashtag #TDBNews.
- Skrypt PHP śledzący kanał RSS mojego mastodonowego profilu wyłapuje te tooty i zapisuje je do pliku tekstowego.
- Pod koniec tygodnia (w niedzielę) uruchamiam drugi skrypt, który z zebranych tootów tworzy mi gotowy kod wpisu zgodnego z notacją używaną przez WordPress. W praktyce składa się on ze statycznego wstępu i zakończenia, które w każdym wpisie TDBNews są takie same, i części zmiennej znajdującej się w środku, w której embeduję (osadzam) zebrane tooty w postaci ramek iframe.
- Pozostaje mi tylko nadać tytuł wpisu, co ogranicza się do podania aktualnej daty, i opublikować go.
Przykłady tego typu wpisów można zobaczyć przechodząc tutaj. A w tym wpisie pokażę od kuchni jak wyglądają te skrypty, dzięki którym realizuję tę prostą automatyzację.
Skrypt zbierający moje tooty oznaczone hashtagiem #TDBNews
Standardowo wytłumaczę jego działanie poprzez komentarze umieszczone w środku kodu. Tutaj może się też przydać znajomość treści wpisu, w którym pokazywałem jak zrobiłem bota do publikacji wiadomości ze znanych portali na Mastodonie.
<?php header('Content-Type: text/html; charset=utf-8'); // URL DO MOJEGO PROFILU NA MASTODONIE $url = "https://mastodon.tomaszdunia.pl/@to3k.rss"; // PLIK Z JUŻ ZNALEZIONYMI TOOTAMI $file_all = file_get_contents("tdbnews_all.txt"); // ZAŁADUJ PLIK XML (FEED RSS) $feeds = simplexml_load_file($url); // USTAW STREFĘ CZASOWĄ date_default_timezone_set("Europe/Warsaw"); // DATA PONIEDZIAŁKU W TYM TYGODNIU DO ODFILTROWANIA WSZYSTKIEGO PRZED TĄ DATĄ $monday = strtotime("Monday this week"); $monday = date("Y-m-d", $monday); // JEŻELI FEED RSS NIE JEST PUSTY if(!empty($feeds)) { // ROZBIJ FEED NA ODDZIELNE PRZEDMIOTY (TOOTY) foreach ($feeds->channel->item as $item) { // PRZEKONWERTUJ LINK NA CIĄG (BEZ TEGO FUNKCJA STR_CONTAINS WYWALI BŁĄD) $link = strval($item->link); // POBIERZ DATĘ PUBLIKACJI I ZMIEŃ JEJ FORMAT NA RRRR-MM-DD $pubDate = $item->pubDate; $pubDate = strtotime($pubDate); $pubDate = date("Y-m-d", $pubDate); // POBIERZ TREŚĆ $description = strval($item->description); if(str_contains($file_all, $link) OR $pubDate < $monday OR !str_contains($description, "https://mastodon.tomaszdunia.pl/tags/TDBNews")) { // JEŻELI LINK JEST JUŻ W PLIKU (BYŁ JUŻ PRZETWORZONY) // LUB JEŻELI DATA PUBLIKACJI JEST PRZED PONIEDZIAŁKIEM W TYM TYGODNIU (JEST ZA STARY) // LUB JEŻELI TOOT NIE ZAWIERA HASHTAGA TDBNEWS (JEST O CZYMŚ INNYM) // POMIŃ GO I IDŹ DO NASTĘPNEGO continue; } else { // JEŻELI WSZYSTKIE WARUNKI SPEŁNIONE // DOPISZ LINK DO ZMIENNEJ Z KWALIFIKUJĄCYMI SIĘ TOOTAMI $file_all .= $pubDate.";".$link."\n"; } } } // ZAKTUALIZUJ PLIK Z LISTĄ KWALIFIKUJĄCYCH SIĘ TOOTÓW file_put_contents("tdbnews_all.txt", $file_all); ?>Skrypt generujący gotowy wpis WordPress
Tak samo jak w przypadku poprzedniego kodu tak i tutaj wszystko wyjaśnione w komentarzach.
<?php // PLIK ZE ZNALEZIONYMI TOOTAMI $file_all = file_get_contents("tdbnews_all.txt"); // PODZIEL ZAWARTOŚĆ PLIKU NA ODDZIELNE LINIE $explode_file = explode("\n", $file_all); // USTAW STREFĘ CZASOWĄ date_default_timezone_set("Europe/Warsaw"); // DATA PONIEDZIAŁKU W TYM TYGODNIU DO ODFILTROWANIA WSZYSTKIEGO PRZED TĄ DATĄ $monday = strtotime("Monday this week"); $monday = date("Y-m-d", $monday); // DEKLARACJA TABLICY Z NEWSAMI Z TEGO TYGODNIA $news_array = array(); // PRZEJDŹ PRZEZ WSZYSTKIE LINIE JEDNA PO DRUGIEJ foreach($explode_file as $line) { // JEŻELI LINIA NIE JEST PUSTA if(!empty($line)) { // ODSEPARUJ DATĘ PUBLIKACJI I LINK $explode_line = explode(";", $line); // JEŻELI DATA PUBLIKACJI NIE JEST PRZED ZESZŁYM PONIEDZIAŁKIEM if($explode_line[0] >= $monday) { // DODAJ TEGO TOOTA DO TABLICY Z NEWSAMI Z TEGO TYGODNIA array_push($news_array, ['pubDate' => $explode_line[0], 'link' => $explode_line[1]]); } } } // ODWRÓC ZAWARTOŚĆ TABELI (SORTOWANIE TOOTÓW OD NAJSTARSZEGO DO NAJNOWSZEGO) $news_array = array_reverse($news_array); ?> <!-- SEKCJA Z WYNIKIEM, STATYCZNY WSTĘP, KOD PHP Z FUNKCJĄ FOREACH, KTÓREJ REZULTATEM JEST WYŚWIETLENIE WSZYSTKICH TOOTÓW W RAMCE IFRAME, STATYCZNE ZAKOŃCZENIE --> <!-- ELEMENT PLAINTEXT JEST UŻYWANY DO WYŚWIETLENIA KODU HTML W NIEPRZETWORZONEJ FORMIE (WSZYSTKO PO TYM TAGU) --> <plaintext> <!-- wp:columns --> <div><!-- wp:column --> <div><!-- wp:paragraph --> <p> <em>#TDBNews</em> to nazwa pochodząca od <em>Tomasz Dunia Blog News</em>. Pod taką nazwą co niedzielę publikuję zbiór ciekawych wiadomości na jakie udało mi się natrafić w ubiegłym tygodniu. Zdecydowana większość linkowanych artykułów będzie anglojęzyczna, bo wszystkie źródła polskojęzyczne, które śledzę, są za <em>paywall'ami</em>.</p> <!-- /wp:paragraph --></div> <!-- /wp:column --> <!-- wp:column --> <div><!-- wp:paragraph --> <p> <em>#TDBNews</em> is a name coming from <em>Tomasz Dunia Blog News</em>. Under this name, every Sunday I publish a collection of interesting news that I came across in the previous week. The vast majority of linked articles will be in English, because all the Polish-language sources, I follow, are behind <em>paywalls</em>.</p> <!-- /wp:paragraph --></div> <!-- /wp:column --></div> <!-- /wp:columns --> <!-- wp:heading --> <h2>W tym tygodniu znalazłem / This week I found </h2> <!-- /wp:heading --> <?php foreach($news_array as $news) { echo " <!-- wp:html --> <iframe src=\"".$news['link']."/embed\" class=\"mastodon-embed\" style=\"max-width: 100%; border: 0\" width=\"100%\" allowfullscreen=\"allowfullscreen\"></iframe><script src=\"https://mastodon.tomaszdunia.pl/embed.js\" async=\"async\"></script> <!-- /wp:html --> "; } ?> <!-- wp:columns --> <div><!-- wp:column --> <div><!-- wp:paragraph --> <p> Jak widzisz to zestawienie powstaje poprzez osadzenie tootów (inaczej postów), które opublikowałem w poprzednim tygodniu na <em>Mastodonie</em>. Są one oznaczone specjalnym hashtagiem. To oznacza, iż informację o tych treściach możesz uzyskać jeszcze przed publikacją tego zestawienia. Wystarczy śledzić <a href="https://mastodon.tomaszdunia.pl/@to3k">mój profil na <em>Mastodonie</em></a> lub sam <a href="https://mastodon.tomaszdunia.pl/tags/TDBNews">hashtag <em>#TDBNews</em></a>.</p> <!-- /wp:paragraph --></div> <!-- /wp:column --> <!-- wp:column --> <div><!-- wp:paragraph --> <p> As you can see, this compilation is created by embedding toots (also known as posts) that I published last week on <em>Mastodon</em>. They are marked with a special hashtag. This means that you can access information about these contents even before this compilation is published. Just follow <a href="https://mastodon.tomaszdunia.pl/@to3k">my profile on <em>Mastodon</em></a> or the <a href="https://mastodon.tomaszdunia.pl/tags/TDBNews">hashtag <em>#TDBNews</em></a> itself.</p> <!-- /wp:paragraph --></div> <!-- /wp:column --></div> <!-- /wp:columns -->Podsumowanie
Czyż nie było to proste? W mojej ocenie nie dość, iż proste to jeszcze warte zachodu! Jak to? Mam zasadę, iż każda automatyzacja czynności, która z jednej strony jest niezbyt wymagająca intelektualnie, a z drugiej powtarza się cyklicznie, ma sens i na dłuższą metę oszczędzi wiele czasu. Weźmy przykład TDBNews. Tworzenie takiego zestawienia manualnie zajęłoby mi co tydzień przynajmniej 20 minut, natomiast z wyżej opisaną automatyzacją zajmuje mi to nie więcej niż 3 minuty. Weźmy zatem te 15 minut co tydzień. W roku mamy 52 tygodnie, a więc rocznie zyskuję 780 minut, czyli 13 godzin! To ponad pół dnia, które mogę poświęcić rodzinie, czy choćby na tworzenie kolejnego wpisu na ten blog.