node.js使用代理踩的坑最终的解决方案使用https和socks-proxy-agent解决

安装环境

npm install https

npm install socks-proxy-agent

调用环境

javascript 复制代码
const https = require('https');
const { SocksProxyAgent } = require('socks-proxy-agent');

定义一个公用请求方法

javascript 复制代码
function httpsRequest(options, body) {
    return new Promise((resolve, reject) => {
        const req = https.request(options, (res) => {
            let responseData = '';
            
            res.on('data', (chunk) => {
                responseData += chunk;
            });

            res.on('end', () => {
                resolve(responseData); // 当收到完整的响应数据时,解析 Promise
            });
        });

        req.on('error', (error) => {
            reject(error); // 在请求错误时拒绝 Promise
        });

        if (body) {
            req.write(body); // 写入请求主体
        }
        req.end(); // 结束请求
    });
}

定义一个获取代理的方法

javascript 复制代码
async function fetchAndPrintUrl() {
    const url = '获取json返回的socks5的代理';

    try {
        const response = await axios.get(url);
        return response.data
    } catch (error) {
        console.error('Error fetching the URL:', error);
    }
}

写一个实际掉用方法的方法

javascript 复制代码
async function new_get_token(ak, sk, lujin, url, appid, code) {
    // 示例使用
    let method = 'POST';
    let offset = 0; // 如有需要,替换为实际的偏移量
    let dataObj = {
        appId: appid,
        code: code
    };

    // 使用 JSON.stringify 转换为 JSON 字符串
    let body = JSON.stringify(dataObj);
    let headers = encryption_data2(ak, sk, method, lujin, body, offset, appid);
    try {
        const portData = await fetchAndPrintUrl();
        const pp = portData.data[0];
        let ip = pp.ip;
        let port = pp.port;
        const socksProxyUrl = `socks5://${ip}:${port}`;
        // 忽略 SSL/TLS 证书验证
        const agent = new SocksProxyAgent(socksProxyUrl, {
            rejectUnauthorized: false  // 忽略 SSL/TLS 证书验证
        });
        const options = {
            hostname: ip,
            port: port,
            path: url,
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'Content-Length': Buffer.byteLength(body),
                ...headers
            },
            agent: agent  // 如果您没有使用代理,可以省略这一行
        };
        let response = await httpsRequest(options, body);
        return response.data; // 返回数据而不是打印
    } catch (error) {
        console.error('Error making request:', error);
        throw error; // 抛出错误
    }
}

CHATGPT协助整理文档

1. 定义一个通用的 HTTPS 请求方法

javascript 复制代码
function httpsRequest(options, body) {
    // ...
}

这段代码定义了一个名为 httpsRequest 的函数,用于发起 HTTPS 请求。它利用 JavaScript 的 Promise 来处理异步操作,确保请求完成后再继续执行后续代码。这个函数接受两个参数:options(请求配置)和 body(请求体)。

  • new Promise((resolve, reject) => { ... }):创建一个新的 Promise 对象,用于处理异步操作。
  • https.request(options, (res) => { ... }):发起 HTTPS 请求,其中 options 包含了请求的配置信息(如 URL、请求方法、头部等)。
  • res.on('data', (chunk) => { ... }):当接收到数据块时触发,将数据块累加到 responseData 字符串中。
  • res.on('end', () => { ... }):当响应结束时触发,此时 resolve(responseData) 会解析 Promise,并返回完整的响应数据。
  • req.on('error', (error) => { ... }):监听请求过程中的错误,如有错误则通过 reject(error) 拒绝 Promise。
  • if (body) { req.write(body); }:如果有请求体,则将其写入请求中。
  • req.end();:结束请求。

2. 定义一个获取代理的方法

javascript 复制代码
async function fetchAndPrintUrl() {
    // ...
}

这个异步函数 fetchAndPrintUrl 用于获取一个 URL,并返回其 JSON 响应中的 socks5 代理信息。

  • const url = '获取json返回的socks5的代理';:这里应该是一个实际的 URL,用于请求 socks5 代理信息。
  • const response = await axios.get(url);:使用 axios 库发起 GET 请求,获取 URL 的内容。
  • return response.data:返回响应的数据部分。
  • catch (error) { ... }:捕获并处理任何错误。

3. 写一个实际调用方法的方法

javascript 复制代码
async function new_get_token(ak, sk, lujin, url, appid, code) {
    // ...
}

这个异步函数 new_get_token 用于发送一个特定的 HTTPS 请求,并返回其响应。

  • 参数包括 ak(Access Key),sk(Secret Key),lujin(路径),url(请求的 URL),appidcode(应用程序特定的参数)。
  • encryption_data2(...):这看起来是一个自定义函数,用于生成请求的头部信息。
  • fetchAndPrintUrl():调用前面定义的函数来获取代理信息。
  • const agent = new SocksProxyAgent(socksProxyUrl, { ... }):创建一个代理代理,用于发送请求。
  • const options = { ... }:设置请求的配置信息。
  • let response = await httpsRequest(options, body);:使用前面定义的 httpsRequest 函数发起请求。
  • return response.data;:返回请求的响应数据。
  • catch (error) { ... }:捕获并处理任何错误。
相关推荐
花生了什么事o1 小时前
DNS:把域名翻译成 IP 的层级查询机制
网络·网络协议·tcp/ip
2401_873479403 小时前
金融合规新规下IP查询怎么做?用IP离线库实现数据不出域
网络协议·tcp/ip·金融·ip
大家的林语冰4 小时前
✌️ Deno 2.9 来了,ESM 直接导入 CSS,甚至能开发桌面应用?!
前端·javascript·node.js
微硬创新5 小时前
汽车制造产线协同:耐达讯PROFINETDeviceNet网关在机器人通信中的应用
人工智能·物联网·网络协议·自动化·汽车·制造·信息与通信
米尔的可达鸭5 小时前
深入操作系统 Socket 底层:套接字控制块、FD映射、阻塞IO核心完整实现
arm开发·数据结构·websocket·网络协议·算法·架构·安全架构
Keepingrun7 小时前
http登录和授权
网络·网络协议·http
Lhappy嘻嘻9 小时前
网络初识|基础入门:局域网广域网、IP 端口、TCP/IP 五层模型与封装解封装全过程
java·开发语言·网络·笔记·网络协议·tcp/ip
laoli_coding17 小时前
如何配置HTTPS站点访问的免费SSL域名证书
网络协议·https·node.js·ssl
To_OC17 小时前
手写 AI 编程 Agent 的命令执行工具:我被 child_process 坑出来的实战经验
后端·node.js·agent
大家的林语冰1 天前
👍 Rust 为 Node 插上翅膀,反超 Bun 和 pnpm,一体化工具我也有!
前端·javascript·node.js