Como utilizei ProxyScrape proxies para ganhar a mercadoria ipinfo.io

Jan-19-20245 minutos de leitura

Olá, sou o Benji, um utilizador de ProxyScrape , e adoro mexer em sistemas e descobrir como os programas funcionam em segundo plano. Também faço alguma administração de servidores e, ocasionalmente, codificação (https://benji.link). ProxyScrape pediu-me para escrever um pouco sobre a forma como usei os seus proxies, por isso aqui vai: No Dia das Bruxas de 2023, o ipinfo.io tinha

Olá, sou o Benji, um utilizador de ProxyScrape , e adoro mexer em sistemas e descobrir como os programas funcionam em segundo plano. Também faço alguma administração de servidores e, ocasionalmente, codificação(https://benji.link). ProxyScrape pediu-me para escrever um pouco sobre a utilização dos seus proxies, por isso aqui vai:

Para o Halloween de 2023, o ipinfo.io organizou o concurso "Halloween Hunt", em que os utilizadores deviam usar a aplicação IPinfo para enviar IPs e dados de GPS. Suponho que queriam melhorar os seus dados de IP, enquanto nós tínhamos a oportunidade de ganhar algum merchandising.

Todos os dias, durante duas semanas, foi escolhido um utilizador de entre as participações para ganhar o produto desse dia. Desta forma, não era um jogo de números e havia alguma sorte envolvida.

Comecei a minha viagem, da forma que provavelmente se pretendia, apenas com alguma automatização. Para isso, criei um lento auto-clicker para ligar/desligar o modo Avião no meu telemóvel para forçar um novo IP móvel do meu ISP. Isso funcionou muito bem, mas foi muito lento e só me deu cerca de 2-3 IPs por minuto.

Consegui cerca de 400-500 IPs no total com o meu telemóvel com esse método, antes de começar a pensar em formas mais rápidas.

Quando cheguei a casa nesse dia, comecei a fazer engenharia inversa da aplicação para ver se havia alguma forma de contornar facilmente o sistema e utilizar proxies sem ter de utilizar um telemóvel para o fazer.

Depois de inspecionar o tráfego de rede da aplicação, reparei que tudo o que estava a ser enviado era um único pedido para o ponto final json ("https://ipinfo.io/json"), com o ID do dispositivo.


Captura de ecrã do kit de ferramentas HTTP que monitoriza o tráfego que passa pela aplicação IPinfo. (ID do dispositivo realçado)

Tentei primeiro copiar um desses pedidos e utilizar proxies com ele, mas os pedidos não eram aceites. Através de algumas tentativas e erros, verifiquei que, de alguma forma, tinha a ver com as informações adicionais enviadas no pedido.

O ID do dispositivo e o URL do ponto de extremidade eram os únicos elementos importantes nesse pedido.

Depois de remover todos os outros detalhes para que o pedido tivesse apenas o device_id e nada mais, começou 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'
}

A ID do dispositivo pode ser simplesmente copiada de qualquer telemóvel a partir do qual se tenha instalado a aplicação, e eu poderia provavelmente ter feito algo para gerar a ID para mim sem a aplicação, mas não valeu a pena o incómodo.

Agora só faltava utilizar proxies, o que era a parte mais fácil.

Decidi utilizar proxies residenciaisProxyScrape porque tinha alguns dados gratuitos de uma promoção e eles permitiram-me obter milhares de IPs únicos.

Comecei com um script muito simples que enviava 100 pedidos como este:


Isto funcionou bem e aumentou a velocidade de cerca de 2-3 IPs por minuto para cerca de 30 IPs por minuto (com cada pedido a demorar entre 0,5-2 segundos).

Para aumentar ainda mais a velocidade, uma vez que isto ainda não era suficientemente rápido para mim, quis implementar um simples encadeamento para enviar os pedidos em simultâneo.

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)

Adicionei alguns IDs de dispositivos diferentes por precaução e obtive uma lista de 10 000 proxies rotativos de 1 minuto do ProxyScrape, que foram colados em proxies.txt. Também me certifiquei de adicionar um pequeno tempo de espera entre o início de cada thread para que não aconteça tudo exatamente ao mesmo tempo. (o que parecia causar problemas).

Agora, tudo o que tinha de fazer era alterar o número no "range(500)" para obter a contagem de milhares de IPs.

Todas estas alterações permitiram-me obter algumas centenas de IPs por minuto. Depois continuei a enviar alguns milhares de IPs todos os dias durante as duas semanas de caça.

De acordo com os organizadores do evento, consegui 149 mil IPs únicos, embora eu suspeite que tenha enviado muito mais. Isso colocou-me em 6º lugar a nível mundial e deixou-me com alguns produtos de qualidade.
Pode ver os resultados do concurso aqui: https://community.ipinfo.io/t/the-great-ip-hunt-is-over/3906

Comprei um pacote de autocolantes, uma T-Shirt "I am a Huntathon Winner", um Notecard com um mapa da Internet e umas meias IPinfo.

Todos eles chegaram cerca de 3 semanas depois:

A equipa do IPinfo estava à espera que a aplicação fosse objeto de engenharia inversa e, na verdade, ficou bastante satisfeita por saber como as pessoas encontraram soluções criativas para contornar os bloqueios.

No final, foi um momento divertido conhecer novas pessoas, aprender algumas coisas sobre proxies e engenharia reversa do Android e, claro, obter alguns produtos gratuitos.

Benji