IP:port を求めるアプリもあれば、http:// や socks5:// で始まるURLが必要なアプリもあります。ブラウザーの設定ではアドレスとポートを別々の欄に入力することが多いため、同じ接続先でもアドレスを変えずに複数の形式で表せます。

IPv4の項目

HTTPプロキシ一覧に、例としてHTTPプロキシ 203.0.113.10:8080 が載っているとします。

アプリが求める項目入力値
ホストまたはIP203.0.113.10
ポート8080
HTTPプロキシのURLhttp://203.0.113.10:8080

ポートを二重に指定しないでください。ポート欄が別にあるのにホスト欄へ 203.0.113.10:8080 を入力すると、アプリが文字列全体をホスト名として名前解決しようとすることがあります。同様に、IPアドレスだけを明示的に求める欄へスキームを加えないでください。

スキームはサービスに合わせる必要があります。アドレスを変換する前に、クライアントの対応状況に応じてHTTPかSOCKS5を選びます。HTTPの接続先に socks5:// を付けても、クライアントが送る内容が変わるだけで、そのサーバーでSOCKS5が有効になるわけではありません。

URL内のIPv6には角括弧が必要

IPv6アドレスにはもともとコロンが含まれるため、URLではアドレスを角括弧で囲んでからポートを追加します。

http://[2001:db8::10]:8080
socks5://[2001:db8::10]:1080

角括弧がないとアドレスとポートの境界が曖昧になります。入力欄が別々のアプリでは通常、ホストに 2001:db8::10、ポートに 8080 を指定しますが、そのアプリの入力形式に従ってください。ここで使う二つのアドレスは文書用の例であり、稼働中のプロキシではありません。

コロンごとに分割せずURLを解析する

短いPythonスクリプトと標準URLパーサーで、IPv4と角括弧付きIPv6のURLを扱えます。

from urllib.parse import urlsplit

proxy = urlsplit("http://[2001:db8::10]:8080")
print(proxy.scheme)
print(proxy.hostname)
print(proxy.port)

hostnameプロパティは角括弧を除いたアドレスを返します。元の文字列をすべてのコロンで分割すると、この例を正しく扱えません。実際のインポーターではホストの欠落、未対応のスキーム、1–65535以外のポートも拒否してください。URL解析で得られるのは構成要素であり、サービスの存在を証明するものではありません。

一覧にユーザー名とパスワードが含まれる場合

よくあるURL形式は http://username:password@host:port です。認証情報内の @、#、/ などは適切なURLエンコードが必要です。クライアントに認証情報の専用欄があれば、URLを手作業で組み立てるより、通常はその欄を使う方が簡単です。

コロン区切りの認証情報を変換する前に、提供元の元の形式を確認してください。コロンで区切られた四つのフィールドに共通の意味はなく、パスワード自体にもコロンが含まれ得ます。単純なIP:port行用のパーサーが、別形式を黙って推測してはいけません。

関連記事