logo proxyscrape scuro

Come ho usato i proxy di ProxyScrape per vincere la merce di ipinfo.io

05.01.20245 minuti di lettura

Ciao, sono Benji, un utente di ProxyScrape , e mi piace smanettare con i sistemi e scoprire come funzionano i programmi in background. Mi occupo anche di amministrazione di server e di codifica occasionale(https://benji.link). ProxyScrape mi ha chiesto di scrivere un po' su cosa uso i loro proxy, quindi eccoci qui:

Per Halloween 2023, ipinfo.io ha indetto il concorso "Halloween Hunt", in cui gli utenti dovevano utilizzare l'app IPinfo per inviare IP e dati GPS. Immagino che volessero migliorare i loro dati IP, mentre noi avevamo la possibilità di vincere qualche gadget.

Ogni giorno, per due settimane, hanno scelto un utente tra quelli inviati per vincere il merchandising di quel giorno. In questo modo non si trattava di un gioco di numeri e c'era un po' di fortuna.

Ho iniziato il mio viaggio nel modo in cui probabilmente era stato pensato, con un po' di automazione. L'ho fatto facendo un lento clic automatico per attivare/disattivare la modalità aereo sul mio telefono per forzare un nuovo IP mobile dal mio ISP. Ha funzionato benissimo, ma è stato molto lento e mi ha fornito solo 2-3 IP al minuto.

Con questo metodo ho ottenuto circa 400-500 IP in totale con il mio telefono, prima di iniziare a pensare a metodi più veloci.

Una volta tornato a casa, ho iniziato a fare il reverse engineering dell'applicazione per vedere se c'era un modo per aggirare facilmente il sistema e usare i proxy senza dover usare il telefono.

Dopo aver ispezionato il traffico di rete dell'applicazione, ho notato che tutto ciò che veniva inviato era una singola richiesta all'endpoint json ("https://ipinfo.io/json"), con l'ID del dispositivo.


Schermata del toolkit HTTP che monitora il traffico che passa attraverso l'applicazione IPinfo. (ID dispositivo evidenziato)

All'inizio ho provato a copiare una di queste richieste e a usare i proxy con essa, ma le richieste non venivano accettate. Attraverso alcuni tentativi ed errori, ho notato che il problema era in qualche modo legato alle informazioni aggiuntive inviate nella richiesta.

L'ID del dispositivo e l'URL dell'endpoint erano gli unici elementi importanti della richiesta.

Dopo aver rimosso tutti gli altri dettagli, in modo che la richiesta contenesse solo il device_id e nient'altro, ha iniziato a funzionare.

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

L'ID del dispositivo può essere copiato da qualsiasi telefono da cui è stata installata l'applicazione e probabilmente avrei potuto creare qualcosa per far sì che generasse l'ID per me senza l'applicazione, ma non ne valeva la pena.

A questo punto l'unica cosa che rimaneva da fare era usare i proxy, il che era la parte più facile.

Ho deciso di utilizzare i proxy residenziali diProxyScrape perché avevo dei dati gratuiti grazie a una promozione e mi hanno permesso di ottenere migliaia di IP unici.

Ho iniziato con uno script molto semplice che inviava 100 richieste come questa:


Questo ha funzionato bene e ha aumentato la velocità da circa 2-3 IP al minuto a circa 30 IP al minuto (ogni richiesta richiede tra 0,5 e 2 secondi).

Per aumentare ulteriormente la velocità, dato che per me non era ancora abbastanza veloce, ho voluto implementare un semplice threading per inviare le richieste in modo simultaneo.

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)

Ho aggiunto alcuni ID di dispositivi diversi per sicurezza e ho ottenuto un elenco di 10 000 proxy a rotazione di 1 minuto da ProxyScrape che sono stati incollati in proxies.txt. Mi sono anche assicurato di aggiungere un breve periodo di sospensione tra l'avvio di ogni thread, in modo che non avvenga tutto nello stesso momento. (cosa che sembrava causare problemi).

Ora è bastato cambiare il numero in "range(500)" per ottenere il conteggio di migliaia di IP.

Tutte queste modifiche mi hanno permesso di ottenere alcune centinaia di IP al minuto. Ho poi continuato a inviare un paio di migliaia di IP ogni giorno per le due settimane di caccia.

Secondo gli organizzatori dell'evento, sono riuscito a ottenere 149k IP unici, anche se sospetto di averne inviati molti di più. Mi sono piazzato al 6° posto a livello mondiale e ho ricevuto un bel po' di merchandising.
Potete vedere i risultati del concorso qui: https://community.ipinfo.io/t/the-great-ip-hunt-is-over/3906

Ho ricevuto un pacchetto di adesivi, una maglietta "I am a Huntathon Winner", una notecard con una mappa di Internet e dei calzini IPinfo.

Sono arrivati tutti dopo circa 3 settimane:

Il team di IPinfo si aspettava che l'applicazione venisse sottoposta a reverse engineering e, in realtà, è stato molto felice di scoprire come le persone abbiano trovato soluzioni creative per aggirare i blocchi.

Alla fine, è stato divertente incontrare nuove persone, imparare alcune cose sui proxy e sul reverse engineering di Android e, naturalmente, ottenere un po' di merchandising gratuito.

Benji