gpt4 book ai didi

node.js - 如何在 node.js 中同时使用多个代理(代理)

转载 作者:行者123 更新时间:2023-12-03 12:17:13 26 4
gpt4 key购买 nike

我正在使用一个可以使用 http.Agent 的 HTTP 请求库。实例,以便通过特定代理路由您的请求。
让我给你举个例子:

const SocksProxyAgent = require('socks-proxy-agent')
const HttpProxyAgent = require('http-proxy-agent') // not used
const axios = require('axios')

// requires Tor service to be running
const torProxyAgent = new SocksProxyAgent('socks://circuit1@127.0.0.1:9050')
// not used
const otherProxyAgent = new HttpProxyAgent('http://admin:1234@localhost:8888')

const axiosConfig = {
httpsAgent: torProxyAgent,
httpAgent: torProxyAgent
}

const axiosInstance = axios.create(axiosConfig)

axiosInstance.get('https://ifconfig.io/ip')
.then(res => {
console.log('Public IP address:', res.data)
}).catch(err => {
console.log(err)
})
如您所见,我指定了多个代理( torProxyAgentotherProxyAgent ),但我只能使用一个。
所以我正在寻找的是一种 super 代理,我可以将它传递给我的 HTTP 请求库,然后这个 super 代理将任意数量的普通代理链接在一起,方法是通过第一个路由我的所有请求,然后通过第二个,然后通过第三个等等......
这甚至可能吗?有没有现成的解决方案?
有没有办法使用 Proxy类来创建一个假代理,将所有方法调用传递给一个代理,然后再传递给第二个代理?
编辑:
虽然我很感激 lifeisfoo's answer ,它只解决了一个理论上的问题,我碰巧只使用了两个代理(一个 HTTP 代理和一个 socks 代理)。实际上,我不想局限于两个代理,我希望能够指定顺序。

最佳答案

更新答案 - axios + socks-proxy-agent + http 代理
看起来解决方案比我想象的要容易:

const SocksProxyAgent = require('socks-proxy-agent')
const axios = require('axios')

const torProxyAgent = new SocksProxyAgent('socks://circuit1@127.0.0.1:9050')

const axiosConfig = {
httpsAgent: torProxyAgent,
httpAgent: torProxyAgent,
proxy: {
protocol: 'http', //'http',
host: '89.208.35.81', // your http proxy ip
port: 3128, // your http proxy port
// optional - add it if your proxy require auth
auth: {
username: 'myuser',
password: 'mypass'
}
}
}

const axiosInstance = axios.create(axiosConfig)

axiosInstance.get('https://ifconfig.io/ip')
.then(res => {
console.log('Public IP address:', res.data)
}).catch(err => {
console.log(err)
})
确保仅当您的 socks 代理在本地运行时才使用 localhost HTTP 代理,否则将无法访问。显然,socks 和代理 IP 应该更新为可用的,我使用了一些在 public proxy list 上找到的 IP。作为测试,但它们不可靠。
这个怎么运作
nodejs 文档 sasys 说 Agent :

[...] is responsible for managing connection persistence and reuse for HTTP clients. It maintains a queue of pending requests for a given host and port, reusing a single socket connection for each until the queue is empty.


基本上,它暴露了 createConnection返回套接字的函数:

This method is guaranteed to return an instance of the <net.Socket> class, a subclass of <stream.Duplex>, unless the user specifies a socket type other than <net.Socket>.


如果您查看另一个 socks 代理的源代码,例如 socks5-http-client/lib/Agent,则很容易看到这种行为。 :
var http = require('http');
var inherits = require('util').inherits;
var socksClient = require('socks5-client');

function Agent(options) {
http.Agent.call(this, options);
this.createConnection = socksClient.createConnection;
}

inherits(Agent, http.Agent);

module.exports = Agent;
尝试调试请求流,你会看到socks连接数据和http数据都写在了socket上。添加断点或登录 Socks5ClientSocket.prototype.write function
Socks5ClientSocket.prototype.write = function(data, encoding, cb) {
console.log('Writing', data);
return this.socket.write(data, encoding, cb);
};
你会看到这样的东西:
Writing <Buffer 05 01 00>
Writing <Buffer 05 01 00 01 59 d0 23 51 0c 38>
Writing GET http://ip-api.com/json HTTP/1.1 ....// http request data
前两行是建立 socks connection 的字节。到 socks 代理,然后将 http 数据写入同一个套接字,但使用 http 代理作为目标主机。
因此,从 http 库的角度来看,代理只是一个 socket提供者,因此您可以根据需要创建此套接字,可能在同一个套接字上链接更多连接(请参阅我的原始答案)。
axios + socks5-http-client + http 代理
var Agent = require('socks5-http-client/lib/Agent');
var axios = require('axios');

const socksProxyOpts = {
socksHost: '5.189.130.21',
socksPort: 1080
};
const socksAgent = new Agent(socksProxyOpts);
const axiosConfig = {
httpAgent: socksAgent,
proxy: {
protocol: 'http',
host: '89.208.35.81',// or '45.33.99.194',
port: 3128 // or 8888
}
}

const axiosInstance = axios.create(axiosConfig)

axiosInstance.get('http://ip-api.com/json')
.then(res => {
console.log('Public IP address:', res.data)
}).catch(err => {
console.log(err)
})

原始答案
是的,正如您在 C proxychains application 中看到的那样,这是可能的。并从其 configuration file :
[ProxyList]
# based on you configuration
socks4 127.0.0.1 9050 circuit1
http localhost 8888 admin 1234
但看起来没有一个现有的 Node 模块能够处理一系列混合类型的代理( socks 、http)。
socks库可以处理 chain of socks proxies但是这个功能 isn't already exposed到您正在使用的 socks-proxy-agent 。
可以使用 http-proxy 实现 http 代理链和来自 gist 的代码.
所以你有三个选择:
  • 使用现有的 proxychains application
  • 使用 socks 使用一系列 socks 代理
  • 破解 socks 库以在链中添加对 http 代理的支持

  • 如果您选择最后一个,请务必查看 createConnectionChain 的 socks 库源代码。功能 for the chain creation logic .
    也可以看看:
  • [斯卡拉] https://github.com/Karasiq/proxychain
  • [铁锈] https://github.com/eycorsican/leaf
  • [JS] https://www.npmjs.com/package/tunnel
  • 关于node.js - 如何在 node.js 中同时使用多个代理(代理),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64954667/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com