Prosta automatyzacja TDBNews

blog.tomaszdunia.pl 9 miesięcy temu

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.

  1. 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.
  2. Gdy natrafię na jakiś pozornie interesujący artykuł to zapisuję go do listy Przeczytaj później, do której wracam przeważnie dopiero wieczorem.
  3. Następnie te faktycznie interesujące rzeczy udostępniam na moim profilu na Mastodonie dopisując do niego specjalny hashtag #TDBNews.
  4. Skrypt PHP śledzący kanał RSS mojego mastodonowego profilu wyłapuje te tooty i zapisuje je do pliku tekstowego.
  5. 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.
  6. 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.

Jeżeli podobał Ci się ten wpis to możesz mnie wesprzeć!

Idź do oryginalnego materiału