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.
Олександр Л.
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:
- Pobierz adres proxy w formacie
IP:port:użytkownik:hasło. Będzie to na przykład123.45.67.89:8080:user123:pass123. - 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, gdziedays=2to data pobrania danych pogodowe (na przykład na jutro). - 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.
Dlaczego pojawia się błąd „429 Too Many Requests”, skoro wdrożyłem już proxy?
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.
Czy dostarczony kod obsługuje bezpieczne żądania HTTPS do API za pośrednictwem proxy HTTP?
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.
Jak skonfigurować limity czasu (timeouts) w Go, aby skrypt nie zawieszał się w przypadku awarii serwera proxy?
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.
Jaka jest różnica między użyciem proxy w kodzie a użyciem API proxy jako warstwy usługowej?
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.
Jak bezpiecznie przekazywać dane uwierzytelniające proxy, jeśli login lub hasło zawierają znaki specjalne?
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.
