ciemne logo proxyscrape

Jak wykorzystałem serwery proxy ProxyScrape do wygrania handlu ipinfo.io

Jan-05-20245 minut czytania

Hej, jestem Benji, użytkownik ProxyScrape i uwielbiam bawić się systemami i odkrywać, jak programy działają w tle. Zajmuję się również administracją serwerami i okazjonalnym kodowaniem(https://benji.link). ProxyScrape poprosił mnie, abym napisał trochę o tym, do czego używam ich serwerów proxy, więc zaczynamy:

Z okazji Halloween 2023 ipinfo.io zorganizowało konkurs "Halloween Hunt", w którym użytkownicy mieli używać aplikacji IPinfo do przesyłania adresów IP i danych GPS. Zgaduję, że chcieli poprawić swoje dane IP, podczas gdy my mieliśmy szansę wygrać trochę towarów.

Każdego dnia przez 2 tygodnie spośród nadesłanych zgłoszeń wybierano użytkownika, który wygrywał danego dnia towar. W ten sposób nie była to tylko gra liczbowa, w której liczyło się szczęście.

Zacząłem swoją podróż, tak jak prawdopodobnie zamierzałem, po prostu z pewną automatyzacją. Zrobiłem to, tworząc powolne automatyczne klikanie, aby włączyć / wyłączyć tryb samolotowy w moim telefonie, aby wymusić nowe mobilne IP od mojego dostawcy usług internetowych. Działało to świetnie, ale było bardzo powolne i dawało mi tylko około 2-3 IP na minutę.

W sumie uzyskałem około 400-500 IP z mojego telefonu za pomocą tej metody, zanim zacząłem myśleć o szybszych sposobach.

Po powrocie do domu tego dnia zacząłem analizować aplikację, aby sprawdzić, czy istnieje jakiś sposób na łatwe obejście systemu i korzystanie z serwerów proxy bez konieczności korzystania z telefonu.

Po sprawdzeniu ruchu sieciowego z aplikacji zauważyłem, że wszystko, co było wysyłane, to pojedyncze żądanie do punktu końcowego json ("https://ipinfo.io/json") z identyfikatorem urządzenia.


Zrzut ekranu z zestawu narzędzi HTTP monitorujących ruch przechodzący przez aplikację IPinfo. (Identyfikator urządzenia podświetlony)

Najpierw próbowałem po prostu skopiować jedno z tych żądań i użyć z nim serwerów proxy, ale żądania nie były akceptowane. Dzięki próbom i błędom zauważyłem, że ma to związek z dodatkowymi informacjami wysyłanymi w żądaniu.

Identyfikator urządzenia i adres URL punktu końcowego były jedynymi ważnymi elementami tego żądania.

Po usunięciu wszystkich innych szczegółów, tak aby żądanie zawierało tylko identyfikator urządzenia i nic więcej, zaczęło działać.

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

Identyfikator urządzenia można po prostu skopiować z dowolnego telefonu, z którego zainstalowano aplikację, i prawdopodobnie mógłbym zrobić coś, aby wygenerować identyfikator dla mnie bez aplikacji, ale nie było to warte kłopotów.

Teraz pozostało tylko użyć proxy, co było najłatwiejszą częścią.

Zdecydowałem się skorzystać z serwerów proxyProxyScrape , ponieważ miałem trochę darmowych danych z promocji i pozwoliły mi one uzyskać tysiące unikalnych adresów IP.

Zacząłem od bardzo prostego skryptu, który wysyłał 100 żądań w ten sposób:


Zadziałało to dobrze i zwiększyło prędkość z około 2-3 adresów IP na minutę do około 30 adresów IP na minutę (przy czym każde żądanie trwało od 0,5 do 2 sekund).

Aby jeszcze bardziej zwiększyć prędkość, ponieważ to wciąż nie było dla mnie wystarczająco szybkie, chciałem zaimplementować proste wątkowanie, aby wysyłać żądania współbieżnie.

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)

Dodałem kilka różnych identyfikatorów urządzeń na wszelki wypadek i uzyskałem listę 10 000 1-minutowych obrotowych serwerów proxy z ProxyScrapew, które zostały wklejone do pliku proxies.txt. Upewniłem się również, że dodałem krótki czas uśpienia między uruchomieniem każdego wątku, aby nie działo się to dokładnie w tym samym czasie. (co wydawało się powodować problemy).

Teraz wszystko, co musiałem zrobić, to zmienić liczbę w "range(500)", aby zliczyć tysiące adresów IP.

Wszystkie te zmiany pozwoliły mi uzyskać kilkaset IP na minutę. Następnie kontynuowałem wysyłanie kilku tysięcy IP każdego dnia przez 2 tygodnie polowania.

Według organizatorów wydarzenia udało mi się zdobyć 149 tys. unikalnych IP, choć podejrzewam, że wysłałem ich znacznie więcej. Dało mi to 6. miejsce na świecie i trochę słodkiego gadżetu.
Wyniki konkursu można zobaczyć tutaj: https://community.ipinfo.io/t/the-great-ip-hunt-is-over/3906

Dostałem pakiet naklejek, koszulkę "I am a Huntathon Winner T-Shirt", notes z mapą Internetu i skarpetki IPinfo.

Wszystkie dotarły około 3 tygodnie później:

Jako zastrzeżenie, zespół IPinfo spodziewał się, że aplikacja zostanie poddana inżynierii wstecznej i w rzeczywistości był bardzo zadowolony, gdy dowiedział się, jak ludzie znaleźli kreatywne rozwiązania wokół bloków.

Ostatecznie był to fajny czas na poznanie nowych ludzi, nauczenie się kilku rzeczy o proxy i inżynierii wstecznej Androida oraz oczywiście zdobycie darmowych towarów.

Benji