ProxyScrape プロキシを使ってipinfo.ioグッズに勝った方法

マー0620245分で読める

ProxyScrape 、システムをいじったり、プログラムがバックグラウンドでどのように動作しているかを調べるのが大好きです。サーバーの管理もするし、たまにコーディングもする(https://benji.link)。ProxyScrape 、彼らのプロキシを何に使ったか少し書いてくれと頼まれたので、ここに紹介しよう:2023年のハロウィンのために、ipinfo.ioは以下を行った。

ProxyScrape 、システムをいじったり、プログラムがバックグラウンドでどのように動作しているかを調べるのが大好きです。また、サーバーの管理や時々コーディングもします(https://benji.link)。ProxyScrape 、彼らのプロキシを何に使っているかについて少し書いてほしいと頼まれたので、ここに紹介します:

2023年のハロウィンに向けて、ipinfo.ioは「ハロウィン・ハント」コンテストを開催した。IPinfoアプリを使ってIPとGPSデータを投稿することになっていた。IPinfo.ioは、IPデータを改善したかったのだろう。

2週間にわたって毎日、投稿された中から1人のユーザーを選び、その日の商品をプレゼントした。そうすることで、完全な数字ゲームではなく、運も絡んでくる。

私は、おそらく意図された方法で、いくつかの自動化で私の旅を始めた。ISPから新しいモバイルIPを強制的に取得するために、携帯電話の機内モードをオン/オフする遅い自動クリッカーを作ることでこれを行った。これはうまくいったが、非常に時間がかかり、1分あたり2-3個のIPしか得られなかった。

より速い方法を考え始める前に、私はその方法で携帯電話で合計400-500のIPを取得した。

その日、家に帰ってから、私はアプリをリバースエンジニアリングして、携帯電話を使わなくても簡単にシステムを回避し、プロキシを使う方法がないか調べ始めた。

アプリからのネットワーク・トラフィックを検査した結果、送信されていたのは、あなたのデバイスIDを含むjsonエンドポイント("https://ipinfo.io/json")への単一のリクエストだけであることに気づいた。


HTTP toolkitがIPinfoアプリを通過するトラフィックを監視している画面。(デバイス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回送るだけの非常にシンプルなスクリプトから始めた:


これはうまくいき、1分間に2-3IP程度だった速度が、1分間に30IP程度まで向上した(各リクエストにかかる時間は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を追加し、ProxyScrapewから10,000個の1分ローテーションプロキシーのリストを取得し、proxies.txtに貼り付けた。また、各スレッドを開始する間に短いスリープ時間を入れて、すべてがまったく同時に発生しないようにした。(これが問題を引き起こすようだ)。

あとは "range(500) "の数字を変えるだけで、何千ものIPがカウントされるようになった。

これらの変更により、私は1分間に数百のIPを取得できるようになった。それから2週間の狩りの間、毎日数千のIPを送り続けた。

イベントの主催者によると、私は149kのユニークIPを獲得することができた。その結果、私は世界6位になり、素敵な商品を手に入れることができた。
コンテストの結果はこちらで見ることができる: https://community.ipinfo.io/t/the-great-ip-hunt-is-over/3906

ステッカーパック、「I am a Huntathon Winner T-Shirt」、インターネットの地図が描かれたメモ用紙、そしてIPinfoの靴下を手に入れた。

これらはすべて3週間後に到着した:

免責事項として、IPinfoチームはこのアプリがリバースエンジニアリングされることを予期していたが、実際には、ブロックの周囲で人々がどのように創造的な解決策を見つけたかを知ることができ、非常に満足している。

最終的には、新しい人々と出会い、プロキシやアンドロイドのリバースエンジニアリングについて学び、そしてもちろん、無料の商品を手に入れることができた楽しい時間だった。

ベンジー