
مكتبة بايثون لاستخدام مجموعة عناوين IP الكبيرة لـ AWS API Gateway كبروكسي لتوليد عناوين IP شبه لا نهائية لتجميع الويب والهجمات القسرية.
برعاية Swiftproxy
بروكسيات سكنية عالية الأداء مع مجموعة IP تتجاوز 80 مليون عبر أكثر من 195 دولة — تحسّن معدلات نجاح الطلبات وتقلل حظر عناوين IP أثناء جمع البيانات على نطاق واسع وأتمتة المتصفحات. مثالية للاستخدام مع
requests-ip-rotatorو Playwright و Selenium وأدوات السكرابينغ الأخرى.
مكتبة بايثون تستخدم مجموعة IP الكبيرة لـ AWS API Gateway كوكيل لتوليد عناوين IP شبه لانهائية لأغراض السكرابينغ والهجمات بالقوة الغاشمة.
تسمح هذه المكتبة للمستخدم بتجاوز حدود معدل الطلبات القائمة على IP للمواقع والخدمات.
يتم توزيع رؤوس X-Forwarded-For عشوائياً تلقائياً ما لم يتم تقديمها. لأن AWS سترسل عنوان IP الحقيقي للعميل في هذا الرأس بخلاف ذلك.
ترسل AWS ApiGateway طلباتها من أي IP متاح — ونظراً لأن بنية AWS التحتية ضخمة، فمن شبه المؤكد أن يكون مختلفاً في كل مرة. باستخدام ApiGateway كوكيل، يمكننا الاستفادة من ذلك لإرسال الطلبات من عناوين IP مختلفة في كل مرة. يُرجى ملاحظة أنه يمكن التعرف على هذه الطلبات وحظرها بسهولة، لأنها تُرسل مع رؤوس AWS فريدة (مثل "X-Amzn-Trace-Id").
هذه الحزمة متوفرة على PyPI لذا يمكنك تثبيتها بأي من الطرق التالية:
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)
يرجى التذكير بأنه إذا لم يتم إيقاف البوابات (gateways) عبر طريقة shutdown() عند استخدام الطريقة الأولى، فقد يتم فرض رسوم عليك في المستقبل.
API Gateway مجاني لأول مليون طلب لكل منطقة، مما يعني أنه في معظم حالات الاستخدام يجب أن يكون مجانياً تماماً.
في وقت كتابة هذا النص، تفرض AWS حوالي 3 دولارات لكل مليون طلب بعد تجاوز الطبقة المجانية.
إذا كانت طلباتك تتضمن تدفق بيانات، فستفرض AWS رسوم نقل بيانات بقيمة 0.09 دولار لكل جيجابايت.
يُوصى بإعداد المصادقة عبر متغيرات البيئة. باستخدام awscli، يمكنك تشغيل aws configure للقيام بذلك، أو بدلاً من ذلك يمكنك ببساطة ضبط المتغيرين AWS_ACCESS_KEY_ID و AWS_SECRET_ACCESS_KEY بنفسك باتباع الخطوات المذكورة في هذا المنشور.
يمكنك العثور على معرف مفتاح الوصول وسره باتباع البرنامج التعليمي الرسمي لـ AWS.
يمكن إنشاء فئة ApiGateway باستخدام المعاملات الاختيارية التالية:
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")
يجب بعد ذلك بدء كائن ApiGateway باستخدام طريقة start.
افتراضياً، إذا كانت ApiGateway موجودة بالفعل للموقع، فسيتم استخدام النقطة النهائية الحالية بدلاً من إنشاء نقطة جديدة.
لا يتطلب هذا أي معاملات، لكنه يقبل ما يلي:
# 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)
يتم إرسال الطلبات عن طريق إرفاق كائن ApiGateway بكائن جلسة (Session) من طلبات (requests).
يجب أن يتطابق الموقع المعطى في mount مع الموقع المُمرر في مُنشئ 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")
من المهم إيقاف موارد ApiGateway بعد الانتهاء منها، لمنع بقاء نقاط النهاية العامة المعلقة التي قد تسبب رسوماً زائدة على حسابك.
يتم ذلك عبر طريقة shutdown لكائن ApiGateway. ستغلق جميع الموارد للمناطق المحددة في مُنشئ كائن 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()
بدلاً من ذلك، يمكنك إيقاف نقاط نهاية محددة بشكل انتقائي إذا لزم الأمر. لفعل ذلك، قم بتمرير مصفوفة من نقاط النهاية إلى طريقة shutdown()، على سبيل المثال:
# 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])
يرجى مراعاة أن أي بوابات بدأت مع تعيين المعامل require_manual_deletion على True لن يتم حذفها عبر طريقة shutdown، ويجب حذفها يدوياً إما عبر واجهة سطر الأوامر لـ AWS أو الموقع الإلكتروني.
تم تعديل كود إنشاء البوابات الأساسية وتنظيمها من إضافة IPRotate Burp الخاصة بـ RhinoSecurityLabs IPRotate Burp Extension.
تم تصور مفهوم تمرير رأس X-My-X-Forwarded-For أصلاً بواسطة ustayready في وكيله fireprox.
| الاسم | الوصف | مطلوب | الافتراضي |
|---|
| site | الموقع (بدون المسار) الذي ستُرسل إليه الطلبات. | نعم | |
| regions | مصفوفة مناطق AWS لإعداد البوابات فيها. | لا | ip_rotator.DEFAULT_REGIONS |
| access_key_id | معرف مفتاح الوصول لـ AWS (سيحل محل متغيرات البيئة). | لا | يعتمد على متغيرات البيئة. |
| access_key_secret | سر مفتاح الوصول لـ AWS (سيحل محل متغيرات البيئة). | لا | يعتمد على متغيرات البيئة. |
| verbose | تضمين رسائل الحالة والأخطاء. | لا | نعم |
| الاسم | الوصف | مطلوب | الافتراضي |
|---|
| endpoints | مصفوفة نقاط نهاية موجودة مسبقاً (مثلاً من جلسة سابقة). | لا | |
| force | إنشاء مجموعة جديدة من نقاط النهاية، حتى لو كان بعضها موجوداً بالفعل. | لا | لا |
| require_manual_deletion | قيمة منطقية تحدد ما إذا كانت ApiGateway يجب أن تستمر بعد استدعاء shutdown() | لا | لا |