如何通过SOCKS代理实现WHOIS协议请求?
如何通过SOCKS代理实现WHOIS协议请求?
看起来你踩了个常见的坑——很多WHOIS库(包括你用的这个whois包)的proxy参数其实是为HTTP代理设计的,并不直接支持SocksProxyAgent这种Agent实例,这就是为啥你试了各种库都没效果的原因。
别着急,咱们换个思路:WHOIS本质是基于TCP端口43的简单文本协议,咱们可以直接通过SOCKS代理建立TCP连接,手动发送查询请求。下面给你两种可行的方案:
方案一:用socks库直接建立SOCKS代理连接
首先安装专门处理SOCKS代理TCP连接的socks包:
npm install socks
然后用下面的代码实现WHOIS查询:
const { SocksClient } = require('socks'); const { createInterface } = require('readline'); const domain = 'google.com'; const proxyConfig = { proxy: { host: '你的代理IP', port: 你的代理端口, type: 5, // 指定为SOCKS5类型 // 如果代理需要账号密码认证,取消下面两行注释 // userId: '你的代理用户名', // password: '你的代理密码' }, command: 'connect', destination: { host: 'whois.iana.org', // 通用WHOIS服务器,也可换成对应域名的专属服务器(比如com域用whois.verisign-grs.com) port: 43 } }; // 建立SOCKS代理连接 SocksClient.createConnection(proxyConfig, (err, info) => { if (err) { console.error('代理连接失败:', err.message); return; } // 连接成功后,发送WHOIS查询命令 info.socket.write(domain + '\r\n'); // 读取服务器返回的数据 const rl = createInterface({ input: info.socket, crlfDelay: Infinity }); let whoisData = ''; rl.on('line', (line) => { whoisData += line + '\n'; }); rl.on('close', () => { console.log('WHOIS查询结果:\n', whoisData); info.socket.destroy(); }); info.socket.on('error', (socketErr) => { console.error('Socket错误:', socketErr.message); }); });
方案二:给whois库替换自定义Socket
如果你不想换库,也可以尝试重写whois库的连接逻辑,让它用SOCKS代理的Socket(注意:仅部分版本的whois库支持这个自定义选项):
const whois = require('whois'); const { SocksProxyAgent } = require('socks-proxy-agent'); const domain = 'google.com'; const proxyAgent = new SocksProxyAgent(`socks5://你的代理地址:端口`); // 通过自定义socket函数,让whois库使用SOCKS代理连接 whois.lookup(domain, { socket: (options) => { return proxyAgent.createSocket(options, (err) => { if (err) console.error('Socket创建失败:', err); }); } }, (err, data) => { if (err) { console.error(err.message); } else { console.log('WHOIS Data:', data); } });
最后提醒下:有些WHOIS服务器会限制频繁查询,或者需要对应域名后缀的专属服务器,你可以根据查询的域名调整目标WHOIS服务器地址。
备注:内容来源于stack exchange,提问作者tommy gabe
相关产品推荐
相关产品推荐

