Wszystkie wpisy

Przedstawiamy Auto: jeden endpoint dla każdego celu

Endpoint Auto wybiera Single, Proxy Finder lub Browser dla każdego requestu, obsługuje zabezpieczenia antybotowe i zwraca sesję do wykorzystania w kolejnym wywołaniu.

Co nowego

Endpoint /api/auto to teraz najkrótsza droga do działającego response dla dowolnego URL. Wskaż mu cel. Tryb Auto wybiera, czy uruchomić request przez Single, Proxy Finder czy Browser, obsługuje zabezpieczenia anti-bot, gdy na nie trafi, i zwraca sesję, którą może wykorzystać twoje następne wywołanie.

Jeden endpoint. Dowolny cel. Brak przełączania trybów z twojej strony.

To cała idea. Reszta tego posta opisuje, jak to działa, ile kosztuje i gdzie ukryte są trudności.

Jak to działa

Pod trybem Auto kryje się drabina poziomów (najtańsze na początku, najdroższe na końcu). Przy każdym request, Auto sprawdza kolejne poziomy, aż jeden z nich dostarczy response, który zaakceptują twoje reguły validate.

Poziomy, po kolei:

  1. Cachowana sesja. Jeśli Auto posiada ciepłą sesję dla tego hosta z poprzedniego wywołania, najpierw używa jej do odtworzenia. Najtańsza ścieżka.
  2. Proxy Finder. Request przez rotacyjne proxy. Dobry wybór dla stron chronionych głównie przez reputację IP.
  3. Browser. Pełny render, który wykonuje JavaScript, rozwiązuje zabezpieczenia anti-bot i zbiera cookies wydawane przez stronę.

Gdy poziom zakończy się sukcesem, Auto zapisuje znalezioną sesję: użyte proxy id, cookies wydane przez stronę oraz User-Agent. Przy kolejnym wywołaniu do tego samego hosta, Auto próbuje najpierw tej samej sesji. Jeśli nadal działa, płacisz za tani poziom, a nie za drogi.

Minimalne wywołanie:

curl -X POST "https://api.foura.ai/api/auto" \
  -H "Authorization: Bearer pk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/data",
    "validate": { "status": { "accept": [200] } }
  }'

Przycięty response:

{
  "status": 200,
  "data": "...",
  "headers": [...],
  "meta": {
    "rung": "cache",
    "solved": false,
    "attempts": 1,
    "credits": 2
  },
  "session": {
    "proxy": "CLN1B8",
    "cookies": [{ "name": "cf_clearance", "value": "..." }],
    "userAgent": "..."
  }
}

Dwa pola mają znaczenie dla tego, co budujesz dalej. meta.rung mówi, która ścieżka wygrała. session to trójka, którą możesz przekazać do wywołania /api/single, aby samodzielnie odtworzyć to samo wyjście. Pole proxy to nieprzejrzysty identyfikator base36 (brak surowych adresów IP), bezpieczny do logowania i przekazywania między systemami.

Wpływ

Tutaj liczą się dwie liczby.

Pierwsze wywołanie chronionej strony uruchamia szczebel Browser: renderowanie, rozwiązywanie, zbieranie cookies, przekazanie strony. To kosztuje około 10 kredytów. Gdy Auto zbuforuje działającą sesję dla tego hosta, kolejne wywołania przechodzą przez Single za 2 kredyty. Zatem drugie wywołanie jest 5x tańsze od pierwszego, a każde następne kosztuje mniej dopóki sesja jest aktywna. Zmierzyliśmy to na produkcji podczas wdrożenia: wyjścia bez cookies (po znalezieniu) są odtwarzane za dokładnie 2 kredyty na wywołanie zamiast 10, które kosztowały, gdy każde request przechodziło przez Proxy Finder.

Druga liczba: nieudane szczeble nie są fakturowane. Jeśli Auto sprawdzi trzy proxy i każde zwróci 403 przed dostarczeniem przez czwarte, liczą się tylko kredyty czwartego. Płacisz za dostarczoną treść, nie za wyszukiwanie.

To jest główna wartość. Drogi szczebel uruchamia się raz, tani działa zawsze później, a ty nie musisz sam pisać logiki buforowania.

Warto zaznaczyć dwa inne zachowania, ponieważ rozwiązują one prawdziwe problemy produkcyjne:

Cele z geoblokadą przestają marnować wyjścia. Gdy strona zwraca błąd 451 (lub stronę pośrednią z blokadą prawną) dla większości wyjść, Auto uczy się, które kraje faktycznie dostarczyły treść. Przy następnym wywołaniu w pierwszej kolejności pobiera nowe wyjścia z tych krajów i rozkłada na nie jednoczesne obciążenie. Dzięki temu jedno szczęśliwe wyjście nie jest przeciążane i nie otrzymuje rate limitu.

Walidacja działa na każdym szczeblu. Strona z niewłaściwą treścią (geoblokada zwracająca status 200 z notą prawną jako body) nigdy nie liczy się jako trafienie. Jeśli twoje validate.data.fail mówi "legal reasons", Auto pracuje dalej, aż szczebel to przejdzie. Nie szczebel z pamięci podręcznej. Nie żaden inny szczebel. Jeśli nic nie przejdzie, otrzymujesz uczciwy błąd z prawdziwym powodem.

Dla zaawansowanych użytkowników

Kilka opcji, które mają znaczenie, gdy przepuszczasz duży ruch przez Auto.

timeout_ms to budżet na całą operację, nie na pojedynczy szczebel. Domyślnie wynosi on 120 sekund. Auto go dzieli: każde pod-wywołanie otrzymuje min(swój naturalny timeout, pozostały budżet), a drabina przestaje uruchamiać nowe szczeble, gdy zostanie zbyt mało czasu. Ustaw 20000 dla interaktywnej pracy z opóźnieniami. Zostaw wartość domyślną dla masowego scrapowania, które toleruje dłuższe ogony.

forceProxy jest domyślnie włączony. Auto nigdy nie dotyka celu ze źródłowego adresu IP FourA, chyba że ustawisz forceProxy: false. Jedno zastrzeżenie: niektóre strony (interaktywny Cloudflare z weryfikacją zaufania IP) faktycznie działają lepiej z czystego adresu IP centrum danych, niż z wyjścia domowego o niskim zaufaniu. Dlatego forceProxy: false może ułatwić, a nie utrudnić niektóre cele. Jeśli na konkretnym hoście powtarzają się zabezpieczenia, warto spróbować to wyłączyć.

ignoreProxies to lista wykluczeń po stronie klienta. Przekaż identyfikatory proxy, o których wiesz, że są spalone (z wcześniejszego session.proxy, który otrzymał rate limit po Twojej stronie), a tryb Auto pominie je wszędzie: przy ponownym użyciu ciepłej sesji, wyszukiwaniu węzłów wyjściowych oraz w podwywołaniu do Proxy Finder. Dzięki temu tryb Auto nie wybierze ponownie węzła wyjściowego, którego kazałeś mu unikać.

meta pozwala również budować własne dashboardy: które hosty uderzyły dzisiaj w warstwę przeglądarki, średnia liczba prób na dostarczenie, stosunek pobrań z rozwiązanym wyzwaniem do pobrań czystych. Jeśli konkretny host nagle rośnie z 2 kredytów do 10, jest to sygnał degradacji sesji, na który możesz zareagować, zanim odczujesz to na rachunku.

Przykład łączący wszystkie cztery elementy:

import requests

r = requests.post(
    "https://api.foura.ai/api/auto",
    headers={"Authorization": "Bearer pk_live_..."},
    json={
        "url": "https://example.com/product/9876",
        "timeout_ms": 30000,
        "forceProxy": True,
        "ignoreProxies": ["CLN1B8", "K7X9AB"],
        "validate": {
            "status": {"accept": [200]},
            "data":   {"accept": ['"price":'], "fail": ["captcha", "legal reasons"]}
        }
    }
).json()

# If Auto delivered, keep the session for the next call to this host
if r.get("status") == 200 and "session" in r:
    session = r["session"]                              # {proxy, cookies, userAgent}
    print(r["meta"]["rung"], r["meta"]["credits"], r["meta"]["attempts"])

Aby uzyskać informacje o samym schemacie validate, zobacz wcześniejszy opis w Reguły Validate decydują teraz, co oznacza sukces.

Co dalej

Dwie rzeczy są obecnie na mapie drogowej dla Auto.

Inspekcja sesji w Dashboard to nasz kolejny krok. Obecnie sesje, które Auto utrzymuje dla każdego hosta, działają wewnątrz usługi, a ty nie masz wglądu w dane podczas debugowania po swojej stronie. Tworzymy widok sesji per host, aby można było zobaczyć zbuforowane sesje, ich wiek, czas życia oraz historię użytych szczebli dla każdej z nich. Dodajemy także przycisk do ręcznego usuwania sesji, gdy twój cel się zmienia i wiesz, że pamięć podręczna jest nieaktualna.

Następnie wprowadzimy bardziej rygorystyczną kontrolę kosztów. Twardy limit kredytów na pojedyncze żądanie (nigdy nie wydawaj więcej niż X na to wywołanie, zwróć wyraźny błąd, jeśli przekroczysz limit) oraz tryb "single-only" dla zespołów, których cele nigdy nie wymagają użycia przeglądarki. Obie te funkcje są dziś ukryte za flagami.

Celem Auto jest to, abyś nie musiał myśleć, który produkt wywołać. Nie oznacza to jednak, że nie możesz sprawdzić, co się wydarzyło. Każdy response zawiera informację o wykorzystanym szczeblu oraz utworzonej sesji. Odczytaj te dwa pola, a dowiesz się dokładnie, dlaczego twoje wywołania API kosztują tyle, ile kosztują.