参考

前言

最近做反垃圾QQ群机器人的时候用到了socket.io-client,发现socket.io和以前用过的直接走ws协议的连接方式有些不同,因此有点关心socket.io底层是怎么实现的,这时候就需要对nodejs的websocket抓包了,这里记录一下研究心得。

node.js端设置

因为不是浏览器抓包,而是node.js脚本程序抓包,因此需要在javascript代码中做一些修改,从而让socket.io客户端启用代理

// 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-agent

Fiddler端设置

Fiddler默认不显示WebSocket流量,但是已经内置了相关功能,具体可以参考这篇文章
简单总结下流程如下:

  • 菜单Rules -> Customize Rules,打开Fiddler脚本编辑器
  • 在Handlers类中添加一个静态方法OnWebSocketMessage,代码如下,然后保存

    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,右下方则是完整数据。
见图:
ws.png


rockswang
1.4k 声望154 粉丝

To play is Human