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

相关文章

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

Jsoncpp的安装与使用方式

《Jsoncpp的安装与使用方式》JsonCpp是一个用于解析和生成JSON数据的C++库,它支持解析JSON文件或字符串到C++对象,以及将C++对象序列化回JSON格式,安装JsonCpp可以通过... 目录安装jsoncppJsoncpp的使用Value类构造函数检测保存的数据类型提取数据对json数

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

element-ui下拉输入框+resetFields无法回显的问题解决

《element-ui下拉输入框+resetFields无法回显的问题解决》本文主要介绍了在使用ElementUI的下拉输入框时,点击重置按钮后输入框无法回显数据的问题,具有一定的参考价值,感兴趣的... 目录描述原因问题重现解决方案方法一方法二总结描述第一次进入页面,不做任何操作,点击重置按钮,再进行下

springboot整合 xxl-job及使用步骤

《springboot整合xxl-job及使用步骤》XXL-JOB是一个分布式任务调度平台,用于解决分布式系统中的任务调度和管理问题,文章详细介绍了XXL-JOB的架构,包括调度中心、执行器和Web... 目录一、xxl-job是什么二、使用步骤1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功

python 字典d[k]中key不存在的解决方案

《python字典d[k]中key不存在的解决方案》本文主要介绍了在Python中处理字典键不存在时获取默认值的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录defaultdict:处理找不到的键的一个选择特殊方法__missing__有时候为了方便起见,

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —