node.js使用代理踩的坑最终的解决方案使用https和socks-proxy-agent解决
2024-01-09 18:56:46
安装环境
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),appid
和code
(应用程序特定的参数)。 encryption_data2(...)
:这看起来是一个自定义函数,用于生成请求的头部信息。fetchAndPrintUrl()
:调用前面定义的函数来获取代理信息。const agent = new SocksProxyAgent(socksProxyUrl, { ... })
:创建一个代理代理,用于发送请求。const options = { ... }
:设置请求的配置信息。let response = await httpsRequest(options, body);
:使用前面定义的httpsRequest
函数发起请求。return response.data;
:返回请求的响应数据。catch (error) { ... }
:捕获并处理任何错误。
文章来源:https://blog.csdn.net/weixin_40541330/article/details/135482452
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!