Cómo utilicé los proxies de ProxyScrape para ganar la mercancía de ipinfo.io

Mar-06-20245 minutos de lectura

Hola, soy Benji, usuario de ProxyScrape , y me encanta trastear con los sistemas y averiguar cómo funcionan los programas en segundo plano. También hago algo de administración de servidores y codificación ocasional (https://benji.link). ProxyScrape me pidió que escribiera un poco sobre para qué usaba sus proxies, así que allá vamos: Para Halloween 2023, ipinfo.io mantuvo

Hola, soy Benji, usuario de ProxyScrape , y me encanta trastear con los sistemas y averiguar cómo funcionan los programas en segundo plano. También hago algo de administración de servidores y codificación ocasional(https://benji.link). ProxyScrape me pidió que escribiera un poco sobre para qué usaba sus proxies, así que aquí vamos:

Para Halloween 2023, ipinfo.io organizó el concurso "Caza de Halloween", en el que los usuarios debían utilizar la aplicación IPinfo para enviar IPs y datos GPS. Supongo que querían mejorar sus datos IP, mientras que nosotros teníamos la oportunidad de ganar algo de merchandising.

Cada día, durante dos semanas, se elegía a un usuario de entre los presentados para ganar la mercancía de ese día. De este modo, no se trataba de un juego de números y había algo de suerte.

Empecé mi viaje, la forma en que probablemente se pretendía, sólo con un poco de automatización. Hice esto haciendo un lento auto-clicker para encender/apagar el modo Avión en mi teléfono para forzar una nueva IP móvil desde mi ISP. Esto funcionó muy bien, pero fue muy lento y sólo me dio alrededor de 2-3 IPs por minuto.

Conseguí alrededor de 400-500 IPs en total con mi teléfono con ese método, antes de empezar a pensar en formas más rápidas.

Cuando llegué a casa ese día, empecé a aplicar ingeniería inversa a la aplicación para ver si había alguna forma de burlar el sistema y utilizar proxies sin tener que usar un teléfono para ello.

Después de inspeccionar el tráfico de red de la aplicación, me di cuenta de que todo lo que se enviaba era una única solicitud al punto final json ("https://ipinfo.io/json"), con el ID de tu dispositivo.


Captura de pantalla del kit de herramientas HTTP monitorizando el tráfico que pasa por la aplicación IPinfo. (ID de dispositivo resaltado)

Primero intenté copiar una de esas peticiones y usar proxies con ella, pero las peticiones no eran aceptadas. Por ensayo y error, me di cuenta de que de alguna manera tenía que ver con la información adicional que se envía en la solicitud.

El ID del dispositivo y la URL del punto final eran lo único importante en esa solicitud.

Después de eliminar todos los demás detalles para que la solicitud sólo tuviera el device_id y nada más, empezó a funcionar.

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'
}

El ID del dispositivo se puede copiar de cualquier teléfono desde el que se haya instalado la aplicación, y probablemente podría haber hecho algo para que me generara el ID sin la aplicación, pero no merecía la pena.

Ahora sólo quedaba utilizar proxies, que era la parte fácil.

Decidí utilizar los proxies residenciales deProxyScrape porque tenía algunos datos gratuitos de una promoción, y me permitieron obtener miles de IPs únicas.

Empecé con un script muy simple que enviaba 100 peticiones como esta:


Esto funcionó bien y aumentó la velocidad de alrededor de 2-3 IPs por minuto a alrededor de 30 IPs por minuto (con cada petición tardando entre 0,5-2 segundos).

Para aumentar la velocidad aún más, ya que esto todavía no era lo suficientemente rápido para mí, quería implementar algunos hilos simples para enviar las solicitudes de forma concurrente.

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)

Añadí algunos IDs de dispositivos diferentes por si acaso, y obtuve una lista de 10 000 proxies rotativos de 1 minuto de ProxyScrapeque fueron pegados en proxies.txt. También me aseguré de añadir un corto tiempo de espera entre el inicio de cada hilo para que no todo ocurra exactamente al mismo tiempo. (que parecía causar problemas.)

Ahora todo lo que tenía que hacer era cambiar el número en el "range(500)" para conseguir contar miles de IPs.

Todos estos cambios me permitieron obtener unos cientos de IPs por minuto. Luego continué enviando un par de miles de IPs cada día durante las 2 semanas de caza.

Según los organizadores del evento, conseguí 149k IPs únicas, aunque sospecho que envié muchas más. Eso me situó en el 6º puesto mundial y me dejó un dulce merchandaising.
Puedes ver los resultados del concurso aquí: https://community.ipinfo.io/t/the-great-ip-hunt-is-over/3906

Me hice con un paquete de pegatinas, una camiseta "I am a Huntathon Winner", una Notecard con un mapa de Internet y unos calcetines IPinfo.

Todo esto llegó unas 3 semanas después:

A modo de aclaración, el equipo de IPinfo esperaba que la aplicación se sometiera a ingeniería inversa y, de hecho, se alegró mucho de ver cómo la gente encontraba soluciones creativas a los bloqueos.

Al final, fue divertido conocer gente nueva, aprender algunas cosas sobre proxies e ingeniería inversa de Android y, por supuesto, conseguir algo de merch gratis.

Benji