参考
- QQ群 - Javascript高级爬虫 - 作者自建群,欢迎加入!
- awesome-java-crawler - 作者收集的爬虫相关工具和资料
- 反垃圾QQ群机器人 - 可作为socket.io-client的例程参考
前言
最近做反垃圾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,右下方则是完整数据。
见图:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。