темный логотип proxyscrape

Как я использовал прокси-серверы ProxyScrape для победы в конкурсе ipinfo.io

Янв-05-20245 минут чтения
Привет, я Бенджи, пользователь ProxyScrape , и мне нравится возиться с системами и выяснять, как программы работают в фоновом режиме. Я также занимаюсь администрированием серверов и иногда кодингом(https://benji.link). ProxyScrape попросил меня написать немного о том, для чего я использую их прокси, так что вот так:
На Хэллоуин 2023 года ipinfo.io провела конкурс "Охота на Хэллоуин", в котором пользователи должны были использовать приложение IPinfo для отправки IP-адресов и данных GPS. Полагаю, они хотели улучшить свои данные об IP-адресах, а мы получили шанс выиграть какой-нибудь товар.

Каждый день в течение 2 недель они выбирали одного пользователя из представленных, который выигрывал товар этого дня. Таким образом, это не было полной игрой чисел, и было немного удачи.

Я начал свое путешествие, как, вероятно, и было задумано, просто с некоторой автоматизации. Для этого я сделал медленный автокликер для включения/выключения режима Airplane на моем телефоне, чтобы принудительно получить новый мобильный 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 1-минутных вращающихся прокси из ProxyScrapewhich, которые были вставлены в файл proxies.txt. Я также позаботился о том, чтобы добавить короткое время сна между запуском каждого потока, чтобы все это не происходило в одно и то же время. (что, похоже, вызывало проблемы).

Теперь мне оставалось только изменить число в "range(500)", чтобы подсчитать тысячи IP.

Все эти изменения позволили мне получать несколько сотен IP-адресов в минуту. Затем я продолжал отправлять по несколько тысяч IP каждый день в течение двух недель охоты.

По данным организаторов мероприятия, мне удалось получить 149 тысяч уникальных IP, хотя я подозреваю, что отправил гораздо больше. Это позволило мне занять 6-е место в мире и получить неплохой мерч.
Результаты конкурса можно посмотреть здесь: https://community.ipinfo.io/t/the-great-ip-hunt-is-over/3906.

Я купил себе набор наклеек, футболку "Я - победитель Хантэтона", блокнот с картой Интернета и носки IPinfo.

Все они были доставлены примерно через 3 недели:

Сразу оговорюсь, что команда IPinfo ожидала, что приложение будет подвергнуто реверс-инжинирингу, и на самом деле была очень рада узнать, как люди находят креативные решения в обход блоков.
В итоге мы весело провели время, познакомились с новыми людьми, узнали кое-что о прокси-серверах и реверс-инжиниринге Android, и, конечно, получили несколько бесплатных товаров.

Бенджи