最近作反垃圾QQ群机器人的时候用到了socket.io-client,发现socket.io和之前用过的直接走ws
协议的链接方式有些不一样,所以有点关心socket.io底层是怎么实现的,这时候就须要对nodejs的websocket抓包了,这里记录一下研究心得。javascript
由于不是浏览器抓包,而是node.js脚本程序抓包,所以须要在javascript代码中作一些修改,从而让socket.io客户端启用代理java
// const ProxyAgent = require('https-proxy-agent') const ProxyAgent = require('proxy-agent') const opts = { transports: ['websocket'], reconnect:true, // secure: true, // rejectUnauthorized:false, // agent: new ProxyAgent('http://localhost:8888') agent:new ProxyAgent('http://localhost:8888') }
上面代码用于抓ws,若是是wss,则须要把注释打开,即换成https-proxy-agentnode
Fiddler默认不显示WebSocket流量,可是已经内置了相关功能,具体能够参考这篇文章
简单总结下流程以下:git
Rules -> Customize Rules
,打开Fiddler脚本编辑器在Handlers类中添加一个静态方法OnWebSocketMessage
,代码以下,而后保存github
static function OnWebSocketMessage(oMsg: WebSocketMessage) { // Log Message to the LOG tab FiddlerApplication.Log.LogString(oMsg.ToString()); }
能够看到咱们的socket.io请求已经被抓到了,原来是在代码中传入的接入点地址后面添加了/socket.io/?EIO=3&transport=websocket
,进一步想看到websocket中传输的每一帧数据则能够双击这条请求记录,右面就会自动打开WebSocket面板,里面是Frame数据,左面的上下箭头表示数据的流向,是从C到S仍是从S到C,右下方则是完整数据。
见图:web