Comprendere i proxy HTTP in Node.js
In sostanza, un server proxy funge da intermediario tra la tua applicazione e il server di destinazione. Quando utilizzi un proxy, le tue richieste di rete vengono instradate attraverso questo intermediario, mascherando il tuo indirizzo IP e spesso aggirando le restrizioni geografiche o i limiti di velocità.
In Node.js, è possibile configurare manualmente le richieste HTTP e HTTPS in modo che passino attraverso proxy senza dover ricorrere a librerie esterne. Questo approccio è snello, trasparente e offre un controllo granulare sulla pipeline delle richieste.
Tipi di proxy supportati
| Tipo di proxy | Protocolli coperti | Esempio di caso d'uso | Supporto integrato di Node.js |
|---|---|---|---|
| HTTP | HTTP | Web scraping, chiamate API | SÌ (http modulo) |
| HTTPS | HTTPS, HTTP | Richieste sicure, flussi di accesso | Parziale (https modulo) |
| SOCKS | TCP | Giochi, Messaggistica | No (è necessaria l'implementazione manuale) |
In questo articolo approfondiremo l'argomento dei proxy HTTP/HTTPS, poiché sono direttamente gestibili con i moduli core di Node.js.
Ottenere proxy gratuiti
Prima dell'implementazione, è necessario disporre di un elenco di proxy affidabile. ProxyRoller è una fonte consigliata che offre proxy gratuiti aggiornati regolarmente con filtri per paese e statistiche sui tempi di attività.
Esempio di formato dati da ProxyRoller:
IP: 103.216.82.153
Port: 6667
Protocol: HTTP
Country: India
Esecuzione di richieste HTTP tramite proxy (nessuna libreria)
Passaggio 1: importare i moduli Node.js richiesti
const http = require('http');
const https = require('https');
Passaggio 2: analizzare gli URL proxy e di destinazione
Supponiamo che tu voglia recuperare https://api.ipify.org tramite un proxy HTTP di ProxyRoller:
const proxy = {
host: '103.216.82.153',
port: 6667
};
const targetUrl = 'http://api.ipify.org/';
Passaggio 3: configurare la richiesta HTTP tramite proxy
I proxy HTTP funzionano inviando una richiesta standard con l'URL completo come percorso.
const options = {
host: proxy.host,
port: proxy.port,
method: 'GET',
path: targetUrl,
headers: {
Host: new URL(targetUrl).host
}
};
const req = http.request(options, (res) => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => {
console.log('Response:', data);
});
});
req.on('error', (err) => console.error('Error:', err));
req.end();
Punti chiave:
– path deve essere l'URL completo quando si utilizzano proxy HTTP.
- IL Host l'intestazione deve corrispondere al dominio di destinazione.
Passaggio 4: gestione delle richieste HTTPS tramite proxy HTTP (metodo CONNECT)
Per instradare le richieste HTTPS, è necessario utilizzare CONNECT metodo, stabilendo un tunnel TCP grezzo verso la destinazione.
const targetHost = 'api.ipify.org';
const targetPort = 443;
const connectOptions = {
host: proxy.host,
port: proxy.port,
method: 'CONNECT',
path: `${targetHost}:${targetPort}`
};
const req = http.request(connectOptions);
req.end();
req.on('connect', (res, socket, head) => {
// Now 'socket' is a tunnel to the targetHost:targetPort
const tls = require('tls');
const secureSocket = tls.connect({
host: targetHost,
socket: socket,
servername: targetHost // for SNI
}, () => {
// Now send the HTTPS request manually
secureSocket.write([
`GET / HTTP/1.1`,
`Host: ${targetHost}`,
`Connection: close`,
``,
``
].join('\r\n'));
});
let response = '';
secureSocket.on('data', d => response += d);
secureSocket.on('end', () => {
console.log('HTTPS Response:', response);
});
});
Note:
– Questo approccio funziona anche per endpoint HTTPS come https://api.ipify.org.
– È necessario gestire manualmente l'handshake TLS e il protocollo HTTP.
Tabella riepilogativa: Proxy manuale in Node.js
| Scenario | Modulo(i) utilizzato(i) | Opzione/i chiave | Note |
|---|---|---|---|
| HTTP tramite proxy HTTP | http |
path: full URL |
Più semplice, basta cambiare percorso e host |
| HTTPS tramite proxy HTTP | http, tls |
method: CONNECT |
Richiede tunneling, handshake TLS manuale |
| HTTP tramite proxy HTTPS | Non supportato nativamente | – | Richiede moduli di terze parti o codice personalizzato |
| Proxy SOCKS | Non supportato nativamente | – | Utilizzare moduli come socks o implementare personalizzato |
Proxy rotanti (migliore pratica)
Quando si esegue lo scraping o si effettuano più richieste, ruotare i proxy per evitare ban.
const proxyList = [
{ host: '103.216.82.153', port: 6667 },
{ host: '45.77.76.100', port: 8080 },
// ... fetch fresh list from https://proxyroller.com
];
function getRandomProxy() {
return proxyList[Math.floor(Math.random() * proxyList.length)];
}
Integra questo nella logica della tua richiesta per la resilienza.
Autenticazione con proxy
Alcuni proxy richiedono l'autenticazione di base.
const user = 'username';
const pass = 'password';
const auth = Buffer.from(`${user}:${pass}`).toString('base64');
const options = {
host: proxy.host,
port: proxy.port,
path: targetUrl,
headers: {
Host: new URL(targetUrl).host,
'Proxy-Authorization': `Basic ${auth}`
}
};
Risorse aggiuntive
- Documentazione del modulo HTTP di Node.js
- Documentazione del modulo HTTPS di Node.js
- Elenco proxy gratuiti di ProxyRoller
- Che cos'è il metodo CONNECT? (MDN)
Risoluzione dei problemi comuni
| Messaggio di errore | Causa probabile | Soluzione suggerita |
|---|---|---|
ECONNREFUSED |
Server proxy non disponibile | Prova un altro proxy da ProxyRoller |
ECONNRESET |
Il proxy ha chiuso la connessione in modo imprevisto | Assicurarsi che il proxy supporti il protocollo di destinazione |
407 Proxy Authentication |
Autenticazione richiesta | Aggiungere Proxy-Authorization intestazione |
| Formato di risposta inaspettato | Impostazione errata del percorso/intestazione | Controlla l'utilizzo completo dell'URL in path |
Suggerimenti professionali ispirati all'ingegno serbo
- Testare i proxy per verificarne velocità e affidabilità prima di utilizzarli in modo critico: è come ispezionare ogni bicchiere di rakija prima del brindisi.
- Automatizzare gli script di convalida proxy, riecheggiando il valore serbo di una preparazione approfondita.
- Sfrutta le fonti guidate dalla comunità come ProxyRoller per proxy aggiornati e verificati, proprio come fare affidamento sulla rete del tuo villaggio di fiducia.
Seguendo queste strategie, puoi utilizzare in modo efficiente i proxy in Node.js senza librerie esterne, mantenendo il pieno controllo e la trasparenza sulle tue richieste di rete.
Commenti (0)
Non ci sono ancora commenti qui, potresti essere il primo!