
Eine Python-Bibliothek zur Nutzung des großen IP-Pools von AWS API Gateway als Proxy, um pseudo-unendliche IPs für Web Scraping und Brute-Force-Angriffe zu generieren.
Stolz gesponsert von Swiftproxy
Hochleistungs-Residential-Proxys mit einem 80M+ IP-Pool in über 195 Ländern — verbessern Sie die Erfolgsquote von Anfragen und reduzieren Sie IP-Blockaden bei der groß angelegten Datenerfassung und Browserautomatisierung. Perfekt für den Einsatz mit
requests-ip-rotator, Playwright, Selenium und anderen Scraping-Tools.
Eine Python-Bibliothek zur Nutzung des großen AWS API Gateway IP-Pools als Proxy zur Generierung pseudo-unendlicher IPs für Web-Scraping und Brute-Force-Angriffe.
Diese Bibliothek ermöglicht es dem Benutzer, IP-basierte Ratenbegrenzungen für Websites und Dienste zu umgehen.
X-Forwarded-For-Header werden automatisch randomisiert und angewendet, sofern nicht angegeben. Andernfalls würde AWS die tatsächliche IP-Adresse des Clients in diesem Header senden.
AWS ApiGateway sendet seine Anfragen von jeder verfügbaren IP – und da die AWS-Infrastruktur so groß ist, ist es fast garantiert, dass diese jedes Mal anders ist. Durch die Verwendung von ApiGateway als Proxy können wir dies nutzen, um Anfragen von verschiedenen IPs zu senden. Bitte beachten Sie, dass diese Anfragen leicht identifiziert und blockiert werden können, da sie mit eindeutigen AWS-Headern (z. B. "X-Amzn-Trace-Id") gesendet werden.
Dieses Paket ist auf PyPI verfügbar, Sie können es über eine der folgenden Methoden installieren:
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)
Bitte denken Sie daran, dass bei Verwendung von Methode #1 Gebühren anfallen können, wenn die Gateways nicht über die shutdown()-Methode heruntergefahren werden.
API Gateway ist für die ersten eine Million Anfragen pro Region kostenlos, was bedeutet, dass dies für die meisten Anwendungsfälle völlig kostenlos sein sollte.
Zum Zeitpunkt der Erstellung dieses Textes berechnet AWS ~3 USD pro Million Anfragen nach Überschreitung des kostenlosen Kontingents.
Wenn Ihre Anfragen einen Datenstrom beinhalten, berechnet AWS Datenübertragungsgebühren von 0,09 USD pro GB.
Es wird empfohlen, die Authentifizierung über Umgebungsvariablen einzurichten. Mit awscli können Sie aws configure ausführen, oder alternativ einfach die Variablen AWS_ACCESS_KEY_ID und AWS_SECRET_ACCESS_KEY selbst setzen, indem Sie den in diesem thread beschriebenen Schritten folgen.
Sie finden Ihre Access Key ID und Ihr Secret, indem Sie dem offiziellen AWS-Tutorial folgen.
Die ApiGateway-Klasse kann mit den folgenden optionalen Parametern erstellt werden:
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")
Ein ApiGateway-Objekt muss dann mit der start-Methode gestartet werden.
Standardmäßig wird, wenn bereits ein ApiGateway für die Site existiert, der vorhandene Endpunkt verwendet, anstatt einen neuen zu erstellen.
Dies erfordert keine Parameter, akzeptiert jedoch die folgenden:
# 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)
Anfragen werden gesendet, indem das ApiGateway-Objekt an ein requests-Session-Objekt angehängt wird.
Die in mount angegebene Site muss mit der Site übereinstimmen, die im ApiGateway-Konstruktor übergeben wurde.
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")
Es ist wichtig, die ApiGateway-Ressourcen nach der Nutzung herunterzufahren, um nicht mehr benötigte öffentliche Endpunkte zu vermeiden, die zu zusätzlichen Kosten auf Ihrem Konto führen können.
Dies geschieht über die shutdown-Methode des ApiGateway-Objekts. Es schließt alle Ressourcen für die im ApiGateway-Konstruktor angegebenen Regionen.
# 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()
Alternativ können Sie bei Bedarf gezielt bestimmte Endpunkte herunterfahren. Dazu übergeben Sie einfach ein Array von Endpunkten an die shutdown()-Methode, z.B.:
# 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])
Bitte beachten Sie, dass Gateways, die mit dem Parameter require_manual_deletion auf True gestartet wurden, nicht über die shutdown-Methode gelöscht werden und manuell über die AWS CLI oder die AWS-Website gelöscht werden müssen.
Der Kerncode zur Erstellung und Organisation der Gateways wurde von RhinoSecurityLabs' IPRotate Burp Extension adaptiert.
Das Konzept der Weiterleitung des X-My-X-Forwarded-For-Headers wurde ursprünglich von ustayready in seinem fireprox Proxy entwickelt.
| Name | Beschreibung | Erforderlich | Standard |
|---|
| site | Die Site (ohne Pfad), an die Anfragen gesendet werden. | Ja | |
| regions | Ein Array von AWS-Regionen, in denen Gateways eingerichtet werden sollen. | Nein | ip_rotator.DEFAULT_REGIONS |
| access_key_id | AWS Access Key ID (überschreibt Umgebungsvariablen). | Nein | Verlässt sich auf Umgebungsvariablen. |
| access_key_secret | AWS Access Key Secret (überschreibt Umgebungsvariablen). | Nein | Verlässt sich auf Umgebungsvariablen. |
| verbose | Status- und Fehlermeldungen einbeziehen. | Nein | True |
| Name | Beschreibung | Erforderlich | Standard |
|---|
| endpoints | Array von bereits vorhandenen Endpunkten (z.B. aus vorheriger Sitzung). | Nein | |
| force | Einen neuen Satz von Endpunkten erstellen, auch wenn bereits welche existieren. | Nein | False |
| require_manual_deletion | Boolescher Wert, der angibt, ob ApiGateways nach shutdown()-Aufrufen bestehen bleiben sollen. | Nein | False |