如何设置节点http代理来拦截特定的request/response?

How to set up a node http proxy to intercept a particular request/response?

我正在制作一个加载网页的 nodejs pupeteer 应用程序。在该页面中,加载了许多资源。用于拦截 requets/response 的 pupeteer API 似乎不适用于所有资源,所以我想使用 http 代理。

我想在我的代理中拦截特定的 request/response。如果远程服务器发回响应,内容的第一行是单词“cat”,那么在将响应转发回客户端之前,我想 console.log 该资源 URL。该请求可以使用 https。我怎样才能实现这样的目标?

https://anyproxy.io/en/#use-anyproxy-as-an-npm-module

首先安装AnyProxy

对于 Debian / Ubuntu 用户,首先执行:

sudo apt-get install nodejs-legacy

然后安装AnyProxy:

npm install -g anyproxy

您需要编写一个规则来拦截以 cat 和 console.log 开头的响应。所以也许是这样的:

// file: sample.js
module.exports = {
  summary: 'a rule to log responses starting with cat',
  *beforeSendResponse(requestDetail, responseDetail) {
    if responseDetail.body.startsWith("cat "){
         console.log(responseDetail.body);
    }
  },
};

AnyProxy默认不拦截https请求。要查看解密信息,您必须配置 CA 证书。

anyproxy-ca #generate root CA. manually trust it after that.
anyproxy --intercept --rule sample.js #launch anyproxy and intercept all https traffic, and use sample.js rule

根据您的设置,您可能需要进行其他配置,但是一旦设置好,编写用于拦截响应的规则似乎很简单。

https://anyproxy.io/en/#use-anyproxy-as-an-npm-module

如果没有安装node,先安装,再安装AnyProxy npm install -g anyproxy

编写一个规则来拦截以 cat 开头的响应。它可能是这样的:

// file: sample.js
module.exports = {
  summary: 'a rule to log responses starting with cat',
  *beforeSendResponse(requestDetail, responseDetail) {
    if responseDetail.body.startsWith("cat "){
         console.log(responseDetail.body);
    }
  },
};

同样,AnyProxy 也支持 beforeSendRequest 方法来拦截请求。