داكن proxyscrape شعار

كيف اعتدت ProxyScrape وكلاء للفوز ببضائع ipinfo.io

05-يناير-20245 دقائق للقراءة

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

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

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

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

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

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

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


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

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

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

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

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 000 وكيل دوار لمدة دقيقة واحدة من ProxyScrapeوالتي تم لصقها في proxies.txt. لقد حرصت أيضا على إضافة وقت نوم قصير بين بدء كل مؤشر ترابط حتى لا يحدث كل ذلك في نفس الوقت بالضبط. (الذي يبدو أنه يسبب مشاكل.)

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

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

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

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

وصل كل هؤلاء بعد حوالي 3 أسابيع:

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

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

بنجي