PowerShell to potężne narzędzie do automatyzacji zapytań HTTP — od monitorowania API po web scraping. Kiedy jednak docelowy endpoint blokuje zapytania z zakresów IP należących do centrów danych (AWS, Azure, GCP), potrzebujesz zaufanego proxy. W tym przewodniku pokazujemy używanie proxy w PowerShell z cmdletami Invoke-WebRequest i Invoke-RestMethod, wykorzystując infrastrukturę ProxyHat (gate.proxyhat.com:8080).
Dlaczego używanie proxy w PowerShell ma znaczenie
Wiele publicznych API i stron internetowych stosuje geolokalizację oraz filtrację ASN. Zapytania z adresów Microsoft Azure czy Amazon AWS są często odrzucane z kodem 403 lub kierowane na stronę CAPTCHA. Proxy w PowerShell pozwala maskować źródłowy adres IP, symulując ruch z lokalnego dostawcy internetowego (residential proxy), co zwiększa wskaźnik sukcesu zapytań i omija blokady oparte na reputacji IP.
Według dokumentacji Microsoft Learn — Invoke-WebRequest, cmdlet ten obsługuje parametry -Proxy, -ProxyCredential oraz -ProxyUseDefaultCredentials, co czyni go idealnym kandydatem do pracy z zewnętrznymi serwerami proxy.
1. Podstawowe parametry proxy w Invoke-WebRequest i Invoke-RestMethod
Najprostsza forma konfiguracji to przekazanie URL proxy oraz poświadczeń. ProxyHat używa bramy HTTP na porcie 8080:
# Przykład 1: podstawowe użycie proxy z Invoke-WebRequest
$proxyUrl = 'http://gate.proxyhat.com:8080'
$cred = Get-Credential # wpisz nazwę użytkownika i hasło ProxyHat
$response = Invoke-WebRequest -Uri 'https://httpbin.org/ip' `
-Proxy $proxyUrl `
-ProxyCredential $cred `
-UseBasicParsing
Write-Host $response.Content
Parametr -ProxyUseDefaultCredentials przydaje się, gdy poświadczenia proxy są identyczne z poświadczeniami Windows bieżącego użytkownika — w przypadku ProxyHat rzadko, ale warto znać tę opcję:
# Przykład 2: domyślne poświadczenia (przydatne w środowiskach korporacyjnych)
$response = Invoke-WebRequest -Uri 'https://httpbin.org/headers' `
-Proxy 'http://gate.proxyhat.com:8080' `
-ProxyUseDefaultCredentials `
-UseBasicParsing
Dla Invoke-RestMethod proxy składnia jest identyczna — różnica polega na automatycznej deserializacji JSON:
# Przykład 3: Invoke-RestMethod z proxy
$cred = Get-Credential
$data = Invoke-RestMethod -Uri 'https://httpbin.org/json' `
-Proxy 'http://gate.proxyhat.com:8080' `
-ProxyCredential $cred
$data.slideshow.title
2. Geo-targeting i sesje sticky w nazwie użytkownika
ProxyHat pozwala kodować flagi geo-targeting i sesji w nazwie użytkownika. Format to np. user-country-US lub user-session-abc123. W PowerShell musisz przekształcić to na obiekt [pscredential], ponieważ Get-Credential nie akceptuje dowolnego stringu jako nazwy użytkownika bez interakcji.
# Przykład 4: geo-targeting + sticky session w nazwie użytkownika
$baseUser = 'myuser'
$pass = 'mypass'
$country = 'US'
$sessionId = 'task-001'
# Konstruujemy nazwę użytkownika z flagami
$username = "$baseUser-country-$country-session-$sessionId"
$securePass = ConvertTo-SecureString $pass -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential($username, $securePass)
$response = Invoke-WebRequest -Uri 'https://httpbin.org/ip' `
-Proxy 'http://gate.proxyhat.com:8080' `
-ProxyCredential $cred `
-UseBasicParsing
Write-Host $response.Content
Dla bardziej szczegółowej kontroli — np. ustawienia proxy na poziomie HttpClient — możesz użyć obiektu [System.Net.WebProxy]:
# Przykład 5: System.Net.WebProxy z flagami geo
Add-Type -AssemblyName System.Net.Http
$proxy = New-Object System.Net.WebProxy('http://gate.proxyhat.com:8080', $true)
$proxy.Credentials = New-Object System.Net.NetworkCredential(
'myuser-country-DE-city-berlin', 'mypass'
)
$handler = New-Object System.Net.Http.HttpClientHandler
$handler.Proxy = $proxy
$handler.UseProxy = $true
$client = New-Object System.Net.Http.HttpClient($handler)
$result = $client.GetStringAsync('https://httpbin.org/ip').Result
Write-Host $result
Lista dostępnych lokalizacji znajduje się na stronie ProxyHat Locations.
3. Utrzymywanie ciasteczek i nagłówków między żądaniami
Przy PowerShell web scraping często musisz utrzymać sesję HTTP między kolejnymi żądaniami — np. zalogować się, a następnie pobrać chronione strony. Służy do tego obiekt WebRequestSession tworzony przez -SessionVariable:
# Przykład 6: sesja z ciasteczkami i własnym User-Agent
$cred = New-Object System.Management.Automation.PSCredential(
'myuser-country-GB', (ConvertTo-SecureString 'mypass' -AsPlainText -Force)
)
# Pierwsze żądanie — tworzy sesję
$loginResp = Invoke-WebRequest -Uri 'https://httpbin.org/cookies/set?token=abc123' `
-Proxy 'http://gate.proxyhat.com:8080' `
-ProxyCredential $cred `
-SessionVariable session `
-UserAgent 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' `
-Headers @{ 'Accept' = 'application/json' } `
-UseBasicParsing
# Drugie żądanie — korzysta z tej samej sesji
$nextResp = Invoke-WebRequest -Uri 'https://httpbin.org/cookies' `
-Proxy 'http://gate.proxyhat.com:8080' `
-ProxyCredential $cred `
-WebSession $session `
-UseBasicParsing
Write-Host $nextResp.Content
Wskazówka: Używaj
-SessionVariable(zapisuje sesję) przy pierwszym żądaniu i-WebSession(odczytuje sesję) przy kolejnych. Mieszanie ich może prowadzić do utraty ciasteczek.
4. Residential proxy dla endpointów blokujących datacenter IP
Endpointy, które skutecznie blokują zakresy AWS/Azure, wymagają residential proxy. ProxyHat oferuje sieci residential, mobile i datacenter — ceny i plany znajdziesz na stronie. Przy paginacji JSON API warto rotować sesje i dodać retry/backoff.
# Przykład 7: paginacja API z rotacją sesji i retry/backoff
$baseUser = 'myuser'
$pass = 'mypass'
$proxyUrl = 'http://gate.proxyhat.com:8080'
$page = 1
$maxPages = 10
$results = @()
for ($page = 1; $page -le $maxPages; $page++) {
$sessionId = "page-$page-$(Get-Date -Format 'yyyyMMddHHmmss')"
$username = "$baseUser-country-US-session-$sessionId"
$cred = New-Object System.Management.Automation.PSCredential(
$username, (ConvertTo-SecureString $pass -AsPlainText -Force)
)
try {
$data = Invoke-RestMethod `
-Uri "https://api.example.com/items?page=$page" `
-Proxy $proxyUrl `
-ProxyCredential $cred `
-MaximumRetryCount 3 `
-RetryIntervalSec 5 `
-UserAgent 'MyBot/1.0'
if ($data.items.Count -eq 0) { break }
$results += $data.items
Write-Host "Pobrano stronę $page — $($data.items.Count) rekordów"
} catch {
Write-Warning "Błąd na stronie $page: $($_.Exception.Message)"
Start-Sleep -Seconds 10
$page-- # ponów tę samą stronę
}
}
Write-Host "Łącznie pobrano: $($results.Count) rekordów"
Parametry -MaximumRetryCount i -RetryIntervalSec są dostępne w PowerShell 6+. W starszych wersjach (Windows PowerShell 5.1) musisz implementować retry ręcznie w bloku try/catch.
Rotacja IP vs sesje sticky
| Strategia | Kiedy stosować | Flaga ProxyHat |
|---|---|---|
| Rotacja na żądanie | Srapowanie wielu niezależnych stron | Brak flagi session |
| Sesja sticky | Paginacja, logowanie, wielokrokowe formularze | -session-ID |
| Geo-targeting | Lokalizowane treści, SERP tracking | -country-XX |
Więcej o SERP tracking znajdziesz w dedykowanym przypadku użycia.
5. Wskazówki produkcyjne
Zmienne środowiskowe dla procesów potomnych
# Przykład 8: ustawienie proxy przez zmienne środowiskowe
$env:HTTP_PROXY = 'http://myuser-country-FR:mypass@gate.proxyhat.com:8080'
$env:HTTPS_PROXY = 'http://myuser-country-FR:mypass@gate.proxyhat.com:8080'
# Teraz narzędzia takie jak curl, git czy dotnet odziedziczą proxy
Invoke-Expression 'curl https://httpbin.org/ip'
Konfiguracja TLS
W Windows PowerShell 5.1 domyślnie włączony jest tylko TLS 1.0/1.1, co wielu nowoczesnych API odrzuca. Wymuś TLS 1.2:
# Przykład 9: wymuszenie TLS 1.2
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$response = Invoke-WebRequest -Uri 'https://httpbin.org/ip' `
-Proxy 'http://gate.proxyhat.com:8080' `
-ProxyCredential $cred `
-UseBasicParsing
W PowerShell 7 (Core) ta konfiguracja nie jest potrzebna — HttpClient domyślnie używa TLS 1.2+.
Równoległość w PowerShell 7
# Przykład 10: ForEach-Object -Parallel z proxy
$urls = 1..20 | ForEach-Object { "https://api.example.com/items?page=$_" }
$urls | ForEach-Object -Parallel {
$proxyUrl = 'http://gate.proxyhat.com:8080'
$sessionId = "parallel-$($_)-$([guid]::NewGuid().ToString().Substring(0,8))"
$cred = New-Object System.Management.Automation.PSCredential(
"myuser-country-US-session-$sessionId",
(ConvertTo-SecureString 'mypass' -AsPlainText -Force)
)
try {
$data = Invoke-RestMethod -Uri $_ -Proxy $proxyUrl -ProxyCredential $cred -TimeoutSec 15
Write-Host "OK: $_ — $($data.items.Count) rekordów"
} catch {
Write-Warning "Błąd: $_ — $($_.Exception.Message)"
}
} -ThrottleLimit 10
Parametr -ThrottleLimit 10 ogranicza współbieżność do 10 jednoczesnych żądań — warto dostosować do limitów ProxyHat i docelowego API.
6. Kwestie etyczne i prawne
Używanie proxy w PowerShell nie zwalnia z przestrzegania prawa. Kluczowe zasady:
- Najpierw oficjalne API. Jeśli witryna oferuje publiczne API, użyj go zamiast scrapingu.
- Tylko dane publiczne. Nie omijaj mechanizmów autoryzacji ani paywalli.
- robots.txt. Sprawdzaj i respektuj dyrektywy
Disallow. - CFAA (USA). Computer Fraud and Abuse Act może mieć zastosowanie do nieautoryzowanego dostępu — zobacz Department of Justice — Cybercrime.
- RODO/GDPR (UE). Pobieranie danych osobowych wymaga podstawy prawnej. Zobacz gdpr.eu.
- Rate limiting. Utrzymuj rozsądne opóźnienia — np. 1 żądanie na 2 sekundy.
Reguła kciuka: Jeśli nie chciałbyś, aby ktoś robił to z Twoją infrastrukturą, prawdopodobnie nie powinieneś robić tego z cudzą.
Kluczowe wnioski
- Używaj
-Proxy,-ProxyCredentiali-ProxyUseDefaultCredentialsdo podstawowej konfiguracji proxy w PowerShell. - Geo-targeting i sesje sticky koduj w nazwie użytkownika ProxyHat:
user-country-XX-session-ID. -SessionVariablei-WebSessionutrzymują ciasteczka między żądaniami — kluczowe dla logowania i paginacji.- Residential proxy są niezbędne dla endpointów blokujących zakresy datacenter IP.
-MaximumRetryCounti-RetryIntervalSeczapewniają automatyczny retry w PowerShell 6+.- W PowerShell 7 używaj
ForEach-Object -Paralleldla współbieżnego scrapingu z rotacją sesji. - Zawsze respektuj robots.txt, CFAA, GDPR i warunki korzystania z serwisu.
Szczegóły techniczne konfiguracji ProxyHat znajdziesz w oficjalnej dokumentacji. ProxyHat SDK współdzieli te same endpointy (gate.proxyhat.com:8080 dla HTTP, gate.proxyhat.com:1080 dla SOCKS5), więc wszystkie przykłady powyżej działają identycznie z SDK.






