プロキシのIPとポート:アプリにはどの形式が必要?
プロキシ一覧の項目をHTTPやSOCKSのURLに変換し、ホストとポートの個別欄やIPv6アドレスを正しく扱います。
IP:port を求めるアプリもあれば、http:// や socks5:// で始まるURLが必要なアプリもあります。ブラウザーの設定ではアドレスとポートを別々の欄に入力することが多いため、同じ接続先でもアドレスを変えずに複数の形式で表せます。
IPv4の項目
HTTPプロキシ一覧に、例としてHTTPプロキシ 203.0.113.10:8080 が載っているとします。
| アプリが求める項目 | 入力値 |
|---|---|
| ホストまたはIP | 203.0.113.10 |
| ポート | 8080 |
| HTTPプロキシのURL | http://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行用のパーサーが、別形式を黙って推測してはいけません。