شعار proxyscrape داكن

كيف استخدمت البروكسيات ProxyScrape للفوز ببضاعة ipinfo.io

Mar-06-20245 دقائق للقراءة

مرحبًا، أنا بنجي، مستخدم ProxyScrape ، وأحب العبث بالأنظمة ومعرفة كيفية عمل البرامج في الخلفية. أقوم أيضًا ببعض أعمال إدارة الخوادم والبرمجة من حين لآخر (https://benji.link). ProxyScrape طلب مني أن أكتب قليلاً عن استخدامي لبرامج البروكسي الخاصة بهم، لذا ها نحن ذا: في عيد الهالوين 2023، عقدت ipinfo.io

مرحبًا، أنا بنجي، مستخدم ProxyScrape ، وأحب العبث بالأنظمة ومعرفة كيفية عمل البرامج في الخلفية. أقوم أيضًا ببعض أعمال إدارة الخوادم والبرمجة من حين لآخر(https://benji.link). ProxyScrape طلب مني أن أكتب قليلاً عن استخدامي لبرامج البروكسي الخاصة بهم، لذا ها نحن ذا:

في عيد الهالوين 2023، أقام موقع ipinfo.io مسابقة "صيد الهالوين"، حيث كان من المفترض أن يستخدم المستخدمون تطبيق IPinfo لإرسال عناوين IP وبيانات GPS. أعتقد أنهم أرادوا تحسين بيانات الـ IP الخاصة بهم، بينما حصلنا نحن على فرصة للفوز ببعض البضائع.

كانوا يختارون كل يوم لمدة أسبوعين مستخدماً من بين المشاركات للفوز ببضاعة ذلك اليوم. وبهذه الطريقة لم تكن لعبة أرقام كاملة وكان هناك بعض الحظ.

بدأت رحلتي، بالطريقة التي ربما كانت مقصودة على الأرجح، ببعض الأتمتة. قمت بذلك عن طريق عمل نقرة تلقائية بطيئة لتشغيل/إيقاف تشغيل وضع الطائرة على هاتفي لفرض عنوان IP جديد للهاتف المحمول من مزود خدمة الإنترنت. نجح هذا الأمر بشكل رائع، ولكنه كان بطيئًا جدًا ولم يمنحني سوى حوالي 2-3 عناوين IP في الدقيقة.

لقد حصلت على حوالي 400-500 عنوان IP إجمالاً بهاتفي بهذه الطريقة، قبل أن أبدأ في التفكير في طرق أسرع.

بمجرد وصولي إلى المنزل في ذلك اليوم، بدأت في إجراء هندسة عكسية للتطبيق لمعرفة ما إذا كانت هناك أي طريقة يمكنني من خلالها الالتفاف على النظام بسهولة واستخدام البروكسي دون الحاجة إلى استخدام هاتف لذلك.

بعد فحص حركة مرور الشبكة من التطبيق، لاحظت أن كل ما تم إرساله هو طلب واحد إلى نقطة نهاية json ("https://ipinfo.io/json")، مع معرف جهازك.


لقطة شاشة من مجموعة أدوات HTTP تراقب حركة المرور التي تمر عبر تطبيق IPinfo. (تم تمييز معرّف الجهاز)

حاولت في البداية نسخ أحد هذه الطلبات واستخدام الوكلاء معها، ولكن لم يتم قبول الطلبات. من خلال بعض التجارب والخطأ، لاحظت أن الأمر يتعلق بطريقة ما بالمعلومات الإضافية التي يتم إرسالها في الطلب.

كان معرّف الجهاز وعنوان URL لنقطة النهاية هما الأمران الوحيدان المهمان في هذا الطلب.

بعد إزالة جميع التفاصيل الأخرى بحيث لا يحتوي الطلب إلا على معرف_الجهاز ولا شيء آخر، بدأ العمل.

url = "https://ipinfo.io/json?token=app_test"


headers = {
  'Host': 'ipinfo.io',
  'User-Agent': 'IPinfo/Android-Lib/3.0.6/IPinfo',
  'x-conn-details': 'device_id=d813353d28df2ad3'
}

يمكنك نسخ معرّف الجهاز من أي هاتف قمت بتثبيت التطبيق منه، وربما كان بإمكاني صنع شيء ما لجعله يولد لي المعرّف بدون التطبيق، لكن ذلك لم يكن يستحق العناء.

لم يتبق الآن سوى استخدام الوكلاء، وكان هذا هو الجزء السهل.

قررت استخدام البروكسيات السكنيةProxyScrape لأنه كان لدي بعض البيانات المجانية من عرض ترويجي، وقد سمحوا لي بالحصول على آلاف عناوين IP الفريدة.

لقد بدأت بنص برمجي بسيط للغاية يرسل 100 طلب على هذا النحو:


وقد نجح هذا الأمر بشكل جيد وزاد السرعة من حوالي 2-3 عناوين IP في الدقيقة إلى حوالي 30 عنوان IP في الدقيقة. (حيث يستغرق كل طلب ما بين 0.5 إلى 2 ثانية).

لزيادة السرعة بشكل أكبر، نظرًا لأن هذا لم يكن سريعًا بما يكفي بالنسبة لي، أردت تنفيذ بعض الترابط البسيط لإرسال الطلبات بشكل متزامن.

import requests
import concurrent.futures
import time
import random


# open the proxies.txt file and read the proxies
proxies = open("proxies.txt", "r").read().split("\n")


url = "https://ipinfo.io/json?token=app_test"


device_ids = {
  "3d8e0d7245a92152",
  "a9c7b2b233dd06b8",
  "661035895999a7fe",
  "d813353d28df2ad3",
  "982078c380f4fe38"
}


success_count = 0


def send_request(i):
  global success_count
  try:
    # pick a random number between 1 and 1000
    rand = random.randint(1, 10000)
    proxy = {"https": proxies[rand]}
    device_id = random.choice(list(device_ids))


    payload = {}
    headers = {
        'Host': 'ipinfo.io',
        'User-Agent': 'IPinfo/Android-Lib/3.0.6/IPinfo',
        'x-conn-details': 'device_id={}'.format(device_id)
    }


    response = requests.request("GET", url, headers=headers, data=payload, proxies=proxy, timeout=20)
    print("Request #{}: \n{} \nTime taken: {}\n".format(i, response.text, response.elapsed.total_seconds()))
    success_count += 1
  except Exception as e:
    print("Request #{}: Error - {}".format(i, str(e)))


with concurrent.futures.ThreadPoolExecutor() as executor:
  futures = []
  for i in range(500):
    time.sleep(0.02)  # wait for 100ms before starting each thread
    futures.append(executor.submit(send_request, i))


  try:
    for future in concurrent.futures.as_completed(futures):
      future.result()
  except KeyboardInterrupt:
    print("Program interrupted by user.")
    for future in futures:
      future.cancel()
  except Exception as e:
    print("An error occurred:", str(e))


print("Success count:", success_count)

أضفت بعض معرّفات الأجهزة المختلفة تحسبًا لأي طارئ، وحصلت على قائمة بـ 10 آلاف بروكسي دوّار لمدة دقيقة واحدة من ProxyScrapewh والتي تم لصقها في proxies.txt. حرصت أيضًا على إضافة وقت سكون قصير بين بدء كل مؤشر ترابط حتى لا يحدث كل ذلك في نفس الوقت بالضبط. (والذي يبدو أنه يسبب مشاكل).

الآن كل ما كان عليَّ فعله هو تغيير الرقم في "النطاق (500)" للحصول على آلاف عناوين IP التي تم احتسابها.

أتاحت لي كل هذه التغييرات الحصول على بضع مئات من عناوين IP في الدقيقة. ثم واصلت بعد ذلك إرسال بضعة آلاف من عناوين IP كل يوم لمدة أسبوعين.

وفقًا لمنظمي الحدث، تمكنت من الحصول على 149 ألف عنوان IP فريد، على الرغم من أنني أظن أنني أرسلت أكثر من ذلك بكثير. وقد وضعني ذلك في المركز السادس عالميًا وترك لي بعض البضائع الرائعة.
يمكنك الاطلاع على نتائج المسابقة هنا: https://community.ipinfo.io/t/the-great-ip-hunt-is-over/3906

حصلت لنفسي على حزمة ملصقات، وقميص "أنا فائز في هانتاثون"، وبطاقة ملاحظات مع خريطة للإنترنت، وبعض جوارب IPinfo.

وصلت جميع هذه الأشياء بعد حوالي 3 أسابيع:

وكإخلاء للمسؤولية، كان فريق IPinfo يتوقع أن يتم إجراء هندسة عكسية للتطبيق، وكانوا في الواقع سعداء للغاية لمعرفة كيف وجد الناس حلولاً مبتكرة حول الكتل.

في النهاية، كان وقتًا ممتعًا في مقابلة أشخاص جدد، وتعلم بعض الأشياء عن البروكسي والهندسة العكسية لنظام Android، وبالطبع الحصول على بعض البضائع المجانية.

بنجي