
Una libreria Python per utilizzare il grande pool di IP di AWS API Gateway come proxy per generare IP pseudo-infiniti per web scraping e brute forcing.
Orgogliosamente sponsorizzato da Swiftproxy
Proxy residenziali ad alte prestazioni con un pool di oltre 80 milioni di IP in più di 195 paesi — migliora il tasso di successo delle richieste e riduce i blocchi IP durante la raccolta di dati su larga scala e l'automazione del browser. Perfetto per l'uso con
requests-ip-rotator, Playwright, Selenium e altri strumenti di scraping.
Una libreria Python per utilizzare il grande pool di IP di AWS API Gateway come proxy per generare IP pseudo-infiniti per scraping web e brute forcing.
Questa libreria permetterà all'utente di bypassare i limiti di frequenza basati su IP per siti e servizi.
Gli header X-Forwarded-For vengono randomizzati automaticamente e applicati a meno che non vengano forniti. Questo perché altrimenti AWS invierebbe il vero indirizzo IP del client in questo header.
AWS ApiGateway invia le sue richieste da qualsiasi IP disponibile - e poiché l'infrastruttura AWS è così grande, è quasi garantito che sia diverso ogni volta. Utilizzando ApiGateway come proxy, possiamo sfruttare questo per inviare richieste da IP diversi ogni volta. Tieni presente che queste richieste possono essere facilmente identificate e bloccate, poiché vengono inviate con header AWS unici (ad esempio "X-Amzn-Trace-Id").
Questo pacchetto è su pypi, quindi puoi installarlo con uno dei seguenti metodi:
pip3 install requests-ip-rotatorpython3 -m pip install requests-ip-rotator
import requests
from requests_ip_rotator import ApiGateway
# Create gateway object and initialise in AWS
gateway = ApiGateway("https://site.com")
gateway.start()
# Assign gateway to session
session = requests.Session()
session.mount("https://site.com", gateway)
# Send request (IP will be randomised)
response = session.get("https://site.com/index.php", params={"theme": "light"})
print(response.status_code)
# Delete gateways
gateway.shutdown()
import requests
from requests_ip_rotator import ApiGateway
with ApiGateway("https://site.com") as g:
session = requests.Session()
session.mount("https://site.com", g)
response = session.get("https://site.com/index.php")
print(response.status_code)
Ricorda che se i gateway non vengono arrestati tramite il metodo shutdown() quando si utilizza il metodo #1, potresti essere addebitato in futuro.
API Gateway è gratuito per il primo milione di richieste per regione, il che significa che per la maggior parte dei casi d'uso dovrebbe essere completamente gratuito.
Al momento della scrittura, AWS addebita circa $3 per milione di richieste dopo aver superato la soglia gratuita.
Se le tue richieste coinvolgono flussi di dati, AWS addebiterà una tariffa di trasferimento dati di $0,09 per GB.
Si consiglia di configurare l'autenticazione tramite variabili d'ambiente. Con awscli, puoi eseguire aws configure per farlo, oppure in alternativa puoi impostare direttamente le variabili AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY seguendo i passaggi menzionati in questo thread.
Puoi trovare il tuo ID chiave di accesso e il segreto seguendo il tutorial ufficiale AWS.
La classe ApiGateway può essere creata con i seguenti parametri opzionali:
from ip_rotator import ApiGateway, EXTRA_REGIONS, ALL_REGIONS
# Gateway to outbound HTTP IP and port for only two regions
gateway_1 = ApiGateway("http://1.1.1.1:8080", regions=["eu-west-1", "eu-west-2"])
# Gateway to HTTPS google for the extra regions pack, with specified access key pair
gateway_2 = ApiGateway("https://www.google.com", regions=EXTRA_REGIONS, access_key_id="ID", access_key_secret="SECRET")
Un oggetto ApiGateway deve quindi essere avviato utilizzando il metodo start.
Per impostazione predefinita, se un ApiGateway esiste già per il sito, utilizzerà l'endpoint esistente invece di crearne uno nuovo.
Questo non richiede parametri, ma accetta i seguenti:
# Starts new ApiGateway instances for site, or locates existing endpoints if they already exist.
gateway_1.start()
# Starts new ApiGateway instances even if some already exist.
gateway_2.start(force=True)
Le richieste vengono inviate collegando l'oggetto ApiGateway a un oggetto Session di requests.
Il sito fornito in mount deve corrispondere al sito passato nel costruttore di ApiGateway.
import requests
# Posts a request to the site created in gateway_1. Will be sent from a random IP.
session_1 = requests.Session()
session_1.mount("http://1.1.1.1:8080", gateway_1)
session_1.post("http://1.1.1.1:8080/update.php", headers={"Hello": "World"})
# Send 127.0.0.1 as X-Forwarded-For header in outbound request (otherwise X-Forwarded-For is randomised).
session_1.post("http://1.1.1.1:8080/update.php", headers={"X-Forwarded-For", "127.0.0.1"})
# Execute Google search query from random IP
session_2 = requests.Session()
session_2.mount("https://www.google.com", gateway_2)
session_2.get("https://www.google.com/search?q=test")
È importante arrestare le risorse ApiGateway una volta che hai finito con esse, per evitare endpoint pubblici pendenti che possono causare addebiti eccessivi sul tuo account.
Questo viene fatto tramite il metodo shutdown dell'oggetto ApiGateway. Chiuderà tutte le risorse per le regioni specificate nel costruttore dell'oggetto ApiGateway.
# This will shutdown all gateway proxies for "http://1.1.1.1:8080" in "eu-west-1" & "eu-west-2"
gateway_1.shutdown()
# This will shutdown all gatewy proxies for "https://www.google.com" for all regions in ip_rotator.EXTRA_REGIONS
gateway_2.shutdown()
Alternatively, you can selectively shutdown specific endpoints, if needed. To do this, simply pass in an array of endpoints to the shutdown() method, i.e:
# This will force start a new gateway (i.e. create new endpoints even if some exist on the region already), and then delete the first 3 of them only.
gateway_3 = ApiGateway("http://1.1.1.1:8082", regions=ALL_REGIONS)
endpoints = gateway_3.start(force=True)
gateway_3.shutdown(endpoints[:3])
Tieni presente che qualsiasi gateway avviato con il parametro require_manual_deletion impostato su True non verrà eliminato tramite il metodo shutdown e dovrà essere eliminato
manualmente tramite la CLI AWS o il sito Web.
Il codice principale di creazione e organizzazione del gateway è stato adattato dall'IPRotate Burp Extension di RhinoSecurityLabs.
Il concetto di forwarding dell'header X-My-X-Forwarded-For è stato originariamente concepito da ustayready nel suo proxy fireprox.
| Nome | Descrizione | Obbligatorio | Predefinito |
|---|
| site | Il sito (senza percorso) a cui verranno inviate le richieste. | True | |
| regions | Un array di regioni AWS in cui configurare i gateway. | False | ip_rotator.DEFAULT_REGIONS |
| access_key_id | ID della chiave di accesso AWS (sovrascriverà le variabili d'ambiente). | False | Dipende dalle variabili d'ambiente. |
| access_key_secret | Segreto della chiave di accesso AWS (sovrascriverà le variabili d'ambiente). | False | Dipende dalle variabili d'ambiente. |
| verbose | Include messaggi di stato ed errori. | False | True |
| Nome | Descrizione | Obbligatorio | Predefinito |
|---|
| endpoints | Array di endpoint preesistenti (ad esempio da una sessione precedente). | False | |
| force | Crea un nuovo set di endpoint, anche se alcuni esistono già. | False | False |
| require_manual_deletion | Booleano che specifica se gli ApiGateway dovrebbero persistere nelle chiamate shutdown() | False | False |