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","Przez: ProxyScrape","Ostatnie posty","Fast Web Scraping: Asynchroniczność, wątki i procesy w Pythonie","Używanie proxy w nieobsługiwanym oprogramowaniu - proxying The unproxyable","Jak wykorzystałem proxy do wygrania loterii i sneakersów","Jak zostałem \"milionerem\" leadów","Szukasz pomocy z naszymi pełnomocnikami lub
chcesz pomóc? Oto dostępne opcje:","Crunchbase","O nas","Dziękujemy wszystkim za niesamowite wsparcie!","Szybkie łącza","Program partnerski","ProxyScrape wersja próbna premium","Online Proxy Checker","Typy proxy","Kraje zastępcze","Przypadki użycia proxy","Ważne","Polityka plików cookie","Zastrzeżenie","Polityka prywatności","Zasady i warunki","Media społecznościowe","Facebook","LinkedIn","Twitter","Quora","Telegram","Discord"," © Copyright 2024 - Thib BV | Brugstraat 18 | 2812 Mechelen | Belgia | VAT BE 0749 716 760"]}
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