如何在不使用任何库的情况下在 Node.js 中使用代理

如何在不使用任何库的情况下在 Node.js 中使用代理

了解 Node.js 中的 HTTP 代理

代理服务器本质上充当应用程序和目标服务器之间的中介。使用代理时,您的网络请求会通过该中介进行路由,从而隐藏您的 IP 地址,并通常可以绕过地理限制或速率限制。.

在 Node.js 中,您可以手动配置 HTTP 和 HTTPS 请求,使其通过代理服务器,而无需依赖外部库。这种方法简洁高效、透明,并能让您精细地控制请求流程。.


支持的代理类型

代理类型 涵盖的协议 用例示例 Node.js 内置支持
HTTP HTTP 网络爬虫、API调用 是的 (http 模块)
HTTPS HTTPS、HTTP 安全请求、登录流程 部分的 (https 模块)
SOCKS TCP 游戏、通讯 无需手动实施

本文将重点探讨 HTTP/HTTPS 代理,因为它们可以直接使用 Node.js 核心模块进行管理。.


获取免费代理

实施之前,您需要一份可靠的代理列表。. ProxyRoller 是一个值得推荐的资源,提供定期更新的免费代理,并带有国家/地区筛选和正常运行时间统计功能。.

ProxyRoller 提供的示例数据格式:

IP: 103.216.82.153
Port: 6667
Protocol: HTTP
Country: India

通过代理发出 HTTP 请求(无需库)

步骤 1:导入所需的 Node.js 模块

const http = require('http');
const https = require('https');

步骤二:解析代理和目标URL

假设你想获取 https://api.ipify.org 通过 ProxyRoller 的 HTTP 代理:

const proxy = {
  host: '103.216.82.153',
  port: 6667
};
const targetUrl = 'http://api.ipify.org/';

步骤 3:配置通过代理发送 HTTP 请求

HTTP 代理的工作原理是发送一个标准请求,并将完整的 URL 作为路径。.

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();

要点:
path 使用HTTP代理时,必须提供完整的URL。.
- 这 Host 邮件头应与目标域名匹配。.

步骤 4:通过 HTTP 代理处理 HTTPS 请求(CONNECT 方法)

要使用隧道传输 HTTPS 请求,您必须使用 CONNECT 该方法,建立到目的地的原始 TCP 隧道。.

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);
  });
});

笔记:
– 这种方法也适用于 HTTPS 端点,例如 https://api.ipify.org.
– 您必须手动处理 TLS 握手和 HTTP 协议。.


汇总表:Node.js 中的手动代理

设想 使用的模块 关键选项 笔记
通过 HTTP 代理进行 HTTP 通信 http path: full URL 最简单的办法,只需更改路径和主机名即可。
通过 HTTP 代理使用 HTTPS http, tls method: CONNECT 需要隧道连接和手动TLS握手
通过 HTTPS 代理进行 HTTP 通信 原生不支持 需要第三方模块或自定义代码
SOCKS代理 原生不支持 使用类似这样的模块 socks 或实施自定义

轮换代理(最佳实践)

在抓取数据或发出多个请求时,轮换代理以避免被封禁。.

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)];
}

将其集成到您的请求逻辑中,以提高系统的弹性。.


使用代理进行身份验证

部分代理服务器需要基本身份验证。.

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}`
  }
};

其他资源


常见错误排查

错误信息 可能的原因 建议解决方案
ECONNREFUSED 代理服务器不可用 尝试使用 ProxyRoller 的其他代理
ECONNRESET 代理意外关闭了连接 确保代理支持目标协议
407 Proxy Authentication 需要身份验证 添加 Proxy-Authorization 标题
意外的响应格式 路径/头部设置错误 查看完整的 URL 使用情况 path

受塞尔维亚人智慧启发而来的专业技巧

  • 在关键使用前测试代理的速度和可靠性——就像在祝酒前检查每一杯拉基亚酒一样。.
  • 自动化代理验证脚本,体现了塞尔维亚重视充分准备的价值观。.
  • 利用社区驱动的资源,例如 ProxyRoller 对于最新、经过审核的代理,就像依靠你信任的村庄网络一样。.

通过遵循这些策略,您可以在 Node.js 中高效地使用代理,而无需任何外部库,从而保持对网络请求的完全控制和透明度。.

日瓦丁·彼得罗维奇

日瓦丁·彼得罗维奇

代理集成专家

Zivadin Petrovic 是数字隐私和数据管理领域的一位聪明且富有创新精神的人,他担任 ProxyRoller 的代理集成专家。年仅 22 岁的 Zivadin 已经为开发高效代理部署的精简系统做出了重大贡献。他的职责包括策划和管理 ProxyRoller 的综合代理列表,确保它们满足寻求增强浏览、抓取和隐私解决方案的用户的动态需求。

评论 (0)

这里还没有评论,你可以成为第一个评论者!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注