Node.js の Axios で使う HTTP プロキシと SOCKS プロキシ
Axios の Node HTTP アダプターで HTTP プロキシを設定し、選んだ IP が SOCKS のエンドポイントなら SOCKS エージェントを使います。
Axios の Node HTTP アダプターは、ホストと数値のポートを持つ HTTP プロキシオブジェクトを受け取ります。
import axios from 'axios';
const response = await axios.get('https://example.com/', {
adapter: 'http',
proxy: {
protocol: 'http',
host: '203.0.113.10',
port: 8080,
},
timeout: 15000,
});
console.log(response.status);
文書用のエンドポイントを、利用サービスかHTTP プロキシ一覧の HTTP 項目に置き換えてください。この例は Node 用です。ブラウザーの Axios は、これらのオプションでブラウザーのネットワークプロキシを選べません。host フィールドには URL スキームを含まないアドレスを指定します。
プロキシオブジェクトの protocol はプロキシの待ち受け側を表します。Axios 1.21.0 の Node HTTP アダプターは HTTPS の接続先に CONNECT を使い、その後トンネル内でオリジンサーバーと TLS を交渉します。古いリリースでは別のプロキシ経路が使われていたため、インストールされたバージョンが重要です。
SOCKS URL には SOCKS エージェントが必要
HTTP プロキシオブジェクトでは SOCKS を選べません。代わりに互換性のあるエージェントを使います。
npm install [email protected] [email protected]
import axios from 'axios';
import { SocksProxyAgent } from 'socks-proxy-agent';
const agent = new SocksProxyAgent('socks5h://203.0.113.10:1080');
try {
const response = await axios.get('https://example.com/', {
adapter: 'http',
httpAgent: agent,
httpsAgent: agent,
proxy: false,
timeout: 15000,
});
console.log(response.status);
} finally {
agent.destroy();
}
proxy: false は、SOCKS エージェントが提供する経路について Axios の HTTP プロキシ処理を無効にします。HTTP と HTTPS の両方の接続先にエージェントを渡すことで、両スキームをカバーします。ここでは socks5h が接続先の DNS 解決を SOCKS 側に委ねます。選んだサーバーはそのプロトコルに対応している必要があります。
失敗を読み解く
サイトが成功以外のステータスを返した場合、Axios のエラーにはレスポンスが含まれることがあります。なければエラーコードと接続の詳細を調べてください。モジュール不足、非対応プロトコル、互換性のない Node バージョンでは、リクエストがエンドポイントに届く前に失敗する場合があります。
認証付き HTTP プロキシには、プロキシオブジェクトの auth フィールドと運営者が提供した認証情報を使います。接続先の認証設定は別の相手に対するものです。