Serwer odpowiedział 200 OK.
W środku była tylko poczekalnia dla botów
Ciao! 🇵🇱🇮🇹
Mój skrypt kontrolny zgłosił sześć poważnych błędów na stronie, która działała bez zarzutu. Najpierw się przestraszyłem, a potem zrobiło mi się trochę głupio.
Lecimy z tematem 🚀
Kod 200, który niczego nie znaczył
Opiekuję się stroną mojej wspólnoty na WordPressie. Mam do niej skrypt kontrolny, który przechodzi całą witrynę: sprawdza przekierowania, stare adresy po poprzedniej stronie na Joomli (mają zwracać 410, czyli „usunięte na stałe”), mapę witryny i odpowiedzi z REST API. Jednego dnia puściłem kilka pełnych przeglądów pod rząd. Po kilkuset zapytaniach z mojego komputera wynik zrobił się czerwony.
Objaw. Sześć FAIL naraz. Stare adresy zwracały 200 zamiast 410. Mapa witryny miała jeden adres. Skrypt do publikacji przez REST API wywrócił się na JSONDecodeError. Każdy z tych komunikatów wyglądał wiarygodnie, bo serwer odpowiadał szybko i z kodem 200. Po kodzie wszystko było w porządku.
Co się działo pod spodem. Ochrona przed botami na hostingu uznała mój adres IP za podejrzany i zamiast prawdziwej odpowiedzi oddawała mu stronę poczekalni z tytułem One moment, please.... Z kodem 200, także pod /wp-json/, gdzie powinien być JSON. Skrypt dostawał więc wszędzie tę samą krótką stronę HTML i rzetelnie ją oceniał: „to nie jest 410”, „w tej mapie jest jeden adres”. Z innego serwera ta sama strona odpowiadała normalnie. Odwiedzający niczego nie zauważyli, a cała blokada dotyczyła tylko mnie.
Jak to wykryć u siebie. Jeśli Twój automat odpytuje stronę na hostingu współdzielonym albo za Cloudflare, przestań wierzyć samemu kodowi odpowiedzi. Sprawdzaj, czy w środku jest to, czego się spodziewasz: przy API typ treści application/json, przy stronie konkretny element, który zawsze tam jest. Drugi test: puść to samo zapytanie z innego adresu IP. Różne wyniki z dwóch miejsc to prawie zawsze filtr po drodze, a nie błąd na stronie.
Jak naprawiłem. Skrypty szukają teraz tytułu strony poczekalni w pierwszych kilku tysiącach znaków odpowiedzi. Gdy go znajdą, rzucają osobny wyjątek i kończą pracę z komunikatem „BLOKADA, spróbuj za kilkanaście minut”, bez interpretowania wyniku i bez zapisywania czegokolwiek. Zmniejszyłem też liczbę równoległych zapytań z ośmiu do trzech. Kilka dni później blokada wróciła akurat przy publikacji, która nie mogła czekać, więc zrobiłem ją przez SSH i WP-CLI, bo filtr dotyczył tylko ruchu HTTP. Po kilkunastu minutach kontrola przeszła na zielono.
Czego to uczy. Kod odpowiedzi mówi tylko, że ktoś odpowiedział. Automat, który ocenia treść, musi najpierw sprawdzić, czy to w ogóle ta treść, o którą pytał, bo inaczej z tą samą powagą raportuje stan strony i stan bramkarza przed nią.
🛠️ Narzędzie
curl -w z %{content_type}
Opcja -w w curlu wypisuje po zapytaniu wybrane dane o odpowiedzi, na przykład curl -s -o /dev/null -w "%{http_code} %{content_type} %{size_download}\n" https://twojastrona.pl/wp-json/. Kod widzi każdy, a typ treści i rozmiar mówią, czy dostałeś to, o co prosiłeś: endpoint JSON, który odpowiada text/html, coś przed Tobą ukrywa. Tym samym poleceniem sprawdzam każdy obrazek do newslettera, zanim wstawię jego adres do tekstu, bo „200 image/png” jest dla mnie jedynym dowodem, że plik naprawdę leży na serwerze. Polecam, bo to jedna linijka, która rozróżnia „serwer odpowiedział” od „serwer odpowiedział tym, czego chciałem”.
https://curl.se/docs/manpage.html#-w
🌍 Ze świata
- Your Bot Protection Is Refusing The Agents You Are Courting. Kin Lane opisuje moją sytuację z drugiej strony lady: firmy blokują automaty i nie wiedzą, że odcinają też tych, na których im zależy. Najbardziej podoba mi się jego rada, żeby po każdej zmianie w ochronie sprawdzić stronę zwykłym curlem, a nie przeglądarką.
- HOST121: Bot challenge blocking API. Twórcy kasy do WooCommerce nadali mojemu problemowi własny kod błędu, bo ich aplikacja dostawała stronę z wyzwaniem zamiast JSON-a. Skoro ktoś musiał to wpisać do dokumentacji, to znaczy, że zdarza się często.
- API Uptime Monitoring: Beyond the 200 OK Check. Konkretna lista, co sprawdzać w treści odpowiedzi, łącznie z kluczem
errorschowanym w odpowiedzi z kodem 200. Gdybym ją przeczytał wcześniej, mój skrypt nie oceniałby strony poczekalni jak mapy witryny.
😄 Na koniec

Ochrona przed botami uznała, że jestem botem. Policzyłem zapytania z tamtego dnia: kilkaset. Miała rację.
Jeśli ktoś w Twoim otoczeniu powinien to przeczytać, prześlij mu ten numer. To najlepsza forma wsparcia.
A jeśli wolisz wesprzeć bezpośrednio: postaw mi kawę.
Cieszę się, że tu jesteś! Aby nie przegapić kolejnych wpisów i pomóc mi tworzyć więcej takich treści, dołącz do grona subskrybentów. To nic nie kosztuje.
Dołącz do Marini Brief →