Jak postawić spambloga na WordPressie? Grzegorz Wójcik

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:

  • pobieranie zewnętrznych kanałów RSS za pomocą wykorzystywanych przez WP bibliotek
  • używanie WordPressowego XML-RPC API do programowego dodawania postów (zdecydowanie najciekawsze zagadnienie)
  • używanie WordPressowego harmonogramu zadań do cyklicznego odpalania funkcji

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 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ą scrappingu. Jakiś czas temu 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 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: 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 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 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 :)

Czytaj więcej:
Artykuły » WordPress
Tagi:
, ,

Grzegorz Wójcik

Grzegorz Wójcik jest założycielem internetowego magazynu kminek.pl. Pasjonat i twórca lekkich, dostępnych i użytecznych stron internetowych budowanych w oparciu o standardy sieciowe i najlepsze praktyki. Prywatnie wielki miłośnik ambitnego kina sci-fi oraz grunge-rocka z lat 90.

Zobacz wszystkie artykuły tego autora (15)

  1. Grzegorz, jesteś boski – normalnie zapiszę w ulubionych i wypróbuję :)

  2. Fajnie wyjaśnione oczywiście dla nie programisty (czyli mnie ;-) ). Dzięki, bo chociaż wtyczki do zassysania mam inne to zawsze fajnie poczytać co i jak działa.

  3. Dzieki za pozytywne slowa :)

    BTW tez nie uwazam sie za programiste – raczej hobbyste :P

  4. RAFi 4

    Nie wierzę. Poradnik jak zrobić spambloga? A ja ze spamem ciągle walczę. Buuu.

    “-“

  5. UUUUU minus u RaFiego – niedobrze, jeszcze mi sie dostanie :P

    Ale tak na powaznie – to tylko taki ‘proof of concept’, zreszta plugin nie dziala bo:

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

  6. Mati 6

    Ciekawe podejście, ale dla rasowego spamera pewnie trochę na około. Łatwiej było by zainstalować plugin do wordpressa Wp-o-Matic dodajemy kanały w formie kampanii, odpalamy za pomocą crona lub webcrona i zapominamy. Oczywiście nie pochwalam masowej produkcji spamu, ale co zrobić chyba takie mamy czasy, że wszyscy próbują jakoś zarabiać. Jedni sprzedają dragi inni spamują, co jest lepsze ?

  7. Artur 7

    to zależy od punktu widzenia co nazywasz dragami bo jeżeli dla kogoś Marysia to tzw “drag” to niech rozsiewa lepiej te “dragi”

  8. gam79 8

    Witam,

    Uruchamiając poniższy kod zmienna licznik_koncert powinna być zwiększana o jeden co jedną godzinę. Niestety funkcja się nie uruchamia.
    Sprawdzając za pomocą wtyczki Cron GUI polecenie jest dodawane i czas tak jak powinno być zmienia się co godzinę.

    1. //cron***********************
    2. add_action('spamblog_dodaj_posty_hook1', 'skan_koncert');
    3.  
    4. function scan_koncert(){
    5. $l=0; $l=get_option('licznik_koncert'); $l++; update_option('licznik_koncert', $l);
    6. }
    7.  
    8. if (get_option('myPlugin_aktywny1')=='1' ) { }else{ update_option('myPlugin_aktywny1', '1'); spamblog_activate1(); } //register_activation_hook(__FILE__, 'spamblog_activate1' );
    9. register_deactivation_hook(__FILE__, 'spamblog_deactivate1' );
    10.  
    11. function spamblog_activate1() {
    12. wp_schedule_event( time(), 'hourly', 'spamblog_dodaj_posty_hook1' );
    13. }
    14. function spamblog_deactivate1() {
    15. wp_clear_scheduled_hook('spamblog_dodaj_posty_hook1');
    16. delete_option('myPlugin_aktywny1');
    17. }
    18. //cron**************************************

    Funkcja register_activation_hook(__FILE__, ‘spamblog_activate1’ ); też nie działa. Zastąpiłem ją następującym kodem:
    if (get_option(‘myPlugin_aktywny1′)==’1’ ) { }else{ update_option(‘myPlugin_aktywny1’, ‘1’); spamblog_activate1(); }

    Korzystam z najnowszego wordpressa. Czy ktoś może spotkał się z takim problemem?

  9. bajki 9

    Polecam Wp-O-Matic

  10. Tom 10

    sensownie i dobrze napisane, choć wydaje mi się, że grono odbiorców raczej wąskie.
    tym większy szacun za tak obszerny artykuł.

  11. Mnie zachwyciła prostota i elegancja rozwiązania. Dziękuję za łopatologiczny tekst.

  12. KACPRER 12

    Dla mnie to zbyt obszernie napisane – nic nie zrozumiałem, przecież łatwiej i bardziej zrozumiale było by opisać sposób instalacji w punktach, przydało by się coś takiego…

  13. Darek 13

    Zastanawiałem się nad Tworzeniem takiego zaplecza i doszedłem do wniosku, że nie ma to sensu. Zbyt duże ryzyko bana, duplicate content sprawi, że takie zaplecze będzie g .. warte. Lepiej trochę powalczyć i stworzyć samemu trochę sensownej treści … google to doceni … tak tak wiem, że się nie chce ale … pisząc dziennie jeden krótki artykuł (30 minut) możesz bloga wzbogacić o 30 artykułów miesięcznie (unikalna treść) .. podpingować i będzie murowany efekt.

  1. […] do wordpress i wordpress po ciemnej stronie mocy oraz dla równowagi wordpress po jej jasnej stronie […]

Leave a Reply to Darek Cancel reply

 
 

Dozwolone tagi HTML: <strong> <em> <a href="" title=""> <code> <pre lang=""> <blockquote cite="">

Komentarze są moderowane. Mile widziane wpisy wnoszące nowe, ciekawe informacje do omawianego tematu
lub sygnalizujące ewentualne błędy merytoryczne. Wszelkie przejawy spamu lub nieetycznego zachowania bedą
karane blokadą adresu IP/domeny.