如何使用axios和socks代理下载文件

How to download file using axios and socks proxy agent

所以我打算在nodejs中使用axios和socks代理下载一个文件。 当然,只用axios的时候下载是成功的。 但是如果在axios初始化的时候加入了socks proxy代理就不行了

下面是下载功能的代码

async function downloadFile(fileUrl, outputLocationPath, proxy_agent) {
  const writer = fs.createWriteStream(outputLocationPath);

  const client = axios.create({
    baseURL: fileUrl,
    responseType: 'stream',
    httpsAgent: proxy_agent,
    httpAgent: proxy_agent
  });

  const response = await client.get();

  response.data.pipe(writer);

  return new Promise((resolve, reject) => {
    writer.on('finish', resolve);
    writer.on('error', reject);
  });
}

当我使用 fileURL 就像 json 对象 link 例如“https://myip.wtf/json”时,它真的获取代理服务器的 ip 地址并将其保存到一个文件。 但是当我指定其他 url 时,会显示套接字挂起错误。 我不明白为什么会这样。 JSON 请求工作正常,但在普通文件请求的情况下不行。 请帮我。 谢谢

Axios 将根据文档单独接受代理对象

你能试试吗:https://github.com/axios/axios/blob/ee151a7356ec4498af045dd830312822637890c9/README.md?plain=1#L446

例如(代码):

const client = axios.create({
    baseURL: fileUrl,
    responseType: 'stream',
    httpsAgent: proxy_agent,
    httpAgent: proxy_agent
  },
proxy: {
    protocol: '<protocol>',
    host: '<host>',
    port: <port as number>,
    auth: {
      username: '<uname>',
      password: '<psdw>'
    }
  }
);

我不明白为什么这会解决问题,但无论如何我已经通过在初始化代理选项中将“socks5”替换为“socks”来解决问题。

所以我首先使用的是下面;

/* initialize proxy configuration */
const proxy_host = "127.0.0.1", proxy_port = 1080;
const proxy_options = `socks5://${proxy_host}:${proxy_port}`;
const proxy_agent = new SocksProxyAgent(proxy_options);

这曾经导致连接超时错误,但是当我将 socks5 更改为 socks 时,它起作用了。

原来的袜子(socks4)和现代的socks5有明显的区别,一定要声明清楚,不是吗? 我不知道为什么 npm socks-proxy-agent 的开发者没有公布这个问题,好奇怪。 在使用带有 curl 命令的 socks 代理时,我们仍然需要编写正确的协议,google-chrome,等等

希望对大家使用这个npm有所帮助,注意这一点:)