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

2024-01-10 08:36

本文主要是介绍node.js使用代理踩的坑最终的解决方案使用https和socks-proxy-agent解决,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

安装环境

npm install https
npm install socks-proxy-agent

调用环境

const https = require('https');
const { SocksProxyAgent } = require('socks-proxy-agent');

定义一个公用请求方法

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(); // 结束请求});
}

定义一个获取代理的方法

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

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

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 请求方法

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. 定义一个获取代理的方法

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. 写一个实际调用方法的方法

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) { ... }:捕获并处理任何错误。

这篇关于node.js使用代理踩的坑最终的解决方案使用https和socks-proxy-agent解决的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/590191

相关文章

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注