어두운 proxyscrape 로고

ProxyScrape 프록시를 사용하여 ipinfo.io 상품을 획득한 방법

1월-05-20245분 읽기

안녕하세요, 저는 ProxyScrape 사용자 벤지입니다. 저는 시스템을 조작하고 백그라운드에서 프로그램이 어떻게 작동하는지 알아보는 것을 좋아합니다. 서버 관리와 가끔 코딩도 하고 있습니다(https://benji.link). ProxyScrape 에서 제가 프록시를 사용하는 용도에 대해 글을 써달라고 요청해서 여기까지 왔습니다:

2023년 할로윈을 맞아 ipinfo.io는 "할로윈 헌트" 콘테스트를 개최하여 사용자가 IPinfo 앱을 사용하여 IP와 GPS 데이터를 제출하도록 했습니다. 사용자들은 자신의 IP 데이터를 개선하고 싶었던 것 같고, 저희는 상품을 받을 수 있는 기회를 얻었습니다.

2주 동안 매일 응모자 중 한 명의 사용자를 추첨하여 그날의 상품을 증정했습니다. 이 방식은 완전한 숫자 게임이 아니었고 운도 어느 정도 개입되었습니다.

저는 원래 의도했던 대로 약간의 자동화를 통해 여행을 시작했습니다. 휴대폰에서 비행기 모드를 켜고 끄는 자동 클릭을 느리게 설정하여 ISP에서 새 모바일 IP를 강제로 할당하는 방식으로 이 작업을 수행했습니다. 이 방법은 훌륭하게 작동했지만 속도가 매우 느려서 분당 2~3개 정도의 IP만 제공되었습니다.

더 빠른 방법을 생각하기 전까지는 이 방법으로 휴대폰으로 총 400~500개의 IP를 확보했습니다.

그날 집에 돌아와서 저는 앱을 리버스 엔지니어링하여 휴대폰을 사용하지 않고도 시스템을 쉽게 우회하고 프록시를 사용할 수 있는 방법이 있는지 알아보기 시작했습니다.

앱의 네트워크 트래픽을 검사한 결과, 디바이스 ID와 함께 json 엔드포인트("https://ipinfo.io/json")로 전송되는 요청이 한 건뿐인 것을 확인했습니다.


IPinfo 앱을 통과하는 트래픽을 모니터링하는 HTTP 툴킷의 스크린샷입니다. (디바이스 ID가 강조 표시됨)

처음에는 해당 요청 중 하나를 복사하여 프록시를 사용해 보았지만 요청이 수락되지 않았습니다. 몇 번의 시행착오 끝에 요청에 포함된 추가 정보와 관련이 있다는 것을 알게 되었습니다.

해당 요청에서 중요한 것은 기기 ID와 엔드포인트 URL뿐이었습니다.

요청에 device_id만 있고 다른 세부 정보가 없도록 다른 모든 세부 정보를 제거한 후 작동하기 시작했습니다.

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

디바이스 ID는 앱을 설치한 모든 휴대폰에서 복사할 수 있으며, 앱 없이도 ID를 생성하도록 무언가를 만들 수도 있었지만 번거로울 것 같지 않았습니다.

이제 남은 것은 프록시를 사용하는 것뿐이었는데, 이는 쉬운 부분이었습니다.

저는 프로모션으로 무료 데이터를 받았기 때문에 ProxyScrape 주거용 프록시를 사용하기로 결정했고, 이 프록시를 통해 수천 개의 고유 IP를 확보할 수 있었습니다.

처음에는 이렇게 100개의 요청을 보내는 아주 간단한 스크립트로 시작했습니다:


이렇게 하면 속도가 분당 약 2~3개에서 분당 약 30개로 증가했습니다. (각 요청에 0.5~2초가 소요됩니다.)

속도를 더 높이기 위해, 여전히 충분히 빠르지 않았기 때문에 요청을 동시에 전송하는 간단한 스레딩을 구현하고 싶었습니다.

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)

만일을 대비해 몇 가지 다른 디바이스 ID를 추가했고, ProxyScrapewhich에서 1분 단위로 순환하는 프록시 10,000개의 목록을 가져와 proxies.txt에 붙여넣었습니다. 또한 각 스레드 시작 사이에 짧은 절전 시간을 추가하여 모든 스레드가 정확히 동시에 실행되지 않도록 했습니다. (문제를 일으키는 것 같았습니다.)

이제 '범위(500)'의 숫자를 변경하기만 하면 수천 개의 IP를 계산할 수 있습니다.

이러한 모든 변경을 통해 분당 수백 개의 IP를 확보할 수 있었습니다. 그런 다음 2주 동안 매일 2,000개의 IP를 계속 전송했습니다.

이벤트 주최측에 따르면 149,000개의 고유 IP를 확보했다고 하는데, 저는 그보다 훨씬 더 많이 보낸 것 같습니다. 그 결과 전 세계 6위에 올랐고 달콤한 상품도 받았습니다.
여기에서 콘테스트 결과를 확인할 수 있습니다: https://community.ipinfo.io/t/the-great-ip-hunt-is-over/3906

저는 스티커 팩, "나는 헌터톤 우승자 티셔츠", 인터넷 지도가 있는 메모 카드, IPinfo 양말을 받았습니다.

모두 약 3주 후에 도착했습니다:

면책 조항으로, IPinfo 팀은 앱이 리버스 엔지니어링될 것으로 예상했고 실제로 사람들이 블록 주변에서 창의적인 솔루션을 찾는 방법을 알게 되어 매우 기뻤습니다.

결국 새로운 사람들을 만나고, 프록시와 안드로이드 리버스 엔지니어링에 대해 배우고, 물론 무료 상품도 받을 수 있는 즐거운 시간이었습니다.

Benji