IPv4 の IP:port 項目を一行ずつ proxies.txt に記載します。すべて同じ既知のプロキシプロトコルに属している必要があります。無料プロキシ一覧から集める場合は、このテキスト入力を作る前にプロトコルを分けます。この整理処理は、認証情報入り URL、CSV の列、IPv6 アドレスを受け付けません。

標準ライブラリーだけを使うこのスクリプトを、同じディレクトリーに clean-proxies.py として保存します。

from ipaddress import IPv4Address
from pathlib import Path

seen = set()
cleaned = []

for number, raw in enumerate(
    Path("proxies.txt").read_text(encoding="utf-8").splitlines(),
    start=1,
):
    text = raw.strip()
    if not text:
        continue
    try:
        host, port_text = text.rsplit(":", 1)
        host = str(IPv4Address(host))
        port = int(port_text)
        if not 1 <= port <= 65535:
            raise ValueError("port out of range")
    except ValueError:
        print(f"Skipping line {number}: invalid IPv4 endpoint")
        continue

    endpoint = (host, port)
    if endpoint not in seen:
        seen.add(endpoint)
        cleaned.append(f"{host}:{port}")

output = "\n".join(cleaned)
Path("proxies-clean.txt").write_text(
    output + ("\n" if output else ""),
    encoding="utf-8",
)
print(f"Saved {len(cleaned)} endpoints")

そのディレクトリーから実行します。

uv run --no-project python clean-proxies.py

スキップ行の通知と proxies-clean.txt を確認します。入力ファイルはそのまま残ります。出力は初出順を保ち、アドレスと数値のポートの組で重複を除きます。203.0.113.10:8080 が二件、203.0.113.10:3128 が一件あれば、接続先は二件になります。十進ポート 08080 は 8080 に正規化されます。

文書用アドレスは形式の例にすぎません。有効な IPv4 構文にはプライベートや特殊用途のアドレスも含まれるため、整理済みでもインターネットから到達できるとは限りません。公開アドレスだけが必要なら、明示的なアドレス方針を追加します。

HTTP/SOCKS が混在する入力では、別ファイルか列にプロトコル情報を残し、ポート 1080 から推測しないでください。実際の形式が角括弧付き IPv6 なら対応するパーサーを使います。このスクリプトは推測せず、未対応の入力を拒否します。出力から可用性、匿名性、国、速度は分かりません。それらには条件を管理した接続テストが必要です。

関連記事