kminek.pl

Jak postawić spambloga na WordPressie? Grzegorz Wójcik

21 Feb, 2009  |  Artykuły, WordPress

Czy wiecie, że według niektórych badań ponad 50% blogosfery stanowią spamblogi? Spamblog to specjalnie zaprogramowany blog, który „pisze się sam” wykorzystując do tego celu treści z zewnętrznych źródeł (najczęściej nielegalnie).

Spamblogi wykorzystywane są przede wszystkim do zarabiania na reklamie kontekstowej (Google AdSense) i nieuczciwego pozycjonowania stron. Powszechną praktyką jest tworzenie swoistych „farm” wzajemnie podlinkowanych spamblogów w subdomenach. Takie spam-sieci wykorzystują najczęściej popularne skrypty open-source.

Oczywiście nasz tytułowy spamblog będzie opary na WordPressie i będzie to tylko teoretyczne studium przypadku, które pozwoli nam przeanalizować i połączyć w jedną całość trzy ciekawe obszary funkcjonalności tego systemu oferowane deweloperom:

W naszym przykładzie „przejdziemy na ciemną stronę mocy” i stworzymy edukacyjny plugin zmieniający domyślną instalację WP w spambloga, który co godzinę sprawdza zdefiniowane kanały RSS i pobiera z każdego z nich ostatni wpis. Następnie na podstawie pobranych z RSS informacji automatycznie „pisze” posty na bloga i umieszcza je w odpowiednich kategoriach. Testową instalację WP z pluginem w działaniu możecie zobaczyć tutaj.

Przystąpmy do omówienia krok po kroku [1] kodu naszej wtyczki (.zip).

Pobieramy RSS

Spamblogi pobierają treści z innych miejsc Internetu za pomocą kanałów RSS. Okazuje się, że zadziwiająco dużo stron oferuje pełną treść artykułów w feedach (czyli macie kolejny argument, aby tego nie robić). Przy czym – nawet jeśli dana strona w ogóle nie oferuje treści w formie RSS to i tak dla chcącego istnieje możliwość jej „pożyczenia” za pomocą [2] scrappingu. Jakiś czas temu [3] pisałem o pobieraniu feedów za pomocą biblioteki SimplePie, jednak tym razem wykorzystamy do tego celu WordPressowe funkcje:

  1. include_once(ABSPATH . WPINC . '/rss.php');
  2.  
  3. function spamblog_pobierz_rss( $url, $num_items = 1 ) {
  4. if ( $rss = fetch_rss( $url ) ) {
  5. if ( $num_items !== -1 ) $rss->items = array_slice( $rss->items, 0, $num_items );
  6. return $rss->items[0];
  7. } else {
  8. return false;
  9. }
  10. }

Funkcja spamblog_pobierz_rss pobiera kanał RSS ze wskazanego adresu (parametr $url) i zwraca najświeższy wpis w postaci tablicy (lub zwraca false jeśli pobieranie się nie udało bo np. serwer leży). Jak widać czarną robotę pobierania feeda załatwia za nas funkcja fetch_rss (linia 4), do której dostęp w naszym pluginie uzyskujemy dzięki załączeniu pliku rss.php z dystrybucji WP (znajduje się on w katalogu wp-includes).

Umieszczamy posty za pomocą PHP i XML-RPC API

Programowe dodawanie postów otwiera zupełnie nowe możliwości przed zaawansowanym użytkownikiem platformy WP. Wiedząc jak to się robi możemy np. opublikować na stronie formularz, za pomocą którego niezarejestrowani użytkownicy będą dodawali posty (które będą publikowane natychmiastowo lub będą miały status draftów oczekujących na akceptację). W ten sposób bardzo łatwo można zrobić z WordPressa np. serwis z ogłoszeniami.

Okazuje się, że najlepiej do tego celu nadaje się obsługiwany przez WP mechanizm XML-RPC (ang. XML Remote Procedure Call), który pozwala na zdalne wywoływanie funkcji. Działa on na zasadzie klient-serwer. Blog A (klient) może wysłać do bloga B (serwer) zapytanie w stylu: prześlij mi listę wszystkich komentarzy dla wpisu o id=1. Zapytania i odpowiedzi mają formę komunikatów HTTP niosących ze sobą specjalnie sformatowany XML. Dodatkowo zapytania muszą być autoryzowane – blog B odpowie pomyślnie na zapytanie od bloga A tylko wtedy jeśli będzie ono niosło ze sobą informacje o loginie i haśle użytkownika zdefiniowanego na blogu B.

Cały problem dla programisty to odpowiednie skonstruowanie zapytania HTTP, wysłanie go do serwera docelowego za pomocą file_get_contents() lub biblioteki cURL i obsłużenie odpowiedzi (odpowiedzi to też XML więc trzeba je parsować). Bibliotek/klas pomagających w tym zadaniu jest [4] kilka, przy czym na potrzeby niniejszego artykułu napisałem prostą klasę, której zadaniem jest tylko dodawanie postów. Z braku czasu nie obsługuje ona nawet odpowiedzi tylko wysyła zapytania – zresztą odpowiedzią na wywołanie metody dodawającej posta (ta metoda to blogger.NewPost) jest albo prawda (post został dodany) albo fałsz (nie został dodany). Z klasy korzystamy w następujący sposób:

  1. include_once('wp_xmlrpc_api.class.php');
  2.  
  3. $wp = new WP_xmlrpc_api('http://www.blogB.pl/xmlrpc.php', 'admin', 'qwerty');
  4.  
  5. /*
  6. post zostanie natychmiast opublikowany i umieszczony
  7. w kategorii o id=1 (Uncategorized)
  8. */
  9. $wp->nowyPost('Tytuł nowego posta', 'Treść nowego posta');
  10.  
  11. /*
  12. post zostanie natychmiast opublikowany i umieszczony
  13. w kategorii o id=2 oraz w kategorii o id=3
  14. */
  15. $wp->nowyPost('Tytuł nowego posta', 'Treść nowego posta', array(2,3));
  16.  
  17. /*
  18. post zostanie dodany jako draft(wersja robocza) i umieszczony
  19. w kategorii o id=2 oraz w kategorii o id=3
  20. */
  21. $wp->nowyPost('Tytuł nowego posta', 'Treść nowego posta', array(2,3), 0);

W naszym przypadku (spambloga) łączymy się jak gdyby „sami ze sobą” – wiec w linii 3 na powyższym listingu podajemy adres naszego spambloga, na którym aktywowaliśmy nasz plugin.

Należy dodatkowo pamiętać o włączenie obsługi XML-RPC w panelu administracyjnym WP (sekcja Settings > Writing). Można to zrobić ręcznie, można też programowo – nasz plugin w sprytny sposób permanentnie włącza tą opcję za pomocą następującego fragmentu:

  1. update_option('enable_xmlrpc', 1);

W ten sposób, w chwili gdy plugin jest włączony, nie da się wyłączyć wsparcia XML-RPC z poziomu panelu administracyjnego :) Powyższy trik można wykorzystać np. do automatycznego ustawiania pewnych opcji WP bez potrzeby ich ręcznego wyklikiwania w panelu administracyjnym.

Wszystkim zainteresowanym protokołem XML-RPC w WP i automatyzacją dodawania postów polecam uwadze świetny artykuł Przemka Pawliczuka: [5] Zdalne publikowanie notek w Wordpressie - XML-RPC w PHP.

WordPressowy harmonogram zadań

Niewiele osób wie, że WP udostępnia całkiem przydatny mechanizm, za pomocą którego możemy definiować zadania(funkcje), które wykonywane będą cyklicznie lub jednorazowo w przyszłości.

Zasada działania tego harmonogramu zadań jest następująca – WP zapisuje każde zgłoszone przez nas zadanie w bazie danych i przy każdorazowym wywołaniu strony sprawdza zapisane zadania pod kątem różnicy czasowej między czasem obecnym (wywołania strony) a czasem, w którym zadanie było wykonane po raz ostatni. Jeśli różnica jest większa niż określony przez nas interwał (np. 60 minut) odpala dane zadanie ponownie, uaktualniając jednocześnie w bazie czas jego ostatniego wykonania.

W naszej wtyczce chcemy odpalać co godzinę funkcję spamblog_dodaj_posty(), która pobiera feedy i umieszcza na ich podstawie posty. Aby to zrobić, musimy najpierw podpiąć tę funkcję pod nasz własny „hook”:

  1. add_action('spamblog_dodaj_posty_hook', 'spamblog_dodaj_posty');

a następnie podać ten hook jako argument funkcji [6] wp_schedule_event:

  1. wp_schedule_event( time(), 'hourly', 'spamblog_dodaj_posty_hook' );

Jak widać drugi argument to łańcuch tekstowy określający częstotliwość (w naszym przypadku 'hourly' czyli co godzinę). Co ważne funkcja wp_schedule_event musi być wykonana tylko raz więc należy ją podpiąć pod hook wykonywany w momencie aktywacji wtyczki. Gdybyśmy tego nie uczynili, WP przy każdorazowym wywołaniu strony dodawał by do bazy nowe zadanie. Analogicznie, przy de-aktywacji plugina usuwamy zdefiniowane zadanie funkcją wp_clear_scheduled_hook:

  1. add_action('spamblog_dodaj_posty_hook', 'spamblog_dodaj_posty');
  2.  
  3. function spamblog_activate() {
  4. wp_schedule_event( time(), 'hourly', 'spamblog_dodaj_posty_hook' );
  5. }
  6.  
  7. function spamblog_deactivate() {
  8. wp_clear_scheduled_hook('spamblog_dodaj_posty_hook');
  9. }
  10.  
  11. register_activation_hook(__FILE__, 'spamblog_activate' );
  12. register_deactivation_hook(__FILE__, 'spamblog_deactivate' );

Na zakończenie szybki rzut oka na funkcję spamblog_dodaj_posty():

  1. function spamblog_dodaj_posty() {
  2. $wp = new WP_xmlrpc_api('http://www.blogB.pl/xmlrpc.php', 'admin', 'qwerty');
  3. $onet = spamblog_pobierz_rss('http://wiadomosci.onet.pl/2,kategoria.rss');
  4. if ($onet && spamblog_dodaj_url($onet['link'])) $wp->nowyPost($onet['title'], $onet['description']);
  5. }

Pojawia się tutaj funkcja spamblog_dodaj_url(), która ma zabezpieczać przed dodawaniem już istniejących postów. Może się bowiem zdarzyć, że po godzinie w odpytywanych feedach nie pojawią się nowe pozycje. Funkcja zapisuje adresy URL artykułów z feedów w bazie danych wykorzystując WordPressowy mechanizm [7] opcji. Przed zapisem sprawdza czy podany URL już jest zapisany – jeśli tak – zwraca wartość false.

P.S. w klasie będącej sercem wtyczki zrobiłem parę błędów, aby nie ułatwiać życia niedzielnym instalatorom pluginów :)

-----

Wydrukowano z: https://www.kminek.pl/jak-postawic-spambloga-na-wordpressie/

Lista adresów URL występujących w tekście:

© 2007-2019 kminek.pl