Użycie proxy do pracy z API

Krok po kroku instrukcja automatyzacji żądań API przez serwer proxy na przykładzie języka Go. Dowiedz się, jak omijać limity zapytań i blokady geograficzne.

Олександр Л.

Олександр Л.

11 czerwca 20253319

Interfejs programowania aplikacji (szeroko znany jako API) to powszechna dziś praktyka komunikacji ze stronami internetowymi i aplikacjami. W procesie korzystania z API można w łatwy i ustrukturyzowany sposób wymieniać funkcje i dane, bezproblemowo integrując procesy robocze i strumienie danych między różnymi witrynami, aplikacjami i systemami. Na przykład między Twoją stroną a serwerem danych możesz wymieniać takie informacje, jak kursy walut, prognozy pogody, aktualizacje cen produktów i wiele innych. Serwer proxy API do pracy z API jest potrzebny z kilku powodów:

  • API może być zaprogramowane tylko na określoną maksymalną liczbę żądań z jednego adresu IP w jednostce czasu, a po przekroczeniu progu Twój adres IP może zostać zablokowany;
  • Dostęp do API może zostać odrzucony ze względu na Twój region geograficzny;
  • Liczba połączeń z serwerem może być ograniczona, i to bardzo rygorystycznie.

Potrzebujesz proxy API, aby wymiana danych nie została przerwana. W praktyce wykorzystuje się do tego automatyzację pracy poprzez umieszczenie kodu zawierającego niezbędne dane. Kod może być napisany w różnych językach programowania: Python, Go, Node.js, JavaScript, PHP i innych. Jako przykład weźmiemy język Go, który doskonale sprawdza się w programowaniu webowym. Pamiętaj, że do stworzenia kodu musisz posiadać pewne podstawy programowania (wiedzę o tym, czym jest kod i jakie zmienne w nim określić). Alternatywnie możesz wynająć specjalistę do wykonania konkretnych zadań.

Automatyzujemy wymianę danych między API a proxy

Załóżmy, że musisz zautomatyzować powiązanie proxy-API w celu pobierania prognozy pogody na jutro z publicznej domeny Weather.com (podajemy to wyłącznie w celu stworzenia przejrzystego przykładowego kodu). Instrukcja krok po kroku, jak pracować z serwerem proxy przy użyciu języka Go, wygląda następująco:

  1. Pobierz adres proxy w formacie IP:port:użytkownik:hasło. Będzie to na przykład 123.45.67.89:8080:user123:pass123.
  2. Zarejestruj się w usłudze WeatherAPI.com, aby uzyskać unikalny klucz API oraz pełny adres, z którego będziesz pobierać dane pogodowe, na przykład https://api.weatherapi.com/v1/forecast.json?key=YOUR_API_KEY&q=Kyiv&days=2, gdzie days=2 to data pobrania danych pogodowe (na przykład na jutro).
  3. Utwórz kod żądania, który w naszym przypadku będzie wyglądał następująco: Go
    package main
    import (
        "fmt"
        "io/ioutil"
        "net/http"
        "net/url"
    )
    func main() {
        // === Krok 1: Konfiguracja proxy ===
        proxyStr := "http://user123:[email protected]:8080"
        proxyURL, err := url.Parse(proxyStr)
        if err != nil {
            fmt.Println("Błąd w adresie proxy:", err)
            return
        }
        // === Krok 2: Skonfiguruj klienta HTTP z proxy ===
        transport := &http.Transport{Proxy: http.ProxyURL(proxyURL)}
        client := &http.Client{Transport: transport}
        // === Krok 3: Utwórz żądanie do API pogodowego ===
        apiKey := "abc123456789xyz" // ← Twój klucz API
        city := "Kyiv"               // ← Twoje miasto, w tym przypadku Kijów.
        apiURL := fmt.Sprintf("https://api.weatherapi.com/v1/forecast.json?key=%s&q=%s&days=2", apiKey, city)
        req, err := http.NewRequest("GET", apiURL, nil)
        if err != nil {
            fmt.Println("Błąd podczas tworzenia żądania:", err)
            return
        }
        // === Krok 4: Wyślij żądanie przez proxy (w formacie JSON) ===
        resp, err := client.Do(req)
        if err != nil {
            fmt.Println("Błąd podczas wysyłania żądania:", err)
            return
        }
        defer resp.Body.Close()
        // === Krok 5: Odczytaj i zapisz otrzymaną odpowiedź ===
        body, err := ioutil.ReadAll(resp.Body)
        if err != nil {
            fmt.Println("Błąd podczas odczytywania odpowiedzi:", err)
            return
        }
        fmt.Println("Odpowiedź z API:")
        fmt.Println(string(body))
    }
    

W rezultacie użycia proxy API service będziesz mógł po uruchomieniu tego kodu otrzymać potrzebne dane. Pamiętaj, że pisanie i przetwarzanie kodu w dowolnym języku programowania wymaga posiadania środowiska programistycznego do pracy z kodem. W naszym przykładzie jest to język programowania Go, który należy uzyskać instalując odpowiednie oprogramowanie dla swojego systemu operacyjnego. Edytor tekstu potrzebny do pisania kodu i parsowania plików odpowiedzi JSON to Visual Studio Code, GoLand lub Sublime Text/Notepad++ (edytory z podświetlaniem składni). Będziesz także potrzebować skonfigurowanego serwera proxy oraz wiersza poleceń (Windows) lub Terminala (MacOS/Linux) do uruchomienia napisanego kodu.


Popularne pytania

Co zrobić, jeśli docelowe API blokuje żądania nawet przez proxy z powodu odcisku palca TLS (TLS Fingerprint)?

Nowoczesne systemy ochrony (np. Cloudflare) analizują nie tylko IP, ale także odcisk palca TLS Twojego klienta HTTP. Standardowy klient Go (net/http) generuje swój specyficzny odcisk palca. Jeśli API Cię blokuje, musisz użyć zewnętrznych bibliotek do symulacji odcisku palca przeglądarki (np. utls) lub przejść na proxy mieszkaniowe (residential) o najwyższym poziomie zaufania.

Błąd 429 oznacza, że przekroczyłeś limity żądań określone przez API. Jeśli używasz jednego statycznego proxy (IPv4 lub IPv6), serwer docelowy widzi wszystkie zapytania jako pochodzące z jednego adresu. Aby rozwiązać ten problem, musisz zaimplementować pulę proxy w swoim kodzie i rotować je przy każdym zapytaniu lub użyć usług rotacyjnego proxy po stronie dostawcy.

Tak, mechanizm transportowy w Go (http.Transport) automatycznie obsługuje metodę HTTP CONNECT podczas wysyłania żądania do punktu końcowego HTTPS przez proxy HTTP. Tworzy to szyfrowany tunel pomiędzy Twoim skryptem a docelowym API. Sam serwer proxy widzi wtedy tylko hosta i port docelowy, ale nie ma dostępu do zawartości danych ani kluczy API.

Domyślnie http.Client nie ma ustawionego limitu czasu, co może prowadzić do nieskończonego oczekiwania w przypadku awarii proxy. Najlepszą praktyką jest zawsze jawne definiowanie limitu czasu podczas inicjalizacji klienta. Na przykład: client := &http.Client{Transport: transport, Timeout: 10 * time.Second}. Wymusi to przerwanie żądania po 10 sekundach.

Użycie proxy w kodzie (jak w przykładzie) przekierowuje surowy ruch sieciowy Twojego skryptu. Warstwa usługowa proxy API (API Gateway lub Reverse Proxy) działa jako pośrednik, który może automatycznie dodawać nagłówki autoryzacji, buforować odpowiedzi, logować metryki i bilansować obciążenie. Do zbierania danych lub omijania blokad geo w zupełności wystarczy integracja w kodzie.

Jeśli znaki specjalne (takie jak #, @, $) zostaną przekazane w ciągu adresu proxyStr w surowej formie, parser zgłosi błąd lub nieprawidłowo zinterpretuje hosta. Aby bezpiecznie zbudować ciąg proxy, użyj funkcji url.UserPassword(user, pass). Automatycznie zakoduje ona znaki w formacie URL-escape, zapewniając poprawną transmisję danych do serwera proxy.