在NodeJS中通过SOCKS5代理执行http请求

31

我计划在NodeJS中使用Tor进行一系列的HTTP请求。
Tor使用SOCKS5,因此我去寻找了一种在NodeJS中进行HTTP代理的方法。
我计划使用默认的http.request()函数来完成工作。
然而,我似乎找不到一种使用代理的方法。
有人建议我可以这样做:

var http = require("http");
var options = {
  host: "localhost",
  port: 9050,
  path: "http://check.torproject.org",
  method: 'GET',
  headers: {
    Host: "http://check.torproject.org",
  }
};
var req = http.request(options, function(res) {
  res.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
  });
});

但它没有起作用。
那么,有什么建议吗?


已在此回答 https://stackoverflow.com/a/70807964/82686 - Konstantin Tarkus
6个回答

31
我刚发布了两个模块,可以帮助您完成这项任务:socks5-http-clientsocks5-https-client
只需使用这些模块代替默认的http模块即可。API是相同的。例如:
require('socks5-http-client').request(options, function(res) {
    console.log('STATUS: ' + res.statusCode);
    console.log('HEADERS: ' + JSON.stringify(res.headers));
    res.setEncoding('utf8');
    res.on('data', function (chunk) {
        console.log('BODY: ' + chunk);
    });
});

1
npm install socks5-http-client :) 安装socks5-http-client :) - Frizi
1
有什么想法为什么它在 Promise 中不起作用?我得到了 ECONNREFUSED。 - Toolkit
5
由于某些原因,这会导致错误:连接被拒绝,127.0.0.1:1080。它覆盖了我的端口9050。 - ierdna

13

我知道我在回答一个老问题,但是现在有一个更好的解决方案可以用于在Node.js中使用sock4和sock5代理。为了简单起见,我将使用request-promise模块,但你也可以使用裸的request模块。

要求:socks-proxy-agentrequest-promise

示例:

async function main() {


var proxy = "socks4://1.2.3.4:35618"

var agent = new SocksProxyAgent(proxy);

var options = {
    uri: 'http://targetUrl',
    agent: agent,
    headers: {
        'User-Agent': 'Request-Promise'
    }
}

try {
    var responce = await rp(options)
} catch(err) {
    console.log(err)
}

console.log(responce)  }

1
点赞了!但是我怎么知道它是否工作,我正在通过websocket ws模块连接并从这里https://www.socks-proxy.net/测试一些免费的socks代理。问题是似乎无论端口和主机组合是否正确,它都可以连接。 - PirateApp
2
你可以尝试将此URL https://wtfismyip.com/json 替换为目标URL。如果代理正常工作,您应该会看到代理的IP和代理的ISP作为您自己的IP。我希望你明白了。 - Point Networks
有没有办法与此同时使用客户端证书? - alayor

2

我曾经遇到同样的问题,使用Polipo作为节点和TOR之间的代理。

node (request) - polilp httproxy:8123 -  polipo - tor (socks5:9050).

对于Mac(带有brew的OSX),操作如下:

brew install polipo tor
tor # start top
polipo socksParentProxy=localhost:9050 # start polipo

使用request的工作示例

var request = require('request');
var options = {'url':'https://check.torproject.org/', 'proxy':'http://localhost:8123'}

request(options,
            function (error, response, body) {
            if (error){
                console.log(error);
                return;
            }

            var usingTor = (body.indexOf('Congratulations. This browser is configured to use Tor.')  !== -1);
            expect(usingTor).to.equal(true);   

        });

1
为什么有人踩了这个回答?这是唯一一个在这里真正有效的答案。 - ierdna

2

1
如果您在*nix机器上,可以使用tsocks。它将“socksify”整个过程,因此您甚至可以用它来处理那些根本不支持代理的东西。这篇文章有一些很好的例子。
基本上只需执行tsocks node myscript.js就行了。我不确定是否适用于tsocks npm start,但您可以试试(npm将您的代码作为子进程启动)。
您需要做一些设置(将server = 127.0.0.1放入etc/tsocks.conf中)。

在 /etc 目录下找不到 tsocks.conf 文件。 - Dohab

0

请注意,仅链接答案是不被鼓励的,SO答案应该是寻找解决方案的终点(而不是另一个参考站点,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的摘要,将链接作为参考。 - kleopatra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接