Modelowane listy odbiorców nie zawierają konkretnych osób, tylko prawdopodobieństwa. Wyjaśniam, jak powstają, gdzie ich szukać w panelu i jak czytać ich raporty.
To pytanie dostaję zwykle w wersji skróconej: „czy Google za to nie ukarze”. Odpowiadam wtedy, że sam mechanizm generowania odnośników skryptem nie jest niczym, co wyszukiwarka mogłaby wykryć i potraktować jako naruszenie. Nikt nie sprawdza, czy link wpisał redaktor, czy wstawiła go reguła w szablonie.
Kłopoty, które faktycznie widzę u klientów po takich wdrożeniach, mają zupełnie inne źródła. Wynikają z tego, że skrypt robi dokładnie to, co mu kazano, w skali, w której nikt tego nie przewidział, i przez pół roku nikt nie zagląda w wynik.
Zebrałem tu przypadki, na które trafiłem przy przejmowaniu serwisów z takimi rozwiązaniami, oraz warunki, przy których uważam automatyzację za rozsądną.
Warto najpierw ustalić punkt odniesienia, bo dyskusja o bezpieczeństwie często odbywa się bez niego.
Zasady dotyczące spamu linkowego opisują sytuacje, w których ktoś próbuje sztucznie zdobyć lub sprzedać sygnały z obcych witryn — kupione wpisy, wymiany, farmy. Odnośniki wewnątrz jednej domeny mieszczą się w kategorii decyzji nawigacyjnych właściciela serwisu. To on ustala, co uznaje za ważne i co z czym łączy.
Przedstawiciele wyszukiwarki od lat powtarzają tę samą myśl w różnych wariantach: linkowanie wewnętrzne to narzędzie w rękach właściciela strony i wypada z niego korzystać. Nie ma tam żadnego limitu ani zalecanej liczby odnośników w tekście.
Z tego wynika praktyczny wniosek. Nie szukam odpowiedzi na pytanie „czy to jest dozwolone”, bo jest. Szukam odpowiedzi na pytanie, czy po wdrożeniu serwis jest łatwiejszy do zrozumienia dla robota i wygodniejszy dla czytelnika, czy trudniejszy w obu wymiarach.
Wszystkie widziałem na żywo, żaden nie jest hipotezą.
Żaden z tych przypadków nie skończył się filtrem ani ręczną karą. Wszystkie skończyły się serwisem, w którym linkowanie przestało nieść jakąkolwiek informację, bo wszystko było podlinkowane wszędzie.
Osobna kategoria, o której trzeba mówić wprost, bo tutaj ryzyko techniczne jest realne.
Wyszukiwarka renderuje strony, więc odnośniki dołożone JavaScriptem zwykle zostaną znalezione. Kluczowe słowo to „zwykle”. Renderowanie odbywa się z opóźnieniem i nie zawsze w pełnym zakresie. Jeśli cała warstwa linkowania powstaje po stronie klienta, uzależniasz strukturę serwisu od procesu, na który nie masz wpływu i którego nie widzisz w logach serwera.
Dochodzą do tego wymogi formalne. Link musi być znacznikiem z atrybutem podającym adres. Element reagujący na zdarzenie kliknięcia, który przenosi użytkownika skryptem, dla robota nie jest odnośnikiem — i przy takim wdrożeniu można mieć setki połączeń, których wyszukiwarka nigdy nie zobaczy.
Sprawdzam to zawsze tak samo: podglądam wyrenderowany kod w narzędziu do sprawdzania adresu URL w Search Console i porównuję z tym, co widzę w przeglądarce. Jeśli różnica jest duża, przenoszę generowanie na stronę serwera, nawet jeśli oznacza to więcej pracy programisty.
Ten aspekt wypada z dyskusji najczęściej, a decyduje o tym, czy ktoś w ogóle wróci na stronę.
Tekst z odnośnikiem w co drugim zdaniu jest po prostu trudny do przeczytania. Wzrok zatrzymuje się na każdym wyróżnieniu, a jeśli połowa z nich prowadzi w miejsca bez związku z pytaniem czytelnika, buduje się nieufność do całego serwisu. Na telefonie dochodzi jeszcze jedno: gęsto rozstawione odnośniki w akapicie są trudne do trafienia palcem i część kliknięć jest przypadkowa.
Widzę też odwrotne przegięcie — moduły „polecane dla ciebie” tak duże, że wypychają treść poniżej ekranu. To już nie kwestia linkowania, a rozkładu strony, ale w projektach automatyzacji jedno i drugie zwykle wdraża ta sama osoba w tym samym tygodniu.
Mam na to jedną prostą regułę: jeśli po wdrożeniu sam nie chcę czytać własnego artykułu, wracam do ustawień. Wskaźniki tego nie wychwycą wystarczająco szybko.
Przy dużych serwisach dochodzi wymiar czysto ilościowy.
Każdy dodany odnośnik to kolejna ścieżka, którą robot może pójść. Jeśli automat linkuje do adresów z parametrami, wyników filtrowania czy paginacji, potrafi w krótkim czasie wygenerować mnóstwo nowych, bezwartościowych tras w serwisie. Przy sklepie z filtrami to najkrótsza droga do sytuacji, w której roboty spędzają większość czasu na kombinacjach, których nikt nie szukał.
Druga rzecz to umiejscowienie. Odnośniki wstawione w powtarzalnych elementach szablonu, obecne na każdej podstronie, mają dla wyszukiwarki inne znaczenie niż te wplecione w treść. Nie znaczy, że są bezużyteczne — nawigacja jest potrzebna. Znaczy, że nie należy liczyć na to, że tysiąc identycznych odnośników w stopce zastąpi kilka sensownych połączeń w tekście.
Dlatego przy audycie takich wdrożeń zawsze rozdzielam linki szablonowe od kontekstowych i liczę je osobno. Bez tego rozdziału raport pokazuje setki tysięcy połączeń i nie mówi zupełnie nic.
Automatyzację wdrażam wyłącznie wtedy, gdy potrafię ją wyłączyć jednym ruchem i wiem, co dokładnie zmieniła.
Zaczynam od jednej sekcji serwisu, nie od całości. Zanim ruszę, zapisuję pełny stan wyjściowy: crawl z listą wszystkich połączeń, żeby po miesiącu móc porównać. Po wdrożeniu robię crawl ponownie i sprawdzam trzy liczby: ile odnośników przypada na tekst w najgorszym przypadku, ile adresów docelowych zbiera nieproporcjonalnie dużo połączeń i ile linków prowadzi do przekierowań lub błędów.
Ustawiam też twarde ograniczenia w samej regule — maksymalnie kilka odnośników na artykuł, tylko jedno wystąpienie danej frazy w obrębie tekstu, wyłącznie adresy z listy dopuszczonych. Reguła bez limitu górnego jest w mojej ocenie głównym źródłem wszystkich opisanych wcześniej awarii.
Na koniec wpisuję do kalendarza przegląd co kwartał. Skrypt działa dalej, kiedy strona się zmienia, i tylko regularne zaglądanie do wyniku wyłapuje moment, w którym zaczął pracować przeciwko serwisowi.
„W pełni bezpieczne” to sformułowanie, którego nie użyję o żadnym rozwiązaniu wdrożonym w kilkudziesięciu tysiącach miejsc naraz.
Uważam natomiast, że automatyzacja z limitami, z listą dopuszczonych adresów docelowych, generowana po stronie serwera i przeglądana raz na kwartał jest wyraźnie bezpieczniejsza niż stan, który zastaję na większości dużych portali — czyli brak jakiejkolwiek struktury i przypadkowe odnośniki dodawane przez dwudziestu redaktorów według dwudziestu różnych intuicji.
Ryzyko rośnie liniowo z zakresem swobody, którą oddasz skryptowi, i z czasem od ostatniego przeglądu. Te dwie zmienne masz pod kontrolą i o nich warto rozmawiać, a nie o karach, których w tym obszarze nie ma.
Używamy plików cookies, aby ułatwić Ci nawigację oraz wykonywanie określonych funkcji. Szczegółowe informacje o wszystkich plikach cookies znajdziesz w każdej kategorii zgody poniżej.
Pliki cookies oznaczone jako "Niezbędne" są przechowywane w Twojej przeglądarce, ponieważ są one kluczowe dla zapewnienia podstawowych funkcji strony.
Używamy również plików cookies firm trzecich, które pomagają nam analizować, w jaki sposób korzystasz z tej strony, zapamiętują Twoje preferencje oraz dostarczają treści i reklamy odpowiednie dla Ciebie. Te pliki cookies będą przechowywane w Twojej przeglądarce tylko za Twoją uprzednią zgodą.
Możesz zdecydować, czy chcesz włączyć lub wyłączyć niektóre bądź wszystkie te pliki cookies, jednak wyłączenie niektórych z nich może wpłynąć na Twoje doświadczenia podczas przeglądania strony.
| Cookie | Czas przechowywania | Opis |
|---|---|---|
| __cf_bm | 13 minutes | Cloudflare bot management — distinguishes humans from bots. |
| rc::* | Persistent | Google reCAPTCHA — localStorage holding anti-bot challenge state. |
| Cookie | Czas przechowywania | Opis |
|---|---|---|
| wpEmojiSettingsSupports | Session | WordPress — sessionStorage flag caching whether the browser can render emoji (feature detection). |
| ytidb* | Persistent | YouTube — IndexedDB storing playback/search state for embedded videos. |
| Cookie | Czas przechowywania | Opis |
|---|---|---|
| _ga_* | 400 days | Google Analytics 4 — persists session state per property. |
| _ga | 400 days | Google Analytics — distinguishes unique users via a client id. |
| Cookie | Czas przechowywania | Opis |
|---|---|---|
| NID | 183 days | Google — stores preferences for personalized ads. |
| fr | 90 days | Meta — encrypted Facebook id and browser id for ads. |
| _gcl_au | 90 days | Google AdSense/Ads — experiments with advertising efficiency (conversion linker). |
| Cookie | Czas przechowywania | Opis |
|---|---|---|
| __Secure-YNID | 180 days | |
| YSC | Session | |
| __Secure-ROLLOUT_TOKEN | 180 days | |
| VISITOR_INFO1_LIVE | 180 days | |
| VISITOR_PRIVACY_METADATA | 180 days | |
| datr | 400 days | |
| sb | 400 days | |
| wd | 7 days |